]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add support for dynamic properties of GObjects
authorJuerg Billeter <j@bitron.ch>
Fri, 30 May 2008 14:59:31 +0000 (14:59 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 30 May 2008 14:59:31 +0000 (14:59 +0000)
2008-05-30  Juerg Billeter  <j@bitron.ch>

* vala/valadynamicmethod.vala:
* vala/valadynamicproperty.vala:
* vala/valasymbol.vala:
* gobject/valaccodedynamicpropertybinding.vala:

Add support for dynamic properties of GObjects

svn path=/trunk/; revision=1497

ChangeLog
gobject/valaccodedynamicpropertybinding.vala
vala/valadynamicmethod.vala
vala/valadynamicproperty.vala
vala/valasymbol.vala

index b2f14d6d174ff94de2d1b5b7a197583ce04a5fd1..e8d23a3078548f1e20abb1d534ba429fab4328a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-05-30  Jürg Billeter  <j@bitron.ch>
+
+       * 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  <j@bitron.ch>
 
        * gobject/valaccodedynamicsignalbinding.vala:
index d0c37a4b894e5370bacd8779294b905864b45b2e..d589927a12ab60d8f02546067fc63f81b927eefd 100644 (file)
@@ -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));
+       }
 }
index 3c1355536f2bd1910e761ff589b46129214d37e6..cac3aca4b15194ef6856bbe20e991190e5007ae3 100644 (file)
@@ -42,7 +42,7 @@ public class Vala.DynamicMethod : Method {
        }
 
        public override Gee.List<string> get_cheader_filenames () {
-               return new ReadOnlyList<string> ();
+               return new ArrayList<string> ();
        }
 
        public override string get_default_cname () {
index a2f36e6eccf82cd790afafea80f02b1d49e829c3..ed34438c7cb1ed6ea5fe8595b680175572fddaf8 100644 (file)
@@ -38,7 +38,7 @@ public class Vala.DynamicProperty : Property {
        }
 
        public override Gee.List<string> get_cheader_filenames () {
-               return new ReadOnlyList<string> ();
+               return new ArrayList<string> ();
        }
 
        public override CodeBinding? create_code_binding (CodeGenerator codegen) {
index f916732b861018b73909c05ed9a0a35ccabc8213..3f3db5fb668664156b8263918ec8b5014fbed9dc 100644 (file)
@@ -192,7 +192,7 @@ public abstract class Vala.Symbol : CodeNode {
         * @return list of C header filenames for this symbol
         */
        public virtual Gee.List<string> get_cheader_filenames () {
-               return new ReadOnlyList<string> ();
+               return new ArrayList<string> ();
        }
 
        /**