From: Juerg Billeter Date: Fri, 30 May 2008 14:59:31 +0000 (+0000) Subject: Add support for dynamic properties of GObjects X-Git-Tag: VALA_0_3_3~61 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=60cc707fd43f3c4049e64da5e1eac7c702dc2473;p=thirdparty%2Fvala.git Add support for dynamic properties of GObjects 2008-05-30 Juerg Billeter * vala/valadynamicmethod.vala: * vala/valadynamicproperty.vala: * vala/valasymbol.vala: * gobject/valaccodedynamicpropertybinding.vala: Add support for dynamic properties of GObjects svn path=/trunk/; revision=1497 --- diff --git a/ChangeLog b/ChangeLog index b2f14d6d1..e8d23a307 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-05-30 Jürg Billeter + + * vala/valadynamicmethod.vala: + * vala/valadynamicproperty.vala: + * vala/valasymbol.vala: + * gobject/valaccodedynamicpropertybinding.vala: + + Add support for dynamic properties of GObjects + 2008-05-30 Jürg Billeter * gobject/valaccodedynamicsignalbinding.vala: diff --git a/gobject/valaccodedynamicpropertybinding.vala b/gobject/valaccodedynamicpropertybinding.vala index d0c37a4b8..d589927a1 100644 --- a/gobject/valaccodedynamicpropertybinding.vala +++ b/gobject/valaccodedynamicpropertybinding.vala @@ -53,7 +53,11 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { func.add_parameter (new CCodeFormalParameter ("obj", dynamic_property.dynamic_type.get_cname ())); var block = new CCodeBlock (); - Report.error (node.source_reference, "dynamic properties are not supported for `%s'".printf (dynamic_property.dynamic_type.to_string ())); + if (dynamic_property.dynamic_type.data_type == codegen.gobject_type) { + generate_gobject_property_getter_wrapper (block); + } else { + Report.error (node.source_reference, "dynamic properties are not supported for `%s'".printf (dynamic_property.dynamic_type.to_string ())); + } // append to C source file codegen.source_type_member_declaration.append (func.copy ()); @@ -79,7 +83,11 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { func.add_parameter (new CCodeFormalParameter ("value", node.property_type.get_cname ())); var block = new CCodeBlock (); - Report.error (node.source_reference, "dynamic properties are not supported for `%s'".printf (dynamic_property.dynamic_type.to_string ())); + if (dynamic_property.dynamic_type.data_type == codegen.gobject_type) { + generate_gobject_property_setter_wrapper (block); + } else { + Report.error (node.source_reference, "dynamic properties are not supported for `%s'".printf (dynamic_property.dynamic_type.to_string ())); + } // append to C source file codegen.source_type_member_declaration.append (func.copy ()); @@ -89,4 +97,30 @@ public class Vala.CCodeDynamicPropertyBinding : CCodeBinding { return getter_cname; } + + void generate_gobject_property_getter_wrapper (CCodeBlock block) { + var cdecl = new CCodeDeclaration (node.property_type.get_cname ()); + cdecl.add_declarator (new CCodeVariableDeclarator ("result")); + block.add_statement (cdecl); + + var call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_get")); + call.add_argument (new CCodeIdentifier ("obj")); + call.add_argument (node.get_canonical_cconstant ()); + call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("result"))); + call.add_argument (new CCodeConstant ("NULL")); + + block.add_statement (new CCodeExpressionStatement (call)); + + block.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("result"))); + } + + void generate_gobject_property_setter_wrapper (CCodeBlock block) { + var call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_set")); + call.add_argument (new CCodeIdentifier ("obj")); + call.add_argument (node.get_canonical_cconstant ()); + call.add_argument (new CCodeIdentifier ("value")); + call.add_argument (new CCodeConstant ("NULL")); + + block.add_statement (new CCodeExpressionStatement (call)); + } } diff --git a/vala/valadynamicmethod.vala b/vala/valadynamicmethod.vala index 3c1355536..cac3aca4b 100644 --- a/vala/valadynamicmethod.vala +++ b/vala/valadynamicmethod.vala @@ -42,7 +42,7 @@ public class Vala.DynamicMethod : Method { } public override Gee.List get_cheader_filenames () { - return new ReadOnlyList (); + return new ArrayList (); } public override string get_default_cname () { diff --git a/vala/valadynamicproperty.vala b/vala/valadynamicproperty.vala index a2f36e6ec..ed34438c7 100644 --- a/vala/valadynamicproperty.vala +++ b/vala/valadynamicproperty.vala @@ -38,7 +38,7 @@ public class Vala.DynamicProperty : Property { } public override Gee.List get_cheader_filenames () { - return new ReadOnlyList (); + return new ArrayList (); } public override CodeBinding? create_code_binding (CodeGenerator codegen) { diff --git a/vala/valasymbol.vala b/vala/valasymbol.vala index f916732b8..3f3db5fb6 100644 --- a/vala/valasymbol.vala +++ b/vala/valasymbol.vala @@ -192,7 +192,7 @@ public abstract class Vala.Symbol : CodeNode { * @return list of C header filenames for this symbol */ public virtual Gee.List get_cheader_filenames () { - return new ReadOnlyList (); + return new ArrayList (); } /**