From: Marc-André Lureau Date: Sat, 23 Jan 2010 16:05:25 +0000 (+0100) Subject: Fix nested struct expression as method argument X-Git-Tag: 0.8.0~203 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5f275fbc05603c38a32e9a80cc2fa922381c1d7d;p=thirdparty%2Fvala.git Fix nested struct expression as method argument Fixes bug 580046. --- diff --git a/ccode/valaccodecommaexpression.vala b/ccode/valaccodecommaexpression.vala index 79f78ae5a..7f16ffd94 100644 --- a/ccode/valaccodecommaexpression.vala +++ b/ccode/valaccodecommaexpression.vala @@ -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 get_inner () { return new ReadOnlyList (inner); } diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index e1b6bdb17..428fdadaa 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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) { diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index b4984402a..3ebb4bf5d 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -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;