[vala] Fix base access of properties



commit f6146eaea2793aadcb2ad597a67ac6c1f736282c
Author: Luca Bruno <lucabru src gnome org>
Date:   Fri Jun 21 23:31:31 2013 +0200

    Fix base access of properties
    
    Fixes another bug in 702736

 codegen/valaccodememberaccessmodule.vala |   12 +++++++++---
 tests/Makefile.am                        |    1 +
 tests/objects/bug702736.vala             |   27 +++++++++++++++++++++++++++
 3 files changed, 37 insertions(+), 3 deletions(-)
---
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index e9aefd5..6becb19 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -167,16 +167,22 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        }
 
                        if (expr.inner is BaseAccess) {
+                               var base_prop = prop;
                                if (prop.base_property != null) {
-                                       var base_class = (Class) prop.base_property.parent_symbol;
+                                       base_prop = prop.base_property;
+                               } else if (prop.base_interface_property != null) {
+                                       base_prop = prop.base_interface_property;
+                               }
+                               if (base_prop.parent_symbol is Class) {
+                                       var base_class = (Class) base_prop.parent_symbol;
                                        var vcast = new CCodeFunctionCall (new CCodeIdentifier 
("%s_CLASS".printf (get_ccode_upper_case_name (base_class, null))));
                                        vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf 
(get_ccode_lower_case_name (current_class, null))));
                                        
                                        var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer 
(vcast, "get_%s".printf (prop.name)));
                                        ccall.add_argument (get_cvalue (expr.inner));
                                        set_cvalue (expr, ccall);
-                               } else if (prop.base_interface_property != null) {
-                                       var base_iface = (Interface) 
prop.base_interface_property.parent_symbol;
+                               } else if (base_prop.parent_symbol is Interface) {
+                                       var base_iface = (Interface) base_prop.parent_symbol;
                                        string parent_iface_var = "%s_%s_parent_iface".printf 
(get_ccode_lower_case_name (current_class), get_ccode_lower_case_name (base_iface));
 
                                        var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (new 
CCodeIdentifier (parent_iface_var), "get_%s".printf (prop.name)));
diff --git a/tests/Makefile.am b/tests/Makefile.am
index d9c7c96..5b16544 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -136,6 +136,7 @@ TESTS = \
        objects/bug683646.vala \
        objects/bug695671.vala \
        objects/bug701978.vala \
+       objects/bug702736.vala \
        errors/errors.vala \
        errors/bug567181.vala \
        errors/bug579101.vala \
diff --git a/tests/objects/bug702736.vala b/tests/objects/bug702736.vala
new file mode 100644
index 0000000..7169501
--- /dev/null
+++ b/tests/objects/bug702736.vala
@@ -0,0 +1,27 @@
+public abstract class ClassA : Object {
+    public abstract int flags { get; }
+}
+
+public class ClassB : ClassA {
+    public override int flags { get { return 1; } }
+}
+
+public class ClassC : ClassB {
+    public void foo() {
+    }
+}
+
+public class ClassD : ClassC {
+    public override int flags {
+        get {
+            var old_flags = base.flags;
+
+            return old_flags | 2;
+        }
+    }
+}
+
+void main () {
+    var d = new ClassD ();
+       assert (d.flags == 3);
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]