Fix generated C code when passing structs by reference, fixes bug 528414
authorJuerg Billeter <j@bitron.ch>
Wed, 16 Apr 2008 15:56:27 +0000 (15:56 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Wed, 16 Apr 2008 15:56:27 +0000 (15:56 +0000)
2008-04-16  Juerg Billeter  <j@bitron.ch>

* gobject/valaccodegenerator.vala,
  gobject/valaccodegeneratorinvocationexpression.vala:

  Fix generated C code when passing structs by reference,
  fixes bug 528414

svn path=/trunk/; revision=1244

ChangeLog
gobject/valaccodegenerator.vala
gobject/valaccodegeneratorinvocationexpression.vala

index fa0f178..b29fe31 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-04-16  Jürg Billeter  <j@bitron.ch>
 
+       * gobject/valaccodegenerator.vala,
+         gobject/valaccodegeneratorinvocationexpression.vala:
+
+         Fix generated C code when passing structs by reference,
+         fixes bug 528414
+
+2008-04-16  Jürg Billeter  <j@bitron.ch>
+
        * vala/Makefile.am, vala/vala.h, vala/valablock.vala,
          vala/valacatchclause.vala, vala/valacfgbuilder.vala,
          vala/valaclass.vala, vala/valacodecontext.vala,
index a559746..30f2d84 100644 (file)
@@ -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;
+                                                               }
                                                        }
                                                }
                                        }
index f103f14..3528550 100644 (file)
@@ -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;
+                                                       }
                                                }
                                        }