]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix `this' access in default signal handlers
authorYu Feng <rainwoodman@gmail.com>
Tue, 1 Sep 2009 00:21:45 +0000 (20:21 -0400)
committerJürg Billeter <j@bitron.ch>
Wed, 16 Sep 2009 22:44:27 +0000 (00:44 +0200)
Fixes bug 593734.

vala/valaclass.vala
vala/valasignal.vala

index dad8b8aaf6dd54c0cb2a07ac93a09a956fd29e7f..bf4105e5d38c9d7ae3934c68875b9db88e3b4a9f 100644 (file)
@@ -360,6 +360,36 @@ public class Vala.Class : ObjectTypeSymbol {
                scope.add (m.name, m);
        }
        
+       /**
+        * Adds the specified method as a hidden member to this class,
+        * primarily used for default signal handlers.
+        *
+        * The hidden methods are not part of the `methods` collection.
+        *
+        * There may also be other use cases, eg, convert array.resize() to
+        * this type of method?
+        *
+        * @param m a method
+        */
+       public void add_hidden_method (Method m) {
+               if (m.binding == MemberBinding.INSTANCE) {
+                       if (m.this_parameter != null) {
+                               m.scope.remove (m.this_parameter.name);
+                       }
+                       m.this_parameter = new FormalParameter ("this", get_this_type ());
+                       m.scope.add (m.this_parameter.name, m.this_parameter);
+               }
+               if (!(m.return_type is VoidType) && m.get_postconditions ().size > 0) {
+                       if (m.result_var != null) {
+                               m.scope.remove (m.result_var.name);
+                       }
+                       m.result_var = new LocalVariable (m.return_type.copy (), "result");
+                       m.result_var.is_result = true;
+               }
+
+               scope.add (null, m);
+       }
+
        /**
         * Returns a copy of the list of methods.
         *
index f51a92290091553005b967569663a259a251e330..a30e112399045607fb7672ff4c5739f4658b6982 100644 (file)
@@ -247,6 +247,8 @@ public class Vala.Signal : Member, Lockable {
 
                if (is_virtual) {
                        default_handler = new Method (name, return_type, source_reference);
+
+                       default_handler.owner = owner;
                        default_handler.access = access;
                        default_handler.external = external;
                        default_handler.is_virtual = true;
@@ -254,11 +256,14 @@ public class Vala.Signal : Member, Lockable {
                        default_handler.signal_reference = this;
                        default_handler.body = body;
 
+
                        foreach (FormalParameter param in parameters) {
                                default_handler.add_parameter (param);
                        }
 
-                       parent_symbol.scope.add (null, default_handler);
+                       var cl = parent_symbol as Class;
+
+                       cl.add_hidden_method (default_handler);
                        default_handler.check (analyzer);
                }
                return !error;