vala r1989 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1989 - in trunk: . gobject
- Date: Thu, 6 Nov 2008 19:24:23 +0000 (UTC)
Author: juergbi
Date: Thu Nov 6 19:24:23 2008
New Revision: 1989
URL: http://svn.gnome.org/viewvc/vala?rev=1989&view=rev
Log:
2008-11-06 JÃrg Billeter <j bitron ch>
* gobject/Makefile.am:
* gobject/valaccodedynamicpropertymodule.vala:
* gobject/valaccodedynamicsignalmodule.vala:
* gobject/valaccodegenerator.vala:
* gobject/valadbusclientmodule.vala:
* gobject/valagobjectmodule.vala:
Move dynamic property generation to GObjectModule and
DBusClientModule
Removed:
trunk/gobject/valaccodedynamicpropertymodule.vala
Modified:
trunk/ChangeLog
trunk/gobject/Makefile.am
trunk/gobject/valaccodedynamicsignalmodule.vala
trunk/gobject/valaccodegenerator.vala
trunk/gobject/valadbusclientmodule.vala
trunk/gobject/valagobjectmodule.vala
Modified: trunk/gobject/Makefile.am
==============================================================================
--- trunk/gobject/Makefile.am (original)
+++ trunk/gobject/Makefile.am Thu Nov 6 19:24:23 2008
@@ -18,7 +18,6 @@
valaccodecompiler.vala \
valaccodecontrolflowmodule.vala \
valaccodedelegatemodule.vala \
- valaccodedynamicpropertymodule.vala \
valaccodedynamicsignalmodule.vala \
valaccodegenerator.vala \
valaccodeinvocationexpressionmodule.vala \
Modified: trunk/gobject/valaccodedynamicsignalmodule.vala
==============================================================================
--- trunk/gobject/valaccodedynamicsignalmodule.vala (original)
+++ trunk/gobject/valaccodedynamicsignalmodule.vala Thu Nov 6 19:24:23 2008
@@ -26,7 +26,7 @@
/**
* The link between a dynamic signal and generated code.
*/
-public class Vala.CCodeDynamicSignalModule : CCodeDynamicPropertyModule {
+public class Vala.CCodeDynamicSignalModule : CCodeDelegateModule {
public CCodeDynamicSignalModule (CCodeGenerator codegen, CCodeModule? next) {
base (codegen, next);
}
Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala (original)
+++ trunk/gobject/valaccodegenerator.vala Thu Nov 6 19:24:23 2008
@@ -41,7 +41,6 @@
head = new CCodeInvocationExpressionModule (this, head);
head = new CCodeArrayModule (this, head);
head = new CCodeDelegateModule (this, head);
- head = new CCodeDynamicPropertyModule (this, head);
head = new CCodeDynamicSignalModule (this, head);
head = new GErrorModule (this, head);
head = new GTypeModule (this, head);
Modified: trunk/gobject/valadbusclientmodule.vala
==============================================================================
--- trunk/gobject/valadbusclientmodule.vala (original)
+++ trunk/gobject/valadbusclientmodule.vala Thu Nov 6 19:24:23 2008
@@ -29,6 +29,8 @@
* The link between a dynamic method and generated code.
*/
public class Vala.DBusClientModule : GAsyncModule {
+ int dynamic_property_id;
+
public DBusClientModule (CCodeGenerator codegen, CCodeModule? next) {
base (codegen, next);
}
@@ -509,4 +511,171 @@
return true;
}
}
+
+ public override string get_dynamic_property_getter_cname (DynamicProperty prop) {
+ if (prop.dynamic_type.data_type != dbus_object_type) {
+ return base.get_dynamic_property_getter_cname (prop);
+ }
+
+ string getter_cname = "_dynamic_get_%s%d".printf (prop.name, dynamic_property_id++);
+
+ var func = new CCodeFunction (getter_cname, prop.property_type.get_cname ());
+ func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE;
+
+ func.add_parameter (new CCodeFormalParameter ("obj", prop.dynamic_type.get_cname ()));
+
+ var block = new CCodeBlock ();
+ generate_dbus_property_getter_wrapper (prop, block);
+
+ // append to C source file
+ source_type_member_declaration.append (func.copy ());
+
+ func.block = block;
+ source_type_member_definition.append (func);
+
+ return getter_cname;
+ }
+
+ public override string get_dynamic_property_setter_cname (DynamicProperty prop) {
+ if (prop.dynamic_type.data_type != dbus_object_type) {
+ return base.get_dynamic_property_setter_cname (prop);
+ }
+
+ string setter_cname = "_dynamic_set_%s%d".printf (prop.name, dynamic_property_id++);
+
+ var func = new CCodeFunction (setter_cname, "void");
+ func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE;
+
+ func.add_parameter (new CCodeFormalParameter ("obj", prop.dynamic_type.get_cname ()));
+ func.add_parameter (new CCodeFormalParameter ("value", prop.property_type.get_cname ()));
+
+ var block = new CCodeBlock ();
+ generate_dbus_property_setter_wrapper (prop, block);
+
+ // append to C source file
+ source_type_member_declaration.append (func.copy ());
+
+ func.block = block;
+ source_type_member_definition.append (func);
+
+ return setter_cname;
+ }
+
+ 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"));
+ prop_proxy_call.add_argument (new CCodeConstant ("NULL"));
+
+ var prop_proxy_decl = new CCodeDeclaration ("DBusGProxy*");
+ prop_proxy_decl.add_declarator (new CCodeVariableDeclarator.with_initializer ("property_proxy", prop_proxy_call));
+ block.add_statement (prop_proxy_decl);
+ }
+
+ void generate_dbus_property_getter_wrapper (DynamicProperty node, CCodeBlock block) {
+ create_dbus_property_proxy (node, block);
+
+ // initialize GValue
+ var cvalinit = new CCodeInitializerList ();
+ cvalinit.append (new CCodeConstant ("0"));
+
+ var cval_decl = new CCodeDeclaration ("GValue");
+ cval_decl.add_declarator (new CCodeVariableDeclarator.with_initializer ("gvalue", cvalinit));
+ block.add_statement (cval_decl);
+
+ var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("gvalue"));
+
+ // call Get method on property proxy
+ var cdecl = new CCodeDeclaration (node.property_type.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator ("result"));
+ block.add_statement (cdecl);
+
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_call"));
+ ccall.add_argument (new CCodeIdentifier ("property_proxy"));
+ ccall.add_argument (new CCodeConstant ("\"Get\""));
+ ccall.add_argument (new CCodeConstant ("NULL"));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_STRING"));
+ var get_iface = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_get_interface"));
+ get_iface.add_argument (new CCodeIdentifier ("obj"));
+ ccall.add_argument (get_iface);
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_STRING"));
+ ccall.add_argument (new CCodeConstant ("\"%s\"".printf (Symbol.lower_case_to_camel_case (node.name))));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_VALUE"));
+ ccall.add_argument (val_ptr);
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+ block.add_statement (new CCodeExpressionStatement (ccall));
+
+ // unref property proxy
+ var prop_proxy_unref = new CCodeFunctionCall (new CCodeIdentifier ("g_object_unref"));
+ prop_proxy_unref.add_argument (new CCodeIdentifier ("property_proxy"));
+ block.add_statement (new CCodeExpressionStatement (prop_proxy_unref));
+
+ // assign value to result variable
+ var cget_call = new CCodeFunctionCall (new CCodeIdentifier (node.property_type.data_type.get_get_value_function ()));
+ cget_call.add_argument (val_ptr);
+ var assign = new CCodeAssignment (new CCodeIdentifier ("result"), cget_call);
+ block.add_statement (new CCodeExpressionStatement (assign));
+
+ // return result
+ block.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("result")));
+ }
+
+ void generate_dbus_property_setter_wrapper (DynamicProperty node, CCodeBlock block) {
+ create_dbus_property_proxy (node, block);
+
+ // initialize GValue
+ var cvalinit = new CCodeInitializerList ();
+ cvalinit.append (new CCodeConstant ("0"));
+
+ var cval_decl = new CCodeDeclaration ("GValue");
+ cval_decl.add_declarator (new CCodeVariableDeclarator.with_initializer ("gvalue", cvalinit));
+ block.add_statement (cval_decl);
+
+ var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("gvalue"));
+
+ var cinit_call = new CCodeFunctionCall (new CCodeIdentifier ("g_value_init"));
+ cinit_call.add_argument (val_ptr);
+ cinit_call.add_argument (new CCodeIdentifier (node.property_type.data_type.get_type_id ()));
+ block.add_statement (new CCodeExpressionStatement (cinit_call));
+
+ var cset_call = new CCodeFunctionCall (new CCodeIdentifier (node.property_type.data_type.get_set_value_function ()));
+ cset_call.add_argument (val_ptr);
+ cset_call.add_argument (new CCodeIdentifier ("value"));
+ block.add_statement (new CCodeExpressionStatement (cset_call));
+
+ // call Set method on property proxy
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_call"));
+ ccall.add_argument (new CCodeIdentifier ("property_proxy"));
+ ccall.add_argument (new CCodeConstant ("\"Set\""));
+ ccall.add_argument (new CCodeConstant ("NULL"));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_STRING"));
+ var get_iface = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_get_interface"));
+ get_iface.add_argument (new CCodeIdentifier ("obj"));
+ ccall.add_argument (get_iface);
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_STRING"));
+ ccall.add_argument (new CCodeConstant ("\"%s\"".printf (Symbol.lower_case_to_camel_case (node.name))));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_VALUE"));
+ ccall.add_argument (val_ptr);
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+ ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+ block.add_statement (new CCodeExpressionStatement (ccall));
+
+ // unref property proxy
+ var prop_proxy_unref = new CCodeFunctionCall (new CCodeIdentifier ("g_object_unref"));
+ prop_proxy_unref.add_argument (new CCodeIdentifier ("property_proxy"));
+ block.add_statement (new CCodeExpressionStatement (prop_proxy_unref));
+ }
}
Modified: trunk/gobject/valagobjectmodule.vala
==============================================================================
--- trunk/gobject/valagobjectmodule.vala (original)
+++ trunk/gobject/valagobjectmodule.vala Thu Nov 6 19:24:23 2008
@@ -24,6 +24,8 @@
using GLib;
public class Vala.GObjectModule : GTypeModule {
+ int dynamic_property_id;
+
public GObjectModule (CCodeGenerator codegen, CCodeModule? next) {
base (codegen, next);
}
@@ -1610,5 +1612,82 @@
Report.error (c.source_reference, "internal error: constructors must have instance, class, or static binding");
}
}
+
+ public override string get_dynamic_property_getter_cname (DynamicProperty prop) {
+ if (prop.dynamic_type.data_type == null
+ || !prop.dynamic_type.data_type.is_subtype_of (gobject_type)) {
+ return base.get_dynamic_property_getter_cname (prop);
+ }
+
+ string getter_cname = "_dynamic_get_%s%d".printf (prop.name, dynamic_property_id++);
+
+ var func = new CCodeFunction (getter_cname, prop.property_type.get_cname ());
+ func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE;
+
+ func.add_parameter (new CCodeFormalParameter ("obj", prop.dynamic_type.get_cname ()));
+
+ var block = new CCodeBlock ();
+ generate_gobject_property_getter_wrapper (prop, block);
+
+ // append to C source file
+ source_type_member_declaration.append (func.copy ());
+
+ func.block = block;
+ source_type_member_definition.append (func);
+
+ return getter_cname;
+ }
+
+ public override string get_dynamic_property_setter_cname (DynamicProperty prop) {
+ if (prop.dynamic_type.data_type == null
+ || !prop.dynamic_type.data_type.is_subtype_of (gobject_type)) {
+ return base.get_dynamic_property_setter_cname (prop);
+ }
+
+ string setter_cname = "_dynamic_set_%s%d".printf (prop.name, dynamic_property_id++);
+
+ var func = new CCodeFunction (setter_cname, "void");
+ func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE;
+
+ func.add_parameter (new CCodeFormalParameter ("obj", prop.dynamic_type.get_cname ()));
+ func.add_parameter (new CCodeFormalParameter ("value", prop.property_type.get_cname ()));
+
+ var block = new CCodeBlock ();
+ generate_gobject_property_setter_wrapper (prop, block);
+
+ // append to C source file
+ source_type_member_declaration.append (func.copy ());
+
+ func.block = block;
+ source_type_member_definition.append (func);
+
+ return setter_cname;
+ }
+
+ 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);
+
+ 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 (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 ());
+ call.add_argument (new CCodeIdentifier ("value"));
+ call.add_argument (new CCodeConstant ("NULL"));
+
+ block.add_statement (new CCodeExpressionStatement (call));
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]