vala r1990 - in trunk: . gobject



Author: juergbi
Date: Thu Nov  6 19:34:34 2008
New Revision: 1990
URL: http://svn.gnome.org/viewvc/vala?rev=1990&view=rev

Log:
2008-11-06  JÃrg Billeter  <j bitron ch>

	* gobject/Makefile.am:
	* gobject/valaccodedynamicsignalmodule.vala:
	* gobject/valaccodegenerator.vala:
	* gobject/valadbusclientmodule.vala:
	* gobject/valagerrormodule.vala:
	* gobject/valagobjectmodule.vala:

	Move dynamic signal generation to GObjectModule and
	DBusClientModule


Removed:
   trunk/gobject/valaccodedynamicsignalmodule.vala
Modified:
   trunk/ChangeLog
   trunk/gobject/Makefile.am
   trunk/gobject/valaccodegenerator.vala
   trunk/gobject/valadbusclientmodule.vala
   trunk/gobject/valagerrormodule.vala
   trunk/gobject/valagobjectmodule.vala

Modified: trunk/gobject/Makefile.am
==============================================================================
--- trunk/gobject/Makefile.am	(original)
+++ trunk/gobject/Makefile.am	Thu Nov  6 19:34:34 2008
@@ -18,7 +18,6 @@
 	valaccodecompiler.vala \
 	valaccodecontrolflowmodule.vala \
 	valaccodedelegatemodule.vala \
-	valaccodedynamicsignalmodule.vala \
 	valaccodegenerator.vala \
 	valaccodeinvocationexpressionmodule.vala \
 	valaccodememberaccessmodule.vala \

Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala	(original)
+++ trunk/gobject/valaccodegenerator.vala	Thu Nov  6 19:34:34 2008
@@ -41,7 +41,6 @@
 		head = new CCodeInvocationExpressionModule (this, head);
 		head = new CCodeArrayModule (this, head);
 		head = new CCodeDelegateModule (this, head);
-		head = new CCodeDynamicSignalModule (this, head);
 		head = new GErrorModule (this, head);
 		head = new GTypeModule (this, head);
 		head = new GObjectModule (this, head);

Modified: trunk/gobject/valadbusclientmodule.vala
==============================================================================
--- trunk/gobject/valadbusclientmodule.vala	(original)
+++ trunk/gobject/valadbusclientmodule.vala	Thu Nov  6 19:34:34 2008
@@ -678,4 +678,124 @@
 		prop_proxy_unref.add_argument (new CCodeIdentifier ("property_proxy"));
 		block.add_statement (new CCodeExpressionStatement (prop_proxy_unref));
 	}
