widl: Pass variables around instead of types for function parameters.

This commit is contained in:
Alexandre Julliard 2011-09-19 11:54:42 +02:00
parent c31948a775
commit e2a92702ed
1 changed files with 49 additions and 57 deletions

View File

@ -413,12 +413,12 @@ static int get_padding(const var_list_t *fields)
return ROUNDING(offset, salign);
}
static unsigned int get_stack_size( const type_t *type, const attr_list_t *attrs, int *by_value )
static unsigned int get_stack_size( const var_t *var, int *by_value )
{
unsigned int stack_size;
int by_val;
switch (typegen_detect_type( type, attrs, TDT_ALL_TYPES ))
switch (typegen_detect_type( var->type, var->attrs, TDT_ALL_TYPES ))
{
case TGT_BASIC:
case TGT_ENUM:
@ -426,7 +426,7 @@ static unsigned int get_stack_size( const type_t *type, const attr_list_t *attrs
case TGT_STRUCT:
case TGT_UNION:
case TGT_USER_TYPE:
stack_size = type_memsize( type );
stack_size = type_memsize( var->type );
by_val = (pointer_size < 8 || stack_size <= pointer_size); /* FIXME: should be platform-specific */
break;
default:
@ -952,35 +952,34 @@ int decl_indirect(const type_t *t)
type_get_type(t) != TYPE_ARRAY);
}
static unsigned char get_parameter_fc( const type_t *type, const attr_list_t *attrs, int is_return,
unsigned short *flags, unsigned int *stack_size,
unsigned int *typestring_offset )
static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned short *flags,
unsigned int *stack_size, unsigned int *typestring_offset )
{
unsigned int alignment, server_size = 0, buffer_size = 0;
unsigned char fc = 0;
int is_byval;
int is_in = is_attr(attrs, ATTR_IN);
int is_out = is_attr(attrs, ATTR_OUT);
int is_in = is_attr(var->attrs, ATTR_IN);
int is_out = is_attr(var->attrs, ATTR_OUT);
if (is_return) is_out = TRUE;
else if (!is_in && !is_out) is_in = TRUE;
*flags = 0;
*stack_size = get_stack_size( type, attrs, &is_byval );
*typestring_offset = type->typestring_offset;
*stack_size = get_stack_size( var, &is_byval );
*typestring_offset = var->type->typestring_offset;
if (is_in) *flags |= IsIn;
if (is_out) *flags |= IsOut;
if (is_return) *flags |= IsReturn;
if (!is_string_type( attrs, type ))
buffer_size = get_required_buffer_size_type( type, NULL, attrs, TRUE, &alignment );
if (!is_string_type( var->attrs, var->type ))
buffer_size = get_required_buffer_size_type( var->type, NULL, var->attrs, TRUE, &alignment );
switch (typegen_detect_type( type, attrs, TDT_ALL_TYPES ))
switch (typegen_detect_type( var->type, var->attrs, TDT_ALL_TYPES ))
{
case TGT_BASIC:
*flags |= IsBasetype;
fc = get_basic_fc_signed( type );
fc = get_basic_fc_signed( var->type );
if (fc == RPC_FC_BIND_PRIMITIVE)
{
buffer_size = 4; /* actually 0 but avoids setting MustSize */
@ -989,7 +988,7 @@ static unsigned char get_parameter_fc( const type_t *type, const attr_list_t *at
break;
case TGT_ENUM:
*flags |= IsBasetype;
fc = get_enum_fc( type );
fc = get_enum_fc( var->type );
break;
case TGT_RANGE:
*flags |= IsByValue;
@ -1004,16 +1003,16 @@ static unsigned char get_parameter_fc( const type_t *type, const attr_list_t *at
break;
case TGT_ARRAY:
*flags |= MustFree;
if (type_array_is_decl_as_ptr(type) && type->details.array.ptr_tfsoff &&
get_pointer_fc( type, attrs, !is_return ) == RPC_FC_RP)
if (type_array_is_decl_as_ptr(var->type) && var->type->details.array.ptr_tfsoff &&
get_pointer_fc( var->type, var->attrs, !is_return ) == RPC_FC_RP)
*flags |= IsSimpleRef;
break;
case TGT_STRING:
*flags |= MustFree;
if (is_declptr( type ) && get_pointer_fc( type, attrs, !is_return ) == RPC_FC_RP)
if (is_declptr( var->type ) && get_pointer_fc( var->type, var->attrs, !is_return ) == RPC_FC_RP)
{
/* skip over pointer description straight to string description */
if (is_conformant_array( type )) *typestring_offset += 4;
if (is_conformant_array( var->type )) *typestring_offset += 4;
else *typestring_offset += 2;
*flags |= IsSimpleRef;
}
@ -1026,11 +1025,11 @@ static unsigned char get_parameter_fc( const type_t *type, const attr_list_t *at
buffer_size = 20;
break;
case TGT_POINTER:
if (get_pointer_fc( type, attrs, !is_return ) == RPC_FC_RP)
if (get_pointer_fc( var->type, var->attrs, !is_return ) == RPC_FC_RP)
{
const type_t *ref = type_pointer_get_ref( type );
const type_t *ref = type_pointer_get_ref( var->type );
if (!is_string_type( attrs, ref ))
if (!is_string_type( var->attrs, ref ))
buffer_size = get_required_buffer_size_type( ref, NULL, NULL, TRUE, &alignment );
switch (typegen_detect_type( ref, NULL, TDT_ALL_TYPES ))
@ -1111,14 +1110,14 @@ static unsigned char get_func_oi2_flags( const var_t *func )
{
const var_t *var;
var_list_t *args = type_get_function_args( func->type );
type_t *ret_type = type_function_get_rettype( func->type );
var_t *retval = type_function_get_retval( func->type );
unsigned char oi2_flags = 0x40; /* HasExtensions */
unsigned short flags;
unsigned int stack_size, typestring_offset;
if (args) LIST_FOR_EACH_ENTRY( var, args, const var_t, entry )
{
get_parameter_fc( var->type, var->attrs, 0, &flags, &stack_size, &typestring_offset );
get_parameter_fc( var, 0, &flags, &stack_size, &typestring_offset );
if (flags & MustSize)
{
if (flags & IsIn) oi2_flags |= 0x02; /* ClientMustSize */
@ -1126,24 +1125,22 @@ static unsigned char get_func_oi2_flags( const var_t *func )
}
}
if (!is_void( ret_type ))
if (!is_void( retval->type ))
{
oi2_flags |= 0x04; /* HasRet */
get_parameter_fc( ret_type, NULL, 1, &flags, &stack_size, &typestring_offset );
get_parameter_fc( retval, 1, &flags, &stack_size, &typestring_offset );
if (flags & MustSize) oi2_flags |= 0x01; /* ServerMustSize */
}
return oi2_flags;
}
static unsigned int write_new_procformatstring_type(FILE *file, int indent,
const type_t *type,
const attr_list_t *attrs,
static unsigned int write_new_procformatstring_type(FILE *file, int indent, const var_t *var,
int is_return, unsigned int *stack_offset)
{
char buffer[64];
unsigned int stack_size, typestring_offset;
unsigned short flags;
unsigned char fc = get_parameter_fc( type, attrs, is_return, &flags, &stack_size, &typestring_offset );
unsigned char fc = get_parameter_fc( var, is_return, &flags, &stack_size, &typestring_offset );
strcpy( buffer, "/* flags:" );
if (flags & MustSize) strcat( buffer, " must size," );
@ -1172,20 +1169,18 @@ static unsigned int write_new_procformatstring_type(FILE *file, int indent,
return 6;
}
static unsigned int write_old_procformatstring_type(FILE *file, int indent,
const type_t *type,
const attr_list_t *attrs,
static unsigned int write_old_procformatstring_type(FILE *file, int indent, const var_t *var,
int is_return, int is_interpreted)
{
unsigned int size;
int is_in = is_attr(attrs, ATTR_IN);
int is_out = is_attr(attrs, ATTR_OUT);
int is_in = is_attr(var->attrs, ATTR_IN);
int is_out = is_attr(var->attrs, ATTR_OUT);
if (!is_in && !is_out) is_in = TRUE;
if (type_get_type(type) == TYPE_BASIC ||
type_get_type(type) == TYPE_ENUM)
if (type_get_type(var->type) == TYPE_BASIC ||
type_get_type(var->type) == TYPE_ENUM)
{
unsigned char fc;
@ -1194,13 +1189,13 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent,
else
print_file(file, indent, "0x4e, /* FC_IN_PARAM_BASETYPE */\n");
if (type_get_type(type) == TYPE_ENUM)
if (type_get_type(var->type) == TYPE_ENUM)
{
fc = get_enum_fc(type);
fc = get_enum_fc(var->type);
}
else
{
fc = get_basic_fc_signed(type);
fc = get_basic_fc_signed(var->type);
if (fc == RPC_FC_BIND_PRIMITIVE)
fc = RPC_FC_IGNORE;
@ -1212,12 +1207,12 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent,
}
else
{
unsigned short offset = type->typestring_offset;
unsigned short offset = var->type->typestring_offset;
if (is_interpreted && is_array(type) &&
type_array_is_decl_as_ptr(type) &&
type->details.array.ptr_tfsoff)
offset = type->details.array.ptr_tfsoff;
if (is_interpreted && is_array(var->type) &&
type_array_is_decl_as_ptr(var->type) &&
var->type->details.array.ptr_tfsoff)
offset = var->type->details.array.ptr_tfsoff;
if (is_return)
print_file(file, indent, "0x52, /* FC_RETURN_PARAM */\n");
@ -1228,7 +1223,7 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent,
else
print_file(file, indent, "0x4d, /* FC_IN_PARAM */\n");
size = get_stack_size( type, attrs, NULL );
size = get_stack_size( var, NULL );
print_file(file, indent, "0x%02x,\n", size / pointer_size );
print_file(file, indent, "NdrFcShort(0x%x), /* type offset = %u */\n", offset, offset);
size = 4; /* includes param type prefix */
@ -1318,7 +1313,7 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
handle_stack_offset = stack_size;
handle_param_num = param_num;
}
stack_size += get_stack_size( var->type, var->attrs, NULL );
stack_size += get_stack_size( var, NULL );
param_num++;
nb_args++;
}
@ -1425,6 +1420,7 @@ static void write_procformatstring_func( FILE *file, int indent, const type_t *i
unsigned int stack_offset = is_object( iface ) ? pointer_size : 0;
int is_interpreted = is_interpreted_func( iface, func );
int is_new_style = is_interpreted && (get_stub_mode() == MODE_Oif);
var_t *retval = type_function_get_retval( func->type );
if (is_interpreted) write_proc_func_header( file, indent, iface, func, offset, num_proc );
@ -1436,16 +1432,14 @@ static void write_procformatstring_func( FILE *file, int indent, const type_t *i
{
print_file( file, 0, "/* %u (parameter %s) */\n", *offset, var->name );
if (is_new_style)
*offset += write_new_procformatstring_type(file, indent, var->type, var->attrs,
FALSE, &stack_offset);
*offset += write_new_procformatstring_type(file, indent, var, FALSE, &stack_offset);
else
*offset += write_old_procformatstring_type(file, indent, var->type, var->attrs,
FALSE, is_interpreted);
*offset += write_old_procformatstring_type(file, indent, var, FALSE, is_interpreted);
}
}
/* emit return value data */
if (is_void(type_function_get_rettype(func->type)))
if (is_void(retval->type))
{
if (!is_new_style)
{
@ -1459,11 +1453,9 @@ static void write_procformatstring_func( FILE *file, int indent, const type_t *i
{
print_file( file, 0, "/* %u (return value) */\n", *offset );
if (is_new_style)
*offset += write_new_procformatstring_type(file, indent, type_function_get_rettype(func->type),
NULL, TRUE, &stack_offset);
*offset += write_new_procformatstring_type(file, indent, retval, TRUE, &stack_offset);
else
*offset += write_old_procformatstring_type(file, indent, type_function_get_rettype(func->type),
NULL, TRUE, is_interpreted);
*offset += write_old_procformatstring_type(file, indent, retval, TRUE, is_interpreted);
}
}
@ -1659,7 +1651,7 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
correlation_variable = var->type;
break;
}
offset += get_stack_size( var->type, var->attrs, NULL );
offset += get_stack_size( var, NULL );
}
}
else