From: Jürg Billeter Date: Sun, 10 Aug 2008 09:32:24 +0000 (+0000) Subject: Fix base access for properties, fixes bug 506075 X-Git-Tag: VALA_0_3_5~13 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=71d2c64ceb25a463473442c7db108bba7d07d8ba;p=thirdparty%2Fvala.git Fix base access for properties, fixes bug 506075 2008-08-10 Jürg Billeter * gobject/valaccodegenerator.vala: * gobject/valaccodememberaccessbinding.vala: Fix base access for properties, fixes bug 506075 svn path=/trunk/; revision=1741 --- diff --git a/ChangeLog b/ChangeLog index ac7f0418a..f774685fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-08-10 Jürg Billeter + + * gobject/valaccodegenerator.vala: + * gobject/valaccodememberaccessbinding.vala: + + Fix base access for properties, fixes bug 506075 + 2008-08-10 Jürg Billeter * vala/valasemanticanalyzer.vala: diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index f7f6c61d3..c9585eff2 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -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; diff --git a/gobject/valaccodememberaccessbinding.vala b/gobject/valaccodememberaccessbinding.vala index 706cb92ad..cf6cc2c3d 100644 --- a/gobject/valaccodememberaccessbinding.vala +++ b/gobject/valaccodememberaccessbinding.vala @@ -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 &&