+
+	public override string get_dynamic_signal_connect_wrapper_name (DynamicSignal sig) {
+		if (sig.dynamic_type.data_type != dbus_object_type) {
+			return base.get_dynamic_signal_connect_wrapper_name (sig);
+		}
+
+		string connect_wrapper_name = "_%sconnect".printf (get_dynamic_signal_cname (sig));
+		var func = new CCodeFunction (connect_wrapper_name, "void");
+		func.add_parameter (new CCodeFormalParameter ("obj", "gpointer"));
+		func.add_parameter (new CCodeFormalParameter ("signal_name", "const char *"));
+		func.add_parameter (new CCodeFormalParameter ("handler", "GCallback"));
+		func.add_parameter (new CCodeFormalParameter ("data", "gpointer"));
+		var block = new CCodeBlock ();
+		generate_dbus_connect_wrapper (sig, block);
+
+		// append to C source file
+		source_type_member_declaration.append (func.copy ());
+
+		func.block = block;
+		source_type_member_definition.append (func);
+
+		return connect_wrapper_name;
+	}
+
+	public override string get_dynamic_signal_disconnect_wrapper_name (DynamicSignal sig) {
+		if (sig.dynamic_type.data_type != dbus_object_type) {
+			return base.get_dynamic_signal_disconnect_wrapper_name (sig);
+		}
+
+		string disconnect_wrapper_name = "_%sdisconnect".printf (get_dynamic_signal_cname (sig));
+		var func = new CCodeFunction (disconnect_wrapper_name, "void");
+		func.add_parameter (new CCodeFormalParameter ("obj", "gpointer"));
+		func.add_parameter (new CCodeFormalParameter ("signal_name", "const char *"));
+		func.add_parameter (new CCodeFormalParameter ("handler", "GCallback"));
+		func.add_parameter (new CCodeFormalParameter ("data", "gpointer"));
+		var block = new CCodeBlock ();
+		generate_dbus_disconnect_wrapper (sig, block);
+
+		// append to C source file
+		source_type_member_declaration.append (func.copy ());
+
+		func.block = block;
+		source_type_member_definition.append (func);
+
+		return disconnect_wrapper_name;
+	}
+
+	void generate_dbus_connect_wrapper (DynamicSignal sig, CCodeBlock block) {
+		var m = (Method) sig.handler.symbol_reference;
+
+		sig.accept (codegen);
+
+		// FIXME should only be done once per marshaller
+		var register_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_object_register_marshaller"));
+		head.generate_marshaller (sig.get_parameters (), sig.return_type, true);
+		register_call.add_argument (new CCodeIdentifier (head.get_marshaller_function (sig.get_parameters (), sig.return_type, null, true)));
+		register_call.add_argument (new CCodeIdentifier ("G_TYPE_NONE"));
+
+		var add_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_add_signal"));
+		add_call.add_argument (new CCodeIdentifier ("obj"));
+		add_call.add_argument (new CCodeConstant ("\"%s\"".printf (Symbol.lower_case_to_camel_case (sig.name))));
+
+		bool first = true;
+		foreach (FormalParameter param in m.get_parameters ()) {
+			if (first) {
+				// skip sender parameter
+				first = false;
+				continue;
+			}
+
+			var array_type = param.parameter_type as ArrayType;
+			if (array_type != null) {
+				if (array_type.element_type.data_type == string_type.data_type) {
+					register_call.add_argument (new CCodeIdentifier ("G_TYPE_STRV"));
+					add_call.add_argument (new CCodeIdentifier ("G_TYPE_STRV"));
+				} else {
+					if (array_type.element_type.data_type.get_type_id () == null) {
+						Report.error (param.source_reference, "unsupported parameter type for D-Bus signals");
+						return;
+					}
+
+					var carray_type = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_type_get_collection"));
+					carray_type.add_argument (new CCodeConstant ("\"GArray\""));
+					carray_type.add_argument (new CCodeIdentifier (array_type.element_type.data_type.get_type_id ()));
+					register_call.add_argument (carray_type);
+					add_call.add_argument (carray_type);
+				}
+			} else {
+				if (param.parameter_type.get_type_id () == null) {
+					Report.error (param.source_reference, "unsupported parameter type for D-Bus signals");
+					return;
+				}
+
+				register_call.add_argument (new CCodeIdentifier (param.parameter_type.get_type_id ()));
+				add_call.add_argument (new CCodeIdentifier (param.parameter_type.get_type_id ()));
+			}
+		}
+		register_call.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+		add_call.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+		block.add_statement (new CCodeExpressionStatement (register_call));
+		block.add_statement (new CCodeExpressionStatement (add_call));
+
+		var call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_connect_signal"));
+		call.add_argument (new CCodeIdentifier ("obj"));
+		call.add_argument (new CCodeIdentifier ("signal_name"));
+		call.add_argument (new CCodeIdentifier ("handler"));
+		call.add_argument (new CCodeIdentifier ("data"));
+		call.add_argument (new CCodeConstant ("NULL"));
+		block.add_statement (new CCodeExpressionStatement (call));
+	}
+
+	void generate_dbus_disconnect_wrapper (DynamicSignal sig, CCodeBlock block) {
+		var call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_disconnect_signal"));
+		call.add_argument (new CCodeIdentifier ("obj"));
+		call.add_argument (new CCodeIdentifier ("signal_name"));
+		call.add_argument (new CCodeIdentifier ("handler"));
+		call.add_argument (new CCodeIdentifier ("data"));
+		block.add_statement (new CCodeExpressionStatement (call));
+	}
 }

