From: Luca Bruno Date: Sat, 2 Apr 2011 08:09:10 +0000 (+0200) Subject: codegen: Fix look-up of next closure block X-Git-Tag: 0.12.0~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a90b9d2e467ab77ccef7bcd6c26f310cda3b6f2f;p=thirdparty%2Fvala.git codegen: Fix look-up of next closure block Methods that are not closures don't capture parent blocks. Fixes bug 646345. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index ecc80d725..0d9cb222d 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -177,20 +177,26 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } public unowned Block? next_closure_block (Symbol sym) { - unowned Block block = null; while (true) { - block = sym as Block; - if (!(sym is Block || sym is Method)) { + unowned Method method = sym as Method; + if (method != null && !method.closure) { + // parent blocks are not captured by this method + break; + } + + unowned Block block = sym as Block; + if (method == null && block == null) { // no closure block break; } + if (block != null && block.captured) { // closure block found - break; + return block; } sym = sym.parent_symbol; } - return block; + return null; } public CCodeFile header_file; diff --git a/tests/Makefile.am b/tests/Makefile.am index 411f348ab..b643d8a4e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -34,6 +34,7 @@ TESTS = \ methods/bug599892.vala \ methods/bug613483.vala \ methods/bug620673.vala \ + methods/bug646345.vala \ control-flow/break.vala \ control-flow/expressions-conditional.vala \ control-flow/for.vala \ diff --git a/tests/methods/bug646345.vala b/tests/methods/bug646345.vala new file mode 100644 index 000000000..29b84e41b --- /dev/null +++ b/tests/methods/bug646345.vala @@ -0,0 +1,16 @@ +void main() { + var outervar = "outerfoo"; + SourceFunc firstfunc = () => { + outervar = "outerbar"; + return false; + }; + + SourceFunc secondfunc = () => { + var innervar = "innerfoo"; + SourceFunc innerfunc = () => { + innervar = "innerbar"; + return false; + }; + return false; + }; +}