]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix pointer member access to value types, fixes bug 539337
authorJürg Billeter <j@bitron.ch>
Sun, 22 Jun 2008 19:04:49 +0000 (19:04 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sun, 22 Jun 2008 19:04:49 +0000 (19:04 +0000)
2008-06-22  Jürg Billeter  <j@bitron.ch>

* vala/valasemanticanalyzer.vala:
* gobject/valaccodeinvocationexpressionbinding.vala:

Fix pointer member access to value types, fixes bug 539337

svn path=/trunk/; revision=1628

ChangeLog
gobject/valaccodeinvocationexpressionbinding.vala
vala/valasemanticanalyzer.vala

index e048cef0963832d1e7574f5d05d564085b2c8217..e1eac63efa9e9c989ccb8d84b4d84cd12a2bdbc2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-06-22  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valasemanticanalyzer.vala:
+       * gobject/valaccodeinvocationexpressionbinding.vala:
+
+       Fix pointer member access to value types, fixes bug 539337
+
 2008-06-22  Jaap A. Haitsma  <jaap@haitsma.org>
 
        * vapi/packages/gio-2.0/gio-2.0.metadata:
index 195b53395658486ddb05897899e1ebda4425738f..8c85067f22e370afaff723f127b60ace0c6fb167 100644 (file)
@@ -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)));
index 09e9a5cc63fca4d19e0ed0c868fd2a9520a1f8d0..f23fd791d80e2aa36e9ae65ff396112f11b2d7f5 100644 (file)
@@ -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) {