Visual Studio idl's support functions pointers within struct's.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- tools/widl/parser.y | 5 ++--- tools/widl/typegen.c | 12 ++++++++++++ tools/widl/typegen.h | 1 + 3 files changed, 15 insertions(+), 3 deletions(-)
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..c2f1ca9359 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: @@ -598,6 +599,7 @@ unsigned char get_struct_fc(const type_t *type) case TGT_INVALID: case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: + case TGT_FUNCTION_POINTER: /* checking after parsing should mean that we don't get here. if we do, * it's a checker bug */ assert(0); @@ -690,6 +692,7 @@ static unsigned char get_array_fc(const type_t *type) break; case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: + case TGT_FUNCTION_POINTER: case TGT_STRING: case TGT_INVALID: case TGT_ARRAY: @@ -743,6 +746,7 @@ static int type_has_pointers(const type_t *type) case TGT_CTXT_HANDLE_POINTER: case TGT_STRING: case TGT_IFACE_POINTER: + case TGT_FUNCTION_POINTER: case TGT_BASIC: case TGT_ENUM: case TGT_RANGE: @@ -795,6 +799,7 @@ static int type_has_full_pointer(const type_t *type, const attr_list_t *attrs, } case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: + case TGT_FUNCTION_POINTER: case TGT_STRING: case TGT_IFACE_POINTER: case TGT_BASIC: @@ -1037,6 +1042,7 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned case TGT_CTXT_HANDLE: buffer_size = 20; break; + case TGT_FUNCTION_POINTER: case TGT_POINTER: if (get_pointer_fc( var->declspec.type, var->attrs, !is_return ) == FC_RP) { @@ -1083,6 +1089,7 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned case TGT_POINTER: case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: + case TGT_FUNCTION_POINTER: *flags |= MustFree; server_size = pointer_size; break; @@ -3635,6 +3642,7 @@ static unsigned int write_type_tfs(FILE *file, const attr_list_t *attrs, return write_union_tfs(file, attrs, type, typeformat_offset); case TGT_ENUM: case TGT_BASIC: + case TGT_FUNCTION_POINTER: /* nothing to do */ return 0; case TGT_RANGE: @@ -4176,6 +4184,7 @@ void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char *local case TGT_USER_TYPE: case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: + case TGT_FUNCTION_POINTER: case TGT_STRING: case TGT_BASIC: case TGT_ENUM: @@ -4435,6 +4444,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const phase, var, start_offset); break; } + case TGT_FUNCTION_POINTER: case TGT_POINTER: { const type_t *ref = type_pointer_get_ref_type(type); @@ -4526,6 +4536,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const case TGT_IFACE_POINTER: case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: + case TGT_FUNCTION_POINTER: print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var, start_offset); break; case TGT_INVALID: @@ -4762,6 +4773,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char break; case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: + case TGT_FUNCTION_POINTER: case TGT_INVALID: case TGT_STRING: /* not initialised */ 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 *);