Alexandre Julliard : widl: Call marshalling routines directly also for user-marshalled types accessed through a ref pointer .
Alexandre Julliard
julliard at winehq.org
Wed May 25 11:28:12 CDT 2011
Module: wine
Branch: master
Commit: 2099d9400188b320a6ae7bb1a69a14912fe4456b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2099d9400188b320a6ae7bb1a69a14912fe4456b
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue May 24 23:10:48 2011 +0200
widl: Call marshalling routines directly also for user-marshalled types accessed through a ref pointer.
---
tools/widl/typegen.c | 42 +++++++++++++++++++++++-------------------
1 files changed, 23 insertions(+), 19 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 324211e..687bf53 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -3536,6 +3536,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
enum pass pass, enum remoting_phase phase, const var_t *var)
{
int in_attr, out_attr, pointer_type;
+ const char *type_str = NULL;
const type_t *type = var->type;
unsigned int alignment, start_offset = type->typestring_offset;
@@ -3785,8 +3786,6 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var, start_offset);
break;
case TGT_STRUCT:
- {
- const char *struct_type = NULL;
switch (get_struct_fc(ref))
{
case RPC_FC_STRUCT:
@@ -3794,7 +3793,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
* pass and don't have any memory to free and so don't
* need a freeing pass */
if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL)
- struct_type = "SimpleStruct";
+ type_str = "SimpleStruct";
else if (phase == PHASE_FREE && pass == PASS_RETURN)
{
print_file(file, indent, "if (%s%s)\n", local_var_prefix, var->name);
@@ -3804,57 +3803,62 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
}
break;
case RPC_FC_PSTRUCT:
- struct_type = "SimpleStruct";
+ type_str = "SimpleStruct";
break;
case RPC_FC_CSTRUCT:
case RPC_FC_CPSTRUCT:
- struct_type = "ConformantStruct";
+ type_str = "ConformantStruct";
break;
case RPC_FC_CVSTRUCT:
- struct_type = "ConformantVaryingStruct";
+ type_str = "ConformantVaryingStruct";
break;
case RPC_FC_BOGUS_STRUCT:
- struct_type = "ComplexStruct";
+ type_str = "ComplexStruct";
break;
default:
error("write_remoting_arguments: Unsupported type: %s (0x%02x)\n", var->name, get_struct_fc(ref));
}
- if (struct_type)
+ if (type_str)
{
if (phase == PHASE_FREE)
- struct_type = "Pointer";
+ type_str = "Pointer";
else
start_offset = ref->typestring_offset;
- print_phase_function(file, indent, struct_type, local_var_prefix, phase, var, start_offset);
+ print_phase_function(file, indent, type_str, local_var_prefix, phase, var, start_offset);
}
break;
- }
case TGT_UNION:
- {
- const char *union_type = NULL;
if (phase == PHASE_FREE)
- union_type = "Pointer";
+ type_str = "Pointer";
else
{
if (type_get_type(ref) == TYPE_UNION)
- union_type = "NonEncapsulatedUnion";
+ type_str = "NonEncapsulatedUnion";
else if (type_get_type(ref) == TYPE_ENCAPSULATED_UNION)
- union_type = "EncapsulatedUnion";
+ type_str = "EncapsulatedUnion";
start_offset = ref->typestring_offset;
}
- print_phase_function(file, indent, union_type, local_var_prefix,
+ print_phase_function(file, indent, type_str, local_var_prefix,
phase, var, start_offset);
break;
- }
+ case TGT_USER_TYPE:
+ if (phase != PHASE_FREE)
+ {
+ type_str = "UserMarshal";
+ start_offset = ref->typestring_offset;
+ }
+ else type_str = "Pointer";
+
+ print_phase_function(file, indent, type_str, local_var_prefix, phase, var, start_offset);
+ break;
case TGT_STRING:
case TGT_POINTER:
case TGT_ARRAY:
case TGT_RANGE:
case TGT_IFACE_POINTER:
- case TGT_USER_TYPE:
case TGT_CTXT_HANDLE:
case TGT_CTXT_HANDLE_POINTER:
print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var, start_offset);
More information about the wine-cvs
mailing list