]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix nested struct expression as method argument
authorMarc-André Lureau <marcandre.lureau@gmail.com>
Sat, 23 Jan 2010 16:05:25 +0000 (17:05 +0100)
committerJürg Billeter <j@bitron.ch>
Sat, 13 Mar 2010 17:44:12 +0000 (18:44 +0100)
Fixes bug 580046.

ccode/valaccodecommaexpression.vala
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala

index 79f78ae5ae85838418bc0d89ee670fa46ef1f023..7f16ffd9438ef239b12306542891810f4e561c3a 100644 (file)
@@ -1,6 +1,6 @@
 /* valaccodecommaexpression.vala
  *
- * Copyright (C) 2006-2008  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -37,6 +37,10 @@ public class Vala.CCodeCommaExpression : CCodeExpression {
                inner.add (expr);
        }
 
+       public void set_expression (int index, CCodeExpression expr) {
+               inner[index] = expr;
+       }
+
        public List<CCodeExpression> get_inner () {
                return new ReadOnlyList<CCodeExpression> (inner);
        }
index e1b6bdb1740e3eace0ffc719448b1ad6815799cb..428fdadaad7eba224a69801fc2c6c479e180ba95 100644 (file)
@@ -4373,7 +4373,15 @@ internal class Vala.CCodeBaseModule : CCodeModule {
        }
 
        public override void visit_addressof_expression (AddressofExpression expr) {
-               expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) expr.inner.ccodenode);
+               if (expr.inner.ccodenode is CCodeCommaExpression) {
+                       var ccomma = expr.inner.ccodenode as CCodeCommaExpression;
+                       var inner = ccomma.get_inner ();
+                       var last = inner.get (inner.size - 1);
+                       ccomma.set_expression (inner.size - 1, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) last));
+                       expr.ccodenode = ccomma;
+               } else {
+                       expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) expr.inner.ccodenode);
+               }
        }
 
        public override void visit_reference_transfer_expression (ReferenceTransferExpression expr) {
index b4984402af67c17a9ee8dc0c7813e009de406a1d..3ebb4bf5dba4555025eb37df69ce2f8303b2e64d 100644 (file)
@@ -126,7 +126,15 @@ internal class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                if (instance_target_type.data_type.is_reference_type () || (expr.inner != null && expr.inner.value_type is PointerType)) {
                                        expr.ccodenode = new CCodeMemberAccess.pointer (inst, f.get_cname ());
                                } else {
-                                       expr.ccodenode = new CCodeMemberAccess (inst, f.get_cname ());
+                                       if (inst is CCodeCommaExpression) {
+                                               var ccomma = inst as CCodeCommaExpression;
+                                               var inner = ccomma.get_inner ();
+                                               var last = inner.get (inner.size - 1);
+                                               ccomma.set_expression (inner.size - 1, new CCodeMemberAccess (last, f.get_cname ()));
+                                               expr.ccodenode = ccomma;
+                                       } else {
+                                               expr.ccodenode = new CCodeMemberAccess (inst, f.get_cname ());
+                                       }
                                }
                        } else if (f.binding == MemberBinding.CLASS) {
                                var cl = (Class) f.parent_symbol;