From: Jürg Billeter Date: Fri, 26 Sep 2008 21:13:36 +0000 (+0000) Subject: Avoid code duplication for handling struct arguments X-Git-Tag: VALA_0_4_0~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9134fdf4d3fb4a2c8f4f08eb8822e0a5115e5693;p=thirdparty%2Fvala.git Avoid code duplication for handling struct arguments 2008-09-26 Jürg Billeter * gobject/valaccodegenerator.vala: * gobject/valaccodeinvocationexpressionbinding.vala: Avoid code duplication for handling struct arguments svn path=/trunk/; revision=1788 --- diff --git a/ChangeLog b/ChangeLog index 32b9cc633..bf98e651d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-09-26 Jürg Billeter + + * gobject/valaccodegenerator.vala: + * gobject/valaccodeinvocationexpressionbinding.vala: + + Avoid code duplication for handling struct arguments + 2008-09-26 Jürg Billeter * gobject/valaccodeclassbinding.vala: diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 995cb4796..cdcd65487 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -3178,26 +3178,7 @@ public class Vala.CCodeGenerator : CodeGenerator { param = params_it.get (); ellipsis = param.ellipsis; if (!param.ellipsis) { - // pass non-simple struct instances always by reference - if (param.parameter_type.data_type is Struct && !((Struct) param.parameter_type.data_type).is_simple_type ()) { - // we already use a reference for arguments of ref and out parameters - if (param.direction == ParameterDirection.IN) { - if (cexpr is CCodeIdentifier) { - cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr); - } else { - // if cexpr is e.g. a function call, we can't take the address of the expression - // (tmp = expr, &tmp) - var ccomma = new CCodeCommaExpression (); - - var temp_var = get_temp_variable (arg.value_type); - temp_vars.insert (0, temp_var); - ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), cexpr)); - ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name))); - - cexpr = ccomma; - } - } - } + cexpr = handle_struct_argument (param, arg, cexpr); } } @@ -3314,6 +3295,35 @@ public class Vala.CCodeGenerator : CodeGenerator { } } + public CCodeExpression? handle_struct_argument (FormalParameter param, Expression arg, CCodeExpression? cexpr) { + // pass non-simple struct instances always by reference + if (!(arg.value_type is NullType) && param.parameter_type.data_type is Struct && !((Struct) param.parameter_type.data_type).is_simple_type ()) { + // we already use a reference for arguments of ref, out, and nullable parameters + if (param.direction == ParameterDirection.IN && !param.parameter_type.nullable) { + var unary = cexpr as CCodeUnaryExpression; + if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) { + // *expr => expr + return unary.inner; + } else if (cexpr is CCodeIdentifier || cexpr is CCodeMemberAccess) { + return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr); + } else { + // if cexpr is e.g. a function call, we can't take the address of the expression + // (tmp = expr, &tmp) + var ccomma = new CCodeCommaExpression (); + + var temp_var = get_temp_variable (arg.value_type); + temp_vars.insert (0, temp_var); + ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), cexpr)); + ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name))); + + return ccomma; + } + } + } + + return cexpr; + } + public override void visit_sizeof_expression (SizeofExpression expr) { var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof")); csizeof.add_argument (new CCodeIdentifier (expr.type_reference.data_type.get_cname ())); diff --git a/gobject/valaccodeinvocationexpressionbinding.vala b/gobject/valaccodeinvocationexpressionbinding.vala index 744216abc..79d9ab2e9 100644 --- a/gobject/valaccodeinvocationexpressionbinding.vala +++ b/gobject/valaccodeinvocationexpressionbinding.vala @@ -208,30 +208,7 @@ public class Vala.CCodeInvocationExpressionBinding : CCodeExpressionBinding { multiple_cargs = true; } - // pass non-simple struct instances always by reference - if (!(arg.value_type is NullType) && param.parameter_type.data_type is Struct && !((Struct) param.parameter_type.data_type).is_simple_type ()) { - // we already use a reference for arguments of ref, out, and nullable parameters - if (param.direction == ParameterDirection.IN && !param.parameter_type.nullable) { - var unary = cexpr as CCodeUnaryExpression; - if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) { - // *expr => expr - cexpr = unary.inner; - } else if (cexpr is CCodeIdentifier || cexpr is CCodeMemberAccess) { - cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr); - } else { - // if cexpr is e.g. a function call, we can't take the address of the expression - // (tmp = expr, &tmp) - var ccomma = new CCodeCommaExpression (); - - var temp_var = codegen.get_temp_variable (arg.value_type); - codegen.temp_vars.insert (0, temp_var); - ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), cexpr)); - ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name))); - - cexpr = ccomma; - } - } - } + cexpr = codegen.handle_struct_argument (param, arg, cexpr); if (multiple_cargs && arg is InvocationExpression) { // if vala argument is invocation expression