widl: Fix marshalling/unmarshalling of enum arguments.
The generated code should use NdrSimpleType{Marshall,Unmarshall} instead of direct buffer access, since the memory size isn't always equal to the size on the wire and extra checks.
This commit is contained in:
parent
32c3cf1db7
commit
47c82ac472
|
@ -3071,7 +3071,6 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
|
||||||
{
|
{
|
||||||
int in_attr, out_attr, pointer_type;
|
int in_attr, out_attr, pointer_type;
|
||||||
const type_t *type = var->type;
|
const type_t *type = var->type;
|
||||||
unsigned char rtype;
|
|
||||||
unsigned int start_offset = type->typestring_offset;
|
unsigned int start_offset = type->typestring_offset;
|
||||||
|
|
||||||
pointer_type = get_attrv(var->attrs, ATTR_POINTERTYPE);
|
pointer_type = get_attrv(var->attrs, ATTR_POINTERTYPE);
|
||||||
|
@ -3097,7 +3096,6 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
|
||||||
}
|
}
|
||||||
|
|
||||||
write_parameter_conf_or_var_exprs(file, indent, local_var_prefix, phase, var);
|
write_parameter_conf_or_var_exprs(file, indent, local_var_prefix, phase, var);
|
||||||
rtype = get_struct_type(type);
|
|
||||||
|
|
||||||
if (is_context_handle(type))
|
if (is_context_handle(type))
|
||||||
{
|
{
|
||||||
|
@ -3204,14 +3202,29 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!is_ptr(var->type) && is_base_type(rtype))
|
else if (is_base_type(type->type))
|
||||||
{
|
{
|
||||||
if (phase != PHASE_FREE)
|
if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL)
|
||||||
print_phase_basetype(file, indent, local_var_prefix, phase, pass, var, var->name);
|
{
|
||||||
|
if (type->type == RPC_FC_ENUM16 || type->type == RPC_FC_ENUM32)
|
||||||
|
{
|
||||||
|
if (phase == PHASE_MARSHAL)
|
||||||
|
print_file(file, indent, "NdrSimpleTypeMarshall(\n");
|
||||||
|
else
|
||||||
|
print_file(file, indent, "NdrSimpleTypeUnmarshall(\n");
|
||||||
|
print_file(file, indent+1, "&__frame->_StubMsg,\n");
|
||||||
|
print_file(file, indent+1, "(unsigned char *)&%s%s,\n",
|
||||||
|
local_var_prefix,
|
||||||
|
var->name);
|
||||||
|
print_file(file, indent+1, "0x%02x /* %s */);\n", type->type, string_of_type(type->type));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print_phase_basetype(file, indent, local_var_prefix, phase, pass, var, var->name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (!is_ptr(var->type))
|
else if (is_struct(type->type))
|
||||||
{
|
{
|
||||||
switch (rtype)
|
switch (get_struct_type(type))
|
||||||
{
|
{
|
||||||
case RPC_FC_STRUCT:
|
case RPC_FC_STRUCT:
|
||||||
case RPC_FC_PSTRUCT:
|
case RPC_FC_PSTRUCT:
|
||||||
|
@ -3228,7 +3241,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
|
||||||
print_phase_function(file, indent, "ComplexStruct", local_var_prefix, phase, var, start_offset);
|
print_phase_function(file, indent, "ComplexStruct", local_var_prefix, phase, var, start_offset);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("write_remoting_arguments: Unsupported type: %s (0x%02x)\n", var->name, rtype);
|
error("write_remoting_arguments: Unsupported type: %s (0x%02x)\n", var->name, get_struct_type(type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3236,13 +3249,21 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
|
||||||
const type_t *ref = type_pointer_get_ref(type);
|
const type_t *ref = type_pointer_get_ref(type);
|
||||||
if (type->type == RPC_FC_RP && is_base_type(ref->type))
|
if (type->type == RPC_FC_RP && is_base_type(ref->type))
|
||||||
{
|
{
|
||||||
if (phase != PHASE_FREE)
|
/* base types have known sizes, so don't need a sizing pass
|
||||||
print_phase_basetype(file, indent, local_var_prefix, phase, pass, var, var->name);
|
* and don't have any memory to free and so don't need a
|
||||||
|
* freeing pass */
|
||||||
|
if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL)
|
||||||
|
{
|
||||||
|
if (ref->type == RPC_FC_ENUM16 || ref->type == RPC_FC_ENUM32)
|
||||||
|
print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var, start_offset);
|
||||||
|
else
|
||||||
|
print_phase_basetype(file, indent, local_var_prefix, phase, pass, var, var->name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (type->type == RPC_FC_RP && get_struct_type(ref) == RPC_FC_STRUCT &&
|
else if (type->type == RPC_FC_RP && get_struct_type(ref) == RPC_FC_STRUCT &&
|
||||||
!is_user_type(ref))
|
!is_user_type(ref))
|
||||||
{
|
{
|
||||||
if (phase != PHASE_BUFFERSIZE && phase != PHASE_FREE)
|
if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL)
|
||||||
print_phase_function(file, indent, "SimpleStruct",
|
print_phase_function(file, indent, "SimpleStruct",
|
||||||
local_var_prefix, phase, var,
|
local_var_prefix, phase, var,
|
||||||
ref->typestring_offset);
|
ref->typestring_offset);
|
||||||
|
|
Loading…
Reference in New Issue