From: Jürg Billeter Date: Fri, 24 Oct 2008 13:59:42 +0000 (+0000) Subject: Add CCodeDynamicPropertyModule X-Git-Tag: VALA_0_5_1~76 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8708efc41ccceb8a40aa1ef5ccc85206c5197d43;p=thirdparty%2Fvala.git Add CCodeDynamicPropertyModule 2008-10-24 Jürg Billeter * vala/valacodegenerator.vala: * vala/valadynamicproperty.vala: * gobject/Makefile.am: * gobject/valaccodedynamicpropertymodule.vala: * gobject/valaccodegenerator.vala: * gobject/valaccodememberaccessmodule.vala: * gobject/valaccodemodule.vala: Add CCodeDynamicPropertyModule svn path=/trunk/; revision=1895 --- diff --git a/ChangeLog b/ChangeLog index 78f7ce86d..a9779379e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-10-24 Jürg Billeter + + * vala/valacodegenerator.vala: + * vala/valadynamicproperty.vala: + * gobject/Makefile.am: + * gobject/valaccodedynamicpropertymodule.vala: + * gobject/valaccodegenerator.vala: + * gobject/valaccodememberaccessmodule.vala: + * gobject/valaccodemodule.vala: + + Add CCodeDynamicPropertyModule + 2008-10-24 Jürg Billeter * gobject/Makefile.am: diff --git a/gobject/Makefile.am b/gobject/Makefile.am index bb77233b5..cb50fe68f 100644 --- a/gobject/Makefile.am +++ b/gobject/Makefile.am @@ -17,7 +17,7 @@ libvala_la_VALASOURCES = \ valaccodebasemodule.vala \ valaccodebinding.vala \ valaccodecompiler.vala \ - valaccodedynamicpropertybinding.vala \ + valaccodedynamicpropertymodule.vala \ valaccodedynamicsignalbinding.vala \ valaccodeelementaccessmodule.vala \ valaccodegenerator.vala \ diff --git a/gobject/valaccodedynamicpropertybinding.vala b/gobject/valaccodedynamicpropertymodule.vala similarity index 86% rename from gobject/valaccodedynamicpropertybinding.vala rename to gobject/valaccodedynamicpropertymodule.vala index c6170eae4..9490c68c9 100644 --- a/gobject/valaccodedynamicpropertybinding.vala +++ b/gobject/valaccodedynamicpropertymodule.vala @@ -1,4 +1,4 @@ -/* valaccodedynamicpropertybinding.vala +/* valaccodedynamicpropertymodule.vala * * Copyright (C) 2008 Jürg Billeter * @@ -26,25 +26,15 @@ using Gee; /** * The link between a dynamic property and generated code. */ -public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { - public Property node { get; set; } +public class Vala.CCodeDynamicPropertyModule : CCodeModule { + int dynamic_property_id; - string? getter_cname; - string? setter_cname; - - static int dynamic_property_id; - - public CCodeDynamicPropertyBinding (CCodeGenerator codegen, DynamicProperty property) { - this.node = property; - this.codegen = codegen; + public CCodeDynamicPropertyModule (CCodeGenerator codegen, CCodeModule? next) { + base (codegen, next); } - public string get_getter_cname () { - if (getter_cname != null) { - return getter_cname; - } - - getter_cname = "_dynamic_get_%s%d".printf (node.name, dynamic_property_id++); + public override string get_dynamic_property_getter_cname (DynamicProperty node) { + string getter_cname = "_dynamic_get_%s%d".printf (node.name, dynamic_property_id++); var dynamic_property = (DynamicProperty) node; @@ -55,10 +45,10 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { var block = new CCodeBlock (); if (dynamic_property.dynamic_type.data_type == codegen.dbus_object_type) { - generate_dbus_property_getter_wrapper (block); + generate_dbus_property_getter_wrapper (node, block); } else if (dynamic_property.dynamic_type.data_type != null && dynamic_property.dynamic_type.data_type.is_subtype_of (codegen.gobject_type)) { - generate_gobject_property_getter_wrapper (block); + generate_gobject_property_getter_wrapper (node, block); } else { Report.error (node.source_reference, "dynamic properties are not supported for `%s'".printf (dynamic_property.dynamic_type.to_string ())); } @@ -72,16 +62,12 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { return getter_cname; } - public string get_setter_cname () { - if (setter_cname != null) { - return setter_cname; - } - - getter_cname = "_dynamic_set_%s%d".printf (node.name, dynamic_property_id++); + public override string get_dynamic_property_setter_cname (DynamicProperty node) { + string setter_cname = "_dynamic_set_%s%d".printf (node.name, dynamic_property_id++); var dynamic_property = (DynamicProperty) node; - var func = new CCodeFunction (getter_cname, "void"); + var func = new CCodeFunction (setter_cname, "void"); func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE; func.add_parameter (new CCodeFormalParameter ("obj", dynamic_property.dynamic_type.get_cname ())); @@ -89,10 +75,10 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { var block = new CCodeBlock (); if (dynamic_property.dynamic_type.data_type == codegen.dbus_object_type) { - generate_dbus_property_setter_wrapper (block); + generate_dbus_property_setter_wrapper (node, block); } else if (dynamic_property.dynamic_type.data_type != null && dynamic_property.dynamic_type.data_type.is_subtype_of (codegen.gobject_type)) { - generate_gobject_property_setter_wrapper (block); + generate_gobject_property_setter_wrapper (node, block); } else { Report.error (node.source_reference, "dynamic properties are not supported for `%s'".printf (dynamic_property.dynamic_type.to_string ())); } @@ -103,10 +89,10 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { func.block = block; codegen.source_type_member_definition.append (func); - return getter_cname; + return setter_cname; } - void generate_gobject_property_getter_wrapper (CCodeBlock block) { + void generate_gobject_property_getter_wrapper (DynamicProperty node, CCodeBlock block) { var cdecl = new CCodeDeclaration (node.property_type.get_cname ()); cdecl.add_declarator (new CCodeVariableDeclarator ("result")); block.add_statement (cdecl); @@ -122,7 +108,7 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { block.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("result"))); } - void generate_gobject_property_setter_wrapper (CCodeBlock block) { + void generate_gobject_property_setter_wrapper (DynamicProperty node, CCodeBlock block) { var call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_set")); call.add_argument (new CCodeIdentifier ("obj")); call.add_argument (node.get_canonical_cconstant ()); @@ -132,7 +118,7 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { block.add_statement (new CCodeExpressionStatement (call)); } - void create_dbus_property_proxy (CCodeBlock block) { + void create_dbus_property_proxy (DynamicProperty node, CCodeBlock block) { var prop_proxy_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_new_from_proxy")); prop_proxy_call.add_argument (new CCodeIdentifier ("obj")); prop_proxy_call.add_argument (new CCodeConstant ("DBUS_INTERFACE_PROPERTIES")); @@ -143,8 +129,8 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { block.add_statement (prop_proxy_decl); } - void generate_dbus_property_getter_wrapper (CCodeBlock block) { - create_dbus_property_proxy (block); + void generate_dbus_property_getter_wrapper (DynamicProperty node, CCodeBlock block) { + create_dbus_property_proxy (node, block); // initialize GValue var cvalinit = new CCodeInitializerList (); @@ -198,8 +184,8 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { block.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("result"))); } - void generate_dbus_property_setter_wrapper (CCodeBlock block) { - create_dbus_property_proxy (block); + void generate_dbus_property_setter_wrapper (DynamicProperty node, CCodeBlock block) { + create_dbus_property_proxy (node, block); // initialize GValue var cvalinit = new CCodeInitializerList (); diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index ff7ad2925..b1d50317e 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -148,6 +148,7 @@ public class Vala.CCodeGenerator : CodeGenerator { head = new CCodeAssignmentModule (this, head); head = new CCodeInvocationExpressionModule (this, head); head = new CCodeArrayModule (this, head); + head = new CCodeDynamicPropertyModule (this, head); head = new GObjectModule (this, head); head = new GObjectClassModule (this, head); head = new GObjectInterfaceModule (this, head); @@ -4162,7 +4163,7 @@ public class Vala.CCodeGenerator : CodeGenerator { var base_property_type = (TypeSymbol) base_property.parent_symbol; set_func = "%s_set_%s".printf (base_property_type.get_lower_case_cname (null), base_property.name); if (prop is DynamicProperty) { - set_func = dynamic_property_binding ((DynamicProperty) prop).get_setter_cname (); + set_func = head.get_dynamic_property_setter_cname ((DynamicProperty) prop); } } @@ -4367,10 +4368,6 @@ public class Vala.CCodeGenerator : CodeGenerator { return node.ccodenode; } - public override CodeBinding? create_dynamic_property_binding (DynamicProperty node) { - return new CCodeDynamicPropertyBinding (this, node); - } - public override CodeBinding? create_dynamic_signal_binding (DynamicSignal node) { return new CCodeDynamicSignalBinding (this, node); } @@ -4379,10 +4376,6 @@ public class Vala.CCodeGenerator : CodeGenerator { return (CCodeBinding) node.get_code_binding (this); } - public CCodeDynamicPropertyBinding dynamic_property_binding (DynamicProperty node) { - return (CCodeDynamicPropertyBinding) node.get_code_binding (this); - } - public CCodeDynamicSignalBinding dynamic_signal_binding (DynamicSignal node) { return (CCodeDynamicSignalBinding) node.get_code_binding (this); } diff --git a/gobject/valaccodememberaccessmodule.vala b/gobject/valaccodememberaccessmodule.vala index 37ba1929a..91e8366df 100644 --- a/gobject/valaccodememberaccessmodule.vala +++ b/gobject/valaccodememberaccessmodule.vala @@ -168,7 +168,7 @@ public class Vala.CCodeMemberAccessModule : CCodeModule { } string getter_cname; if (prop is DynamicProperty) { - getter_cname = codegen.dynamic_property_binding ((DynamicProperty) prop).get_getter_cname (); + getter_cname = head.get_dynamic_property_getter_cname ((DynamicProperty) prop); } else { getter_cname = base_property.get_accessor.get_cname (); } diff --git a/gobject/valaccodemodule.vala b/gobject/valaccodemodule.vala index c3a911d50..2a33c978b 100644 --- a/gobject/valaccodemodule.vala +++ b/gobject/valaccodemodule.vala @@ -123,4 +123,12 @@ public abstract class Vala.CCodeModule { public virtual CCodeFragment register_dbus_info (ObjectTypeSymbol bindable) { return next.register_dbus_info (bindable); } + + public virtual string get_dynamic_property_getter_cname (DynamicProperty node) { + return next.get_dynamic_property_getter_cname (node); + } + + public virtual string get_dynamic_property_setter_cname (DynamicProperty node) { + return next.get_dynamic_property_setter_cname (node); + } } diff --git a/vala/valacodegenerator.vala b/vala/valacodegenerator.vala index 8d6545ae2..d587e6f54 100644 --- a/vala/valacodegenerator.vala +++ b/vala/valacodegenerator.vala @@ -34,10 +34,6 @@ public class Vala.CodeGenerator : CodeVisitor { public virtual void emit (CodeContext context) { } - public virtual CodeBinding? create_dynamic_property_binding (DynamicProperty node) { - return null; - } - public virtual CodeBinding? create_dynamic_signal_binding (DynamicSignal node) { return null; } diff --git a/vala/valadynamicproperty.vala b/vala/valadynamicproperty.vala index c90ddbc95..17c6aae41 100644 --- a/vala/valadynamicproperty.vala +++ b/vala/valadynamicproperty.vala @@ -42,7 +42,4 @@ public class Vala.DynamicProperty : Property { return new ArrayList (); } - public override CodeBinding? create_code_binding (CodeGenerator codegen) { - return codegen.create_dynamic_property_binding (this); - } }