vala r1990 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1990 - in trunk: . gobject
- Date: Thu, 6 Nov 2008 19:34:34 +0000 (UTC)
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]