From: Juerg Billeter Date: Wed, 16 Apr 2008 15:56:27 +0000 (+0000) Subject: Fix generated C code when passing structs by reference, fixes bug 528414 X-Git-Tag: VALA_0_3_1~58 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9c9819569b8e27be19ff3fa3812bbcabf6c7b863;p=platform%2Fupstream%2Fvala.git Fix generated C code when passing structs by reference, fixes bug 528414 2008-04-16 Juerg Billeter * gobject/valaccodegenerator.vala, gobject/valaccodegeneratorinvocationexpression.vala: Fix generated C code when passing structs by reference, fixes bug 528414 svn path=/trunk/; revision=1244 --- diff --git a/ChangeLog b/ChangeLog index fa0f178..b29fe31 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2008-04-16 Jürg Billeter + * gobject/valaccodegenerator.vala, + gobject/valaccodegeneratorinvocationexpression.vala: + + Fix generated C code when passing structs by reference, + fixes bug 528414 + +2008-04-16 Jürg Billeter + * vala/Makefile.am, vala/vala.h, vala/valablock.vala, vala/valacatchclause.vala, vala/valacfgbuilder.vala, vala/valaclass.vala, vala/valacodecontext.vala, diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index a559746..30f2d84 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -2871,7 +2871,20 @@ public class Vala.CCodeGenerator : CodeGenerator { if (param.type_reference.data_type is Struct && !((Struct) param.type_reference.data_type).is_simple_type ()) { // we already use a reference for arguments of ref and out parameters if (param.direction == ParameterDirection.IN) { - cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr); + 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.static_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; + } } } } diff --git a/gobject/valaccodegeneratorinvocationexpression.vala b/gobject/valaccodegeneratorinvocationexpression.vala index f103f14..3528550 100644 --- a/gobject/valaccodegeneratorinvocationexpression.vala +++ b/gobject/valaccodegeneratorinvocationexpression.vala @@ -255,7 +255,20 @@ public class Vala.CCodeGenerator { if (!(arg.static_type is NullType) && param.type_reference.data_type is Struct && !((Struct) param.type_reference.data_type).is_simple_type ()) { // we already use a reference for arguments of ref and out parameters if (param.direction == ParameterDirection.IN) { - cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr); + 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.static_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; + } } }