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 b2f14d6..e8d23a3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 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:
 
        Add support for dynamic signals of GObjects
index d0c37a4..d589927 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 3c13555..cac3aca 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 a2f36e6..ed34438 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 f916732..3f3db5f 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> ();
        }
 
        /**