Module: wine Branch: refs/heads/master Commit: 3e065ab342019a934131705bb4988b13f22b1563 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3e065ab342019a934131705b...
Author: Robert Shearman rob@codeweavers.com Date: Fri Mar 31 12:48:24 2006 +0100
widl: Move handling of base type marshaling and unmarshaling to a separate function.
Move handling of base type marshaling and unmarshaling to a separate function and improve it to support return values.
---
tools/widl/typegen.c | 228 ++++++++++++++++++++------------------------------ 1 files changed, 92 insertions(+), 136 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index 786217f..ed47c04 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -1433,6 +1433,96 @@ static void print_phase_function(FILE *f indent--; }
+void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase, + enum pass pass, const var_t *var, + const char *varname) +{ + const type_t *type = var->type; + unsigned int size; + unsigned int alignment = 0; + + /* no work to do for other phases, buffer sizing is done elsewhere */ + if (phase != PHASE_MARSHAL && phase != PHASE_UNMARSHAL) + return; + + while (type_has_ref(type)) + type = type->ref; + + switch (type->type) + { + case RPC_FC_BYTE: + case RPC_FC_CHAR: + case RPC_FC_SMALL: + case RPC_FC_USMALL: + size = 1; + alignment = 1; + break; + + case RPC_FC_WCHAR: + case RPC_FC_USHORT: + case RPC_FC_SHORT: + size = 2; + alignment = 2; + break; + + case RPC_FC_ULONG: + case RPC_FC_LONG: + case RPC_FC_FLOAT: + case RPC_FC_ERROR_STATUS_T: + size = 4; + alignment = 4; + break; + + case RPC_FC_HYPER: + case RPC_FC_DOUBLE: + size = 8; + alignment = 8; + break; + + case RPC_FC_IGNORE: + case RPC_FC_BIND_PRIMITIVE: + /* no marshalling needed */ + return; + + default: + error("print_phase_basetype: Unsupported type: %s (0x%02x, ptr_level: 0)\n", var->name, type->type); + size = 0; + } + + print_file(file, indent, "_StubMsg.Buffer = (unsigned char *)(((long)_StubMsg.Buffer + %u) & ~0x%x);\n", + alignment - 1, alignment - 1); + + if (phase == PHASE_MARSHAL) + { + print_file(file, indent, "*("); + write_type(file, var->type, NULL, var->tname); + if (var->ptr_level) + fprintf(file, " *)_StubMsg.Buffer = *"); + else + fprintf(file, " *)_StubMsg.Buffer = "); + fprintf(file, varname); + fprintf(file, ";\n"); + } + else if (phase == PHASE_UNMARSHAL) + { + if (pass == PASS_IN || pass == PASS_RETURN) + print_file(file, indent, ""); + else + print_file(file, indent, "*"); + fprintf(file, varname); + if (pass == PASS_IN && var->ptr_level) + fprintf(file, " = ("); + else + fprintf(file, " = *("); + write_type(file, var->type, NULL, var->tname); + fprintf(file, " *)_StubMsg.Buffer;\n"); + } + + print_file(file, indent, "_StubMsg.Buffer += sizeof("); + write_type(file, var->type, NULL, var->tname); + fprintf(file, ");\n"); +} + /* returns whether the MaxCount, Offset or ActualCount members need to be * filled in for the specified phase */ static inline int is_size_needed_for_phase(enum remoting_phase phase) @@ -1559,77 +1649,7 @@ void write_remoting_arguments(FILE *file } else if (var->ptr_level == 0 && is_base_type(type->type)) { - unsigned int size; - unsigned int alignment = 0; - switch (type->type) - { - case RPC_FC_BYTE: - case RPC_FC_CHAR: - case RPC_FC_SMALL: - case RPC_FC_USMALL: - size = 1; - alignment = 1; - break; - - case RPC_FC_WCHAR: - case RPC_FC_USHORT: - case RPC_FC_SHORT: - size = 2; - alignment = 2; - break; - - case RPC_FC_ULONG: - case RPC_FC_LONG: - case RPC_FC_FLOAT: - case RPC_FC_ERROR_STATUS_T: - size = 4; - alignment = 4; - break; - - case RPC_FC_HYPER: - case RPC_FC_DOUBLE: - size = 8; - alignment = 8; - break; - - case RPC_FC_IGNORE: - case RPC_FC_BIND_PRIMITIVE: - /* no marshalling needed */ - continue; - - default: - error("write_remoting_arguments: Unsupported type: %s (0x%02x, ptr_level: 0)\n", var->name, type->type); - size = 0; - } - - if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL) - { - print_file(file, indent, "_StubMsg.Buffer = (unsigned char *)(((long)_StubMsg.Buffer + %u) & ~0x%x);\n", - alignment - 1, alignment - 1); - - if (phase == PHASE_MARSHAL) - { - print_file(file, indent, "*("); - write_type(file, var->type, var, var->tname); - fprintf(file, " *)_StubMsg.Buffer = "); - write_name(file, var); - fprintf(file, ";\n"); - } - else if (phase == PHASE_UNMARSHAL) - { - print_file(file, indent, ""); - write_name(file, var); - fprintf(file, " = *("); - write_type(file, var->type, var, var->tname); - fprintf(file, " *)_StubMsg.Buffer;\n"); - } - else - error("write_remoting_arguments: Unimplemented for base types for phase %d\n", phase); - - print_file(file, indent, "_StubMsg.Buffer += sizeof("); - write_type(file, var->type, var, var->tname); - fprintf(file, ");\n"); - } + print_phase_basetype(file, indent, phase, pass, var, var->name); } else if (var->ptr_level == 0) { @@ -1662,71 +1682,7 @@ void write_remoting_arguments(FILE *file { if ((var->ptr_level == 1) && (pointer_type == RPC_FC_RP) && is_base_type(type->type)) { - unsigned int size; - switch (type->type) - { - case RPC_FC_BYTE: - case RPC_FC_CHAR: - case RPC_FC_SMALL: - case RPC_FC_USMALL: - size = 1; - break; - - case RPC_FC_WCHAR: - case RPC_FC_USHORT: - case RPC_FC_SHORT: - size = 2; - break; - - case RPC_FC_ULONG: - case RPC_FC_LONG: - case RPC_FC_FLOAT: - case RPC_FC_ERROR_STATUS_T: - size = 4; - break; - - case RPC_FC_HYPER: - case RPC_FC_DOUBLE: - size = 8; - break; - - case RPC_FC_IGNORE: - case RPC_FC_BIND_PRIMITIVE: - /* no marshalling needed */ - continue; - - default: - error("write_remoting_arguments: Unsupported type: %s (0x%02x, ptr_level: 1)\n", var->name, type->type); - size = 0; - } - - if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL) - { - print_file(file, indent, - "_StubMsg.Buffer = (unsigned char *)(((long)_StubMsg.Buffer + %u) & ~0x%x);\n", - size - 1, size - 1); - - if (phase == PHASE_MARSHAL) - { - print_file(file, indent, "*("); - write_type(file, var->type, NULL, var->tname); - fprintf(file, " *)_StubMsg.Buffer = *"); - write_name(file, var); - fprintf(file, ";\n"); - } - else if (phase == PHASE_UNMARSHAL) - { - print_file(file, indent, (pass == PASS_IN) ? "" : "*"); - write_name(file, var); - fprintf(file, (pass == PASS_IN) ? " = (" : " = *("); - write_type(file, var->type, NULL, var->tname); - fprintf(file, " *)_StubMsg.Buffer;\n"); - } - - print_file(file, indent, "_StubMsg.Buffer += sizeof("); - write_type(file, var->type, NULL, var->tname); - fprintf(file, ");\n"); - } + print_phase_basetype(file, indent, phase, pass, var, var->name); } else {