+++ /dev/null
-/* valaccodebinding.vala
- *
- * Copyright (C) 2007-2008 Jürg Billeter
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
-
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
-
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Author:
- * Jürg Billeter <j@bitron.ch>
- */
-
-using GLib;
-
-/**
- * The link between a source code node and generated code.
- */
-public abstract class Vala.CCodeBinding : CodeBinding {
- /**
- * The C Code generator.
- */
- public CCodeGenerator codegen { get; set; }
-
- public CCodeModule head {
- get { return codegen.head; }
- }
-
- /**
- * Generate code for this source code node.
- */
- public virtual void emit () {
- }
-
- public CCodeBinding? code_binding (CodeNode node) {
- return (CCodeBinding) node.get_code_binding (codegen);
- }
-}
-/* valaccodedynamicsignalbinding.vala
+/* valaccodedynamicsignalmodule.vala
*
* Copyright (C) 2007-2008 Jürg Billeter
*
/**
* The link between a dynamic signal and generated code.
*/
-public class Vala.CCodeDynamicSignalBinding : CCodeBinding {
- public Signal node { get; set; }
-
- public CCodeDynamicSignalBinding (CCodeGenerator codegen, DynamicSignal node) {
- this.node = node;
- this.codegen = codegen;
+public class Vala.CCodeDynamicSignalModule : CCodeModule {
+ public CCodeDynamicSignalModule (CCodeGenerator codegen, CCodeModule? next) {
+ base (codegen, next);
}
- string? connect_wrapper_name;
- string? disconnect_wrapper_name;
-
- string? dynamic_cname;
-
- private static int signal_wrapper_id;
+ int signal_wrapper_id;
- public string get_dynamic_cname () {
- if (dynamic_cname == null) {
- dynamic_cname = "dynamic_%s%d_".printf (node.name, signal_wrapper_id++);
- }
- return dynamic_cname;
+ public override string get_dynamic_signal_cname (DynamicSignal node) {
+ return "dynamic_%s%d_".printf (node.name, signal_wrapper_id++);
}
- public string get_connect_wrapper_name () {
+ public override string get_dynamic_signal_connect_wrapper_name (DynamicSignal node) {
var dynamic_signal = (DynamicSignal) node;
- if (connect_wrapper_name == null) {
- connect_wrapper_name = "_%sconnect".printf (get_dynamic_cname ());
- 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 ();
- if (dynamic_signal.dynamic_type.data_type == codegen.dbus_object_type) {
- generate_dbus_connect_wrapper (block);
- } else if (dynamic_signal.dynamic_type.data_type != null
- && dynamic_signal.dynamic_type.data_type.is_subtype_of (codegen.gobject_type)) {
- generate_gobject_connect_wrapper (block);
- } else {
- Report.error (node.source_reference, "dynamic signals are not supported for `%s'".printf (dynamic_signal.dynamic_type.to_string ()));
- }
+ string connect_wrapper_name = "_%sconnect".printf (get_dynamic_signal_cname (node));
+ 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 ();
+ if (dynamic_signal.dynamic_type.data_type == codegen.dbus_object_type) {
+ generate_dbus_connect_wrapper (node, block);
+ } else if (dynamic_signal.dynamic_type.data_type != null
+ && dynamic_signal.dynamic_type.data_type.is_subtype_of (codegen.gobject_type)) {
+ generate_gobject_connect_wrapper (node, block);
+ } else {
+ Report.error (node.source_reference, "dynamic signals are not supported for `%s'".printf (dynamic_signal.dynamic_type.to_string ()));
+ }
- // append to C source file
- codegen.source_type_member_declaration.append (func.copy ());
+ // append to C source file
+ codegen.source_type_member_declaration.append (func.copy ());
- func.block = block;
- codegen.source_type_member_definition.append (func);
- }
+ func.block = block;
+ codegen.source_type_member_definition.append (func);
return connect_wrapper_name;
}
- public string get_disconnect_wrapper_name () {
+ public override string get_dynamic_signal_disconnect_wrapper_name (DynamicSignal node) {
var dynamic_signal = (DynamicSignal) node;
- if (disconnect_wrapper_name == null) {
- disconnect_wrapper_name = "_%sdisconnect".printf (get_dynamic_cname ());
- 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 ();
- if (dynamic_signal.dynamic_type.data_type == codegen.dbus_object_type) {
- generate_dbus_disconnect_wrapper (block);
- } else {
- Report.error (node.source_reference, "dynamic signals are not supported for `%s'".printf (dynamic_signal.dynamic_type.to_string ()));
- }
+ string disconnect_wrapper_name = "_%sdisconnect".printf (get_dynamic_signal_cname (node));
+ 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 ();
+ if (dynamic_signal.dynamic_type.data_type == codegen.dbus_object_type) {
+ generate_dbus_disconnect_wrapper (node, block);
+ } else {
+ Report.error (node.source_reference, "dynamic signals are not supported for `%s'".printf (dynamic_signal.dynamic_type.to_string ()));
+ }
- // append to C source file
- codegen.source_type_member_declaration.append (func.copy ());
+ // append to C source file
+ codegen.source_type_member_declaration.append (func.copy ());
- func.block = block;
- codegen.source_type_member_definition.append (func);
- }
+ func.block = block;
+ codegen.source_type_member_definition.append (func);
return disconnect_wrapper_name;
}
- void generate_gobject_connect_wrapper (CCodeBlock block) {
+ void generate_gobject_connect_wrapper (DynamicSignal node, CCodeBlock block) {
var dynamic_signal = (DynamicSignal) node;
var m = (Method) dynamic_signal.handler.symbol_reference;
block.add_statement (new CCodeExpressionStatement (call));
}
- void generate_dbus_connect_wrapper (CCodeBlock block) {
+ void generate_dbus_connect_wrapper (DynamicSignal node, CCodeBlock block) {
var dynamic_signal = (DynamicSignal) node;
var m = (Method) dynamic_signal.handler.symbol_reference;
block.add_statement (new CCodeExpressionStatement (call));
}
- void generate_dbus_disconnect_wrapper (CCodeBlock block) {
+ void generate_dbus_disconnect_wrapper (DynamicSignal node, CCodeBlock block) {
var dynamic_signal = (DynamicSignal) node;
var call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_disconnect_signal"));