]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix base access for properties, fixes bug 506075
authorJürg Billeter <j@bitron.ch>
Sun, 10 Aug 2008 09:32:24 +0000 (09:32 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sun, 10 Aug 2008 09:32:24 +0000 (09:32 +0000)
2008-08-10  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodegenerator.vala:
* gobject/valaccodememberaccessbinding.vala:

Fix base access for properties, fixes bug 506075

svn path=/trunk/; revision=1741

ChangeLog
gobject/valaccodegenerator.vala
gobject/valaccodememberaccessbinding.vala

index ac7f0418a267e6938babbcb8e917d85bb39326eb..f774685fa6d68ece53ac9e4ef0ac5472ae3813e5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-08-10  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodegenerator.vala:
+       * gobject/valaccodememberaccessbinding.vala:
+
+       Fix base access for properties, fixes bug 506075
+
 2008-08-10  Jürg Billeter  <j@bitron.ch>
 
        * vala/valasemanticanalyzer.vala:
index f7f6c61d35dd3d508974d201531f94a1aa84d5f9..c9585eff2b41790ffa6b8785f5540bd7c8715164 100644 (file)
@@ -3895,6 +3895,27 @@ public class Vala.CCodeGenerator : CodeGenerator {
        }
 
        public CCodeFunctionCall get_property_set_call (Property prop, MemberAccess ma, CCodeExpression cexpr) {
+               if (ma.inner is BaseAccess) {
+                       if (prop.base_property != null) {
+                               var base_class = (Class) prop.base_property.parent_symbol;
+                               var vcast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (base_class.get_upper_case_cname (null))));
+                               vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (current_class.get_lower_case_cname (null))));
+                               
+                               var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "set_%s".printf (prop.name)));
+                               ccall.add_argument ((CCodeExpression) ma.inner.ccodenode);
+                               ccall.add_argument (cexpr);
+                               return ccall;
+                       } else if (prop.base_interface_property != null) {
+                               var base_iface = (Interface) prop.base_interface_property.parent_symbol;
+                               string parent_iface_var = "%s_%s_parent_iface".printf (current_class.get_lower_case_cname (null), base_iface.get_lower_case_cname (null));
+
+                               var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), "set_%s".printf (prop.name)));
+                               ccall.add_argument ((CCodeExpression) ma.inner.ccodenode);
+                               ccall.add_argument (cexpr);
+                               return ccall;
+                       }
+               }
+
                var set_func = "g_object_set";
                
                var base_property = prop;
index 706cb92adec16b7d942bf29aa2a1a9c5465daf52..cf6cc2c3d8efa0d26f1568eb7638581cf6f5520b 100644 (file)
@@ -138,6 +138,27 @@ public class Vala.CCodeMemberAccessBinding : CCodeExpressionBinding {
                        if (prop.get_accessor == null) {
                                return;
                        }
+                       
+                       if (expr.inner is BaseAccess) {
+                               if (prop.base_property != null) {
+                                       var base_class = (Class) prop.base_property.parent_symbol;
+                                       var vcast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (base_class.get_upper_case_cname (null))));
+                                       vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (codegen.current_class.get_lower_case_cname (null))));
+                                       
+                                       var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "get_%s".printf (prop.name)));
+                                       ccall.add_argument ((CCodeExpression) expr.inner.ccodenode);
+                                       expr.ccodenode = ccall;
+                                       return;
+                               } else if (prop.base_interface_property != null) {
+                                       var base_iface = (Interface) prop.base_interface_property.parent_symbol;
+                                       string parent_iface_var = "%s_%s_parent_iface".printf (codegen.current_class.get_lower_case_cname (null), base_iface.get_lower_case_cname (null));
+
+                                       var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), "get_%s".printf (prop.name)));
+                                       ccall.add_argument ((CCodeExpression) expr.inner.ccodenode);
+                                       expr.ccodenode = ccall;
+                                       return;
+                               }
+                       }
 
                        if (prop.get_accessor.automatic_body &&
                            codegen.current_type_symbol == prop.parent_symbol &&