From: Jürg Billeter Date: Sun, 22 Jun 2008 19:04:49 +0000 (+0000) Subject: Fix pointer member access to value types, fixes bug 539337 X-Git-Tag: VALA_0_3_4~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4833d19ecd7738e6885b9daba37cd5682fdb833b;p=thirdparty%2Fvala.git Fix pointer member access to value types, fixes bug 539337 2008-06-22 Jürg Billeter * vala/valasemanticanalyzer.vala: * gobject/valaccodeinvocationexpressionbinding.vala: Fix pointer member access to value types, fixes bug 539337 svn path=/trunk/; revision=1628 --- diff --git a/ChangeLog b/ChangeLog index e048cef09..e1eac63ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-06-22 Jürg Billeter + + * vala/valasemanticanalyzer.vala: + * gobject/valaccodeinvocationexpressionbinding.vala: + + Fix pointer member access to value types, fixes bug 539337 + 2008-06-22 Jaap A. Haitsma * vapi/packages/gio-2.0/gio-2.0.metadata: diff --git a/gobject/valaccodeinvocationexpressionbinding.vala b/gobject/valaccodeinvocationexpressionbinding.vala index 195b53395..8c85067f2 100644 --- a/gobject/valaccodeinvocationexpressionbinding.vala +++ b/gobject/valaccodeinvocationexpressionbinding.vala @@ -75,11 +75,10 @@ public class Vala.CCodeInvocationExpressionBinding : CCodeExpressionBinding { CCodeExpression instance; if (m != null && m.binding == MemberBinding.INSTANCE) { instance = (CCodeExpression) ma.inner.ccodenode; - var instance_expression_type = ma.inner.value_type; - if (instance_expression_type.data_type is Struct - && !((Struct) instance_expression_type.data_type).is_simple_type () - && instance_expression_type.data_type != codegen.current_type_symbol) { + var st = m.parent_symbol as Struct; + if (st != null && !st.is_simple_type ()) { + // we need to pass struct instance by reference var unary = instance as CCodeUnaryExpression; if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) { // *expr => expr @@ -91,7 +90,7 @@ public class Vala.CCodeInvocationExpressionBinding : CCodeExpressionBinding { // (tmp = expr, &tmp) var ccomma = new CCodeCommaExpression (); - var temp_var = codegen.get_temp_variable (instance_expression_type); + var temp_var = codegen.get_temp_variable (ma.inner.target_type); codegen.temp_vars.insert (0, temp_var); ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), instance)); ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name))); diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 09e9a5cc6..f23fd791d 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -1599,6 +1599,16 @@ public class Vala.SemanticAnalyzer : CodeVisitor { return; } + if (expr.pointer_member_access) { + var pointer_type = expr.inner.value_type as PointerType; + if (pointer_type != null && pointer_type.base_type is ValueType) { + // transform foo->bar to (*foo).bar + expr.inner = new PointerIndirection (expr.inner, expr.source_reference); + expr.inner.accept (this); + expr.pointer_member_access = false; + } + } + if (expr.inner is MemberAccess) { var ma = (MemberAccess) expr.inner; if (ma.prototype_access) {