Robert Shearman : widl:
Move handling of base type marshaling and unmarshaling to a separate
function .
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Mar 31 13:04:58 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 3e065ab342019a934131705bb4988b13f22b1563
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3e065ab342019a934131705bb4988b13f22b1563
Author: Robert Shearman <rob at 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
{
More information about the wine-cvs
mailing list