]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix look-up of next closure block
authorLuca Bruno <lucabru@src.gnome.org>
Sat, 2 Apr 2011 08:09:10 +0000 (10:09 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 2 Apr 2011 13:46:10 +0000 (15:46 +0200)
Methods that are not closures don't capture parent blocks.

Fixes bug 646345.

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/methods/bug646345.vala [new file with mode: 0644]

index ecc80d725dd40d3c686b4c48d7119a86d25d0b68..0d9cb222da1e888e3b1aa406fb8b512d9d138ea5 100644 (file)
@@ -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;
index 411f348ab31057581b2cc6b240d78cb321adff04..b643d8a4ef98d5605a2f11778ab961956826b25a 100644 (file)
@@ -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 (file)
index 0000000..29b84e4
--- /dev/null
@@ -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;
+       };
+}