+2008-10-24 Jürg Billeter <j@bitron.ch>
+
+ * gobject/Makefile.am:
+ * gobject/valaccodedynamicsignalmodule.vala:
+ * gobject/valaccodegenerator.vala:
+ * gobject/valaccodemodule.vala:
+ * gobject/valadbusmodule.vala:
+ * gobject/valagobjectmodule.vala:
+ * gobject/valagobjectsignalmodule.vala:
+
+ Add GObjectSignalModule
+
2008-10-24 Jürg Billeter <j@bitron.ch>
* gobject/valaccodegenerator.vala:
valaccodedynamicsignalmodule.vala \
valaccodeelementaccessmodule.vala \
valaccodegenerator.vala \
- valaccodegeneratorsignal.vala \
valaccodegeneratorsourcefile.vala \
valaccodegeneratorstruct.vala \
valaccodeinvocationexpressionmodule.vala \
valagobjectclassmodule.vala \
valagobjectinterfacemodule.vala \
valagobjectmodule.vala \
+ valagobjectsignalmodule.vala \
valainterfaceregisterfunction.vala \
valatyperegisterfunction.vala \
$(NULL)
// FIXME should only be done once per marshaller
var register_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_object_register_marshaller"));
- codegen.generate_marshaller (node.get_parameters (), node.return_type, true);
- register_call.add_argument (new CCodeIdentifier (codegen.get_marshaller_function (node.get_parameters (), node.return_type, null, true)));
+ head.generate_marshaller (node.get_parameters (), node.return_type, true);
+ register_call.add_argument (new CCodeIdentifier (head.get_marshaller_function (node.get_parameters (), node.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"));
head = new GObjectModule (this, head);
head = new GObjectClassModule (this, head);
head = new GObjectInterfaceModule (this, head);
+ head = new GObjectSignalModule (this, head);
head = new DBusModule (this, head);
predefined_marshal_set = new HashSet<string> (str_hash, str_equal);
current_return_type = null;
}
+ public override void visit_signal (Signal sig) {
+ head.visit_signal (sig);
+ }
+
public override void visit_constructor (Constructor c) {
current_method_inner_error = false;
in_constructor = true;
next.visit_method (m);
}
+ public virtual void visit_signal (Signal sig) {
+ next.visit_signal (sig);
+ }
+
public virtual void visit_creation_method (CreationMethod m) {
next.visit_creation_method (m);
}
public virtual string get_dynamic_signal_disconnect_wrapper_name (DynamicSignal node) {
return next.get_dynamic_signal_disconnect_wrapper_name (node);
}
+
+ public virtual void generate_marshaller (Gee.List<FormalParameter> params, DataType return_type, bool dbus = false) {
+ next.generate_marshaller (params, return_type, dbus);
+ }
+
+ public virtual string get_marshaller_function (Gee.List<FormalParameter> params, DataType return_type, string? prefix = null, bool dbus = false) {
+ return next.get_marshaller_function (params, return_type, prefix, dbus);
+ }
}
dbus_methods.append ("{ (GCallback) ");
dbus_methods.append (generate_dbus_wrapper (m, bindable));
dbus_methods.append (", ");
- dbus_methods.append (codegen.get_marshaller_function (parameters, codegen.bool_type, null, true));
+ dbus_methods.append (head.get_marshaller_function (parameters, codegen.bool_type, null, true));
dbus_methods.append (", ");
dbus_methods.append (blob_len.to_string ());
dbus_methods.append (" },\n");
- codegen.generate_marshaller (parameters, codegen.bool_type, true);
+ head.generate_marshaller (parameters, codegen.bool_type, true);
long start = blob.len;
csignew.add_argument (new CCodeConstant ("NULL"));
csignew.add_argument (new CCodeConstant ("NULL"));
- string marshaller = codegen.get_marshaller_function (sig.get_parameters (), sig.return_type);
+ string marshaller = head.get_marshaller_function (sig.get_parameters (), sig.return_type);
var marshal_arg = new CCodeIdentifier (marshaller);
csignew.add_argument (marshal_arg);
-/* valaccodegeneratorsignal.vala
+/* valagobjectsignalmodule.vala
*
* Copyright (C) 2006-2008 Jürg Billeter, Raffaele Sandrini
*
using GLib;
-public class Vala.CCodeGenerator {
+public class Vala.GObjectSignalModule : CCodeModule {
+ public GObjectSignalModule (CCodeGenerator codegen, CCodeModule? next) {
+ base (codegen, next);
+ }
+
private string get_marshaller_type_name (DataType t, bool dbus = false) {
if (t is PointerType || t.type_parameter != null) {
return ("POINTER");
if (dbus) {
return ("BOXED");
} else {
- if (((ArrayType) t).element_type.data_type == string_type.data_type) {
+ if (((ArrayType) t).element_type.data_type == codegen.string_type.data_type) {
return ("BOXED_INT");
} else {
return ("POINTER_INT");
}
}
- public string get_marshaller_function (Gee.List<FormalParameter> params, DataType return_type, string? prefix = null, bool dbus = false) {
+ public override string get_marshaller_function (Gee.List<FormalParameter> params, DataType return_type, string? prefix = null, bool dbus = false) {
var signature = get_marshaller_signature (params, return_type, dbus);
string ret;
if (prefix == null) {
- if (predefined_marshal_set.contains (signature)) {
+ if (codegen.predefined_marshal_set.contains (signature)) {
prefix = "g_cclosure_marshal";
} else {
prefix = "g_cclosure_user_marshal";
return "gpointer";
} else if (t is VoidType) {
return "void";
- } else if (t.data_type == string_type.data_type) {
+ } else if (t.data_type == codegen.string_type.data_type) {
return "const char*";
} else if (t.data_type is Class || t.data_type is Interface) {
return "gpointer";
// parent_symbol may be null for late bound signals
if (sig.parent_symbol != null) {
var dt = sig.parent_symbol as TypeSymbol;
- if (!dt.is_subtype_of (gobject_type)) {
+ if (!dt.is_subtype_of (codegen.gobject_type)) {
sig.error = true;
Report.error (sig.source_reference, "Only classes and interfaces deriving from GLib.Object support signals. `%s' does not derive from GLib.Object.".printf (dt.get_full_name ()));
return;
}
}
- sig.accept_children (this);
+ sig.accept_children (codegen);
generate_marshaller (sig.get_parameters (), sig.return_type);
}
- public void generate_marshaller (Gee.List<FormalParameter> params, DataType return_type, bool dbus = false) {
+ public override void generate_marshaller (Gee.List<FormalParameter> params, DataType return_type, bool dbus = false) {
string signature;
int n_params, i;
/* check whether a signal with the same signature already exists for this source file (or predefined) */
signature = get_marshaller_signature (params, return_type, dbus);
- if (predefined_marshal_set.contains (signature) || user_marshal_set.contains (signature)) {
+ if (codegen.predefined_marshal_set.contains (signature) || codegen.user_marshal_set.contains (signature)) {
return;
}
signal_marshaller.add_parameter (new CCodeFormalParameter ("invocation_hint", "gpointer"));
signal_marshaller.add_parameter (new CCodeFormalParameter ("marshal_data", "gpointer"));
- source_signal_marshaller_declaration.append (signal_marshaller.copy ());
+ codegen.source_signal_marshaller_declaration.append (signal_marshaller.copy ());
var marshaller_body = new CCodeBlock ();
if (dbus) {
get_value_function = "g_value_get_boxed";
} else {
- if (((ArrayType) p.parameter_type).element_type.data_type == string_type.data_type) {
+ if (((ArrayType) p.parameter_type).element_type.data_type == codegen.string_type.data_type) {
get_value_function = "g_value_get_boxed";
} else {
get_value_function = "g_value_get_pointer";
if (dbus) {
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_boxed"));
} else {
- if (((ArrayType) return_type).element_type.data_type == string_type.data_type) {
+ if (((ArrayType) return_type).element_type.data_type == codegen.string_type.data_type) {
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_boxed"));
} else {
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer"));
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer"));
} else if (return_type is ErrorType) {
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer"));
- } else if (return_type.data_type == string_type.data_type) {
+ } else if (return_type.data_type == codegen.string_type.data_type) {
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_string"));
} else if (return_type.data_type is Class || return_type.data_type is Interface) {
set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_object"));
signal_marshaller.block = marshaller_body;
- source_signal_marshaller_definition.append (signal_marshaller);
- user_marshal_set.add (signature);
+ codegen.source_signal_marshaller_definition.append (signal_marshaller);
+ codegen.user_marshal_set.add (signature);
}
}