vala r1989 - in trunk: . gobject



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]