From: Yu Feng Date: Tue, 1 Sep 2009 00:21:45 +0000 (-0400) Subject: Fix `this' access in default signal handlers X-Git-Tag: 0.7.6~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a8f55b462213540c644936fa52693f0e2d039cc0;p=thirdparty%2Fvala.git Fix `this' access in default signal handlers Fixes bug 593734. --- diff --git a/vala/valaclass.vala b/vala/valaclass.vala index dad8b8aaf..bf4105e5d 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -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. * diff --git a/vala/valasignal.vala b/vala/valasignal.vala index f51a92290..a30e11239 100644 --- a/vala/valasignal.vala +++ b/vala/valasignal.vala @@ -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;