Visual Studio idl's support functions pointers within struct's.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- include/xact3.idl | 6 +++--- tools/widl/parser.y | 5 ++--- tools/widl/typegen.c | 1 + tools/widl/typegen.h | 1 + 4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/include/xact3.idl b/include/xact3.idl index 85b18d0b9f..252478b83e 100644 --- a/include/xact3.idl +++ b/include/xact3.idl @@ -70,8 +70,8 @@ typedef BOOL (__stdcall *XACT_GETOVERLAPPEDRESULT_CALLBACK)( ); typedef struct XACT_FILEIO_CALLBACKS { - BYTE* readFileCallback; /* FIXME: XACT_READFILE_CALLBACK */ - BYTE* getOverlappedResultCallback; /* FIXME: XACT_GETOVERLAPPEDRESULT_CALLBACK */ + XACT_READFILE_CALLBACK readFileCallback; + XACT_GETOVERLAPPEDRESULT_CALLBACK getOverlappedResultCallback; } XACT_FILEIO_CALLBACKS;
typedef struct XACT_NOTIFICATION XACT_NOTIFICATION; @@ -87,7 +87,7 @@ typedef struct XACT_RUNTIME_PARAMETERS DWORD globalSettingsFlags; DWORD globalSettingsAllocAttributes; XACT_FILEIO_CALLBACKS fileIOCallbacks; - BYTE* fnNotificationCallback; /* FIXME: XACT_NOTIFICATION_CALLBACK */ + XACT_NOTIFICATION_CALLBACK fnNotificationCallback; LPCWSTR pRendererID; IXAudio2 *pXAudio2; IXAudio2MasteringVoice *pMasteringVoice; diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 5f6eb50878..090fb00339 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -2521,9 +2521,6 @@ static void check_field_common(const type_t *container_type, case TYPE_VOID: reason = "cannot derive from void *"; break; - case TYPE_FUNCTION: - reason = "cannot be a function pointer"; - break; case TYPE_BITFIELD: reason = "cannot be a bit-field"; break; @@ -2575,6 +2572,7 @@ static void check_field_common(const type_t *container_type, error_loc_info(&arg->loc_info, "undefined type declaration "enum %s"\n", type->name); } case TGT_USER_TYPE: + case TGT_FUNCTION_POINTER: case TGT_IFACE_POINTER: case TGT_BASIC: case TGT_RANGE: @@ -2659,6 +2657,7 @@ static void check_remoting_args(const var_t *func) case TGT_INVALID: /* already error'd before we get here */ case TGT_CTXT_HANDLE_POINTER: + case TGT_FUNCTION_POINTER: case TGT_POINTER: case TGT_ARRAY: /* OK */ diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index 9b8aa1a322..ce3b1207c6 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -367,6 +367,7 @@ enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *att case TYPE_ARRAY: return TGT_ARRAY; case TYPE_FUNCTION: + return TGT_FUNCTION_POINTER; case TYPE_COCLASS: case TYPE_INTERFACE: case TYPE_MODULE: diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h index 95ad601768..c388e62434 100644 --- a/tools/widl/typegen.h +++ b/tools/widl/typegen.h @@ -58,6 +58,7 @@ enum typegen_type TGT_STRUCT, TGT_UNION, TGT_RANGE, + TGT_FUNCTION_POINTER, };
typedef int (*type_pred_t)(const type_t *);