Modified: trunk/gobject/valagerrormodule.vala
==============================================================================
--- trunk/gobject/valagerrormodule.vala	(original)
+++ trunk/gobject/valagerrormodule.vala	Thu Nov  6 19:34:34 2008
@@ -23,7 +23,7 @@
 using GLib;
 using Gee;
 
-public class Vala.GErrorModule : CCodeDynamicSignalModule {
+public class Vala.GErrorModule : CCodeDelegateModule {
 	private int current_try_id = 0;
 	private int next_try_id = 0;
 

Modified: trunk/gobject/valagobjectmodule.vala
==============================================================================
--- trunk/gobject/valagobjectmodule.vala	(original)
+++ trunk/gobject/valagobjectmodule.vala	Thu Nov  6 19:34:34 2008
@@ -25,6 +25,7 @@
 
 public class Vala.GObjectModule : GTypeModule {
 	int dynamic_property_id;
+	int signal_wrapper_id;
 
 	public GObjectModule (CCodeGenerator codegen, CCodeModule? next) {
 		base (codegen, next);
@@ -1689,5 +1690,56 @@
 
 		block.add_statement (new CCodeExpressionStatement (call));
 	}
+
+	public override string get_dynamic_signal_cname (DynamicSignal node) {
+		return "dynamic_%s%d_".printf (node.name, signal_wrapper_id++);
+	}
+
+	public override string get_dynamic_signal_connect_wrapper_name (DynamicSignal sig) {
+		if (sig.dynamic_type.data_type == null
+		    || !sig.dynamic_type.data_type.is_subtype_of (gobject_type)) {
+			return base.get_dynamic_signal_connect_wrapper_name (sig);
+		}
+
+		string connect_wrapper_name = "_%sconnect".printf (get_dynamic_signal_cname (sig));
+		var func = new CCodeFunction (connect_wrapper_name, "void");
+		func.add_parameter (new CCodeFormalParameter ("obj", "gpointer"));
+		func.add_parameter (new CCodeFormalParameter ("signal_name", "const char *"));
+		func.add_parameter (new CCodeFormalParameter ("handler", "GCallback"));
+		func.add_parameter (new CCodeFormalParameter ("data", "gpointer"));
+		var block = new CCodeBlock ();
+		generate_gobject_connect_wrapper (sig, block);
+
+		// append to C source file
+		source_type_member_declaration.append (func.copy ());
+
+		func.block = block;
+		source_type_member_definition.append (func);
+
+		return connect_wrapper_name;
+	}
+
+	void generate_gobject_connect_wrapper (DynamicSignal sig, CCodeBlock block) {
+		var m = (Method) sig.handler.symbol_reference;
+
+		sig.accept (codegen);
+
+		string connect_func = "g_signal_connect_object";
+		if (m.binding != MemberBinding.INSTANCE) {
+			connect_func = "g_signal_connect";
+		}
+
+		var call = new CCodeFunctionCall (new CCodeIdentifier (connect_func));
+		call.add_argument (new CCodeIdentifier ("obj"));
+		call.add_argument (new CCodeIdentifier ("signal_name"));
+		call.add_argument (new CCodeIdentifier ("handler"));
+		call.add_argument (new CCodeIdentifier ("data"));
+
+		if (m.binding == MemberBinding.INSTANCE) {
+			call.add_argument (new CCodeConstant ("0"));
+		}
+
+		block.add_statement (new CCodeExpressionStatement (call));
+	}
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]