]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add GObjectSignalModule
authorJürg Billeter <j@bitron.ch>
Fri, 24 Oct 2008 14:47:05 +0000 (14:47 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 24 Oct 2008 14:47:05 +0000 (14:47 +0000)
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

svn path=/trunk/; revision=1898

ChangeLog
gobject/Makefile.am
gobject/valaccodedynamicsignalmodule.vala
gobject/valaccodegenerator.vala
gobject/valaccodemodule.vala
gobject/valadbusmodule.vala
gobject/valagobjectmodule.vala
gobject/valagobjectsignalmodule.vala [moved from gobject/valaccodegeneratorsignal.vala with 90% similarity]

index 8f7a02965edb0b8e599dae49e675c48363ba2b77..f038875ba972fb62ca01ea29062c6ad990ce4de3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+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:
index 80e86e4c359571aea094f1753daf97eebb82fc49..c9b47e3b2c129dcf6e3d9b189d8f5ebe176fad4f 100644 (file)
@@ -20,7 +20,6 @@ libvala_la_VALASOURCES = \
        valaccodedynamicsignalmodule.vala \
        valaccodeelementaccessmodule.vala \
        valaccodegenerator.vala \
-       valaccodegeneratorsignal.vala \
        valaccodegeneratorsourcefile.vala \
        valaccodegeneratorstruct.vala \
        valaccodeinvocationexpressionmodule.vala \
@@ -33,6 +32,7 @@ libvala_la_VALASOURCES = \
        valagobjectclassmodule.vala \
        valagobjectinterfacemodule.vala \
        valagobjectmodule.vala \
+       valagobjectsignalmodule.vala \
        valainterfaceregisterfunction.vala \
        valatyperegisterfunction.vala \
        $(NULL)
index f8b9c60dc90cc1ead7a6d1a4b4aa84c3c96ff29b..81bfc93a1e53da57fcbcd3f49e9acd4de0b801a8 100644 (file)
@@ -124,8 +124,8 @@ public class Vala.CCodeDynamicSignalModule : CCodeModule {
 
                // 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"));
index 801019ecf19ad5c00f0b054c3acce1b001ba09cb..ba24cec4181da756197751036b4531d18de6f61e 100644 (file)
@@ -153,6 +153,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                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);
@@ -998,6 +999,10 @@ public class Vala.CCodeGenerator : CodeGenerator {
                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;
index 0f8875b3b586e492a6aefe5fbb23c6e2d757b63e..50845ebacffd584246862854b34196e047e2e45d 100644 (file)
@@ -64,6 +64,10 @@ public abstract class Vala.CCodeModule {
                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);
        }
@@ -143,4 +147,12 @@ public abstract class Vala.CCodeModule {
        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);
+       }
 }
index 66e36f96573561ea4ae4d4238b861ec232f075ad..51e51927f9fb4804f91487258ea145b02566f800 100644 (file)
@@ -534,12 +534,12 @@ public class Vala.DBusModule : CCodeModule {
                        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;
 
index 9860c9ae17110dd5803d4dd2857d40906c449e18..ec03e4f95a004bb1e7fe41822980e2e70195d929 100644 (file)
@@ -213,7 +213,7 @@ public class Vala.GObjectModule : CCodeModule {
                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);
similarity index 90%
rename from gobject/valaccodegeneratorsignal.vala
rename to gobject/valagobjectsignalmodule.vala
index bb996c16ea981d72aeda82f3128a0eea2d154424..a39c69be8b7ea81e434b0ca8da29d97c0f0fd56b 100644 (file)
@@ -1,4 +1,4 @@
-/* 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");
@@ -33,7 +37,7 @@ public class Vala.CCodeGenerator {
                        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");
@@ -56,12 +60,12 @@ public class Vala.CCodeGenerator {
                }
        }
        
-       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";
@@ -86,7 +90,7 @@ public class Vala.CCodeGenerator {
                        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";
@@ -141,25 +145,25 @@ public class Vala.CCodeGenerator {
                // 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;
                }
                
@@ -173,7 +177,7 @@ public class Vala.CCodeGenerator {
                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 ();
                
@@ -250,7 +254,7 @@ public class Vala.CCodeGenerator {
                                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";
@@ -286,7 +290,7 @@ public class Vala.CCodeGenerator {
                                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"));
@@ -296,7 +300,7 @@ public class Vala.CCodeGenerator {
                                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"));
@@ -315,8 +319,8 @@ public class Vala.CCodeGenerator {
                
                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);
        }
 }