compile: Fix closure break marker resetting
authorJean Privat <jean@pryen.org>
Wed, 10 Jun 2009 14:00:28 +0000 (10:00 -0400)
committerJean Privat <jean@pryen.org>
Wed, 10 Jun 2009 14:00:32 +0000 (10:00 -0400)
Set the break marker each time the block is called, not at the top of the function.

Side-effect: this fix also remove a gcc warning.

Signed-off-by: Jean Privat <jean@pryen.org>

src/compiling/compiling_methods.nit
tests/base_closure10.nit [new file with mode: 0644]
tests/sav/base_closure10.sav [new file with mode: 0644]

index b02e9fc..ca03727 100644 (file)
@@ -1528,7 +1528,9 @@ redef class AClosureDef
 
                # Build closure
                var closcnv = "wbclos{v.new_number}"
-               v.add_decl("struct {closcn} {closcnv} = \{{cname}, NULL\};")
+               v.add_decl("struct {closcn} {closcnv};")
+               v.add_instr("{closcnv}.fun = {cname};")
+               v.add_instr("{closcnv}.has_broke = NULL;")
                if cfc_old then 
                        v.add_instr("{closcnv}.variable = closctx->variable;")
                        v.add_instr("{closcnv}.closurevariable = closctx->closurevariable;")
diff --git a/tests/base_closure10.nit b/tests/base_closure10.nit
new file mode 100644 (file)
index 0000000..8fb7b33
--- /dev/null
@@ -0,0 +1,55 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2009 Jean Privat <jean@pryen.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+meth foo with k
+do
+       ' '.output
+       '<'.output
+       1.output
+       k
+       ' '.output
+       '>'.output
+       1.output
+end
+
+meth test
+do
+       '<'.output
+       0.output
+       var i = 0
+       while i < 3 do
+               foo with do
+                       ' '.output
+                       ' '.output
+                       '<'.output
+                       2.output
+                       if i == 1 then
+                               break
+                       end
+                       ' '.output
+                       ' '.output
+                       '>'.output
+                       2.output
+               end
+               i += 1
+       end
+       '>'.output
+       0.output
+end
+
+test
diff --git a/tests/sav/base_closure10.sav b/tests/sav/base_closure10.sav
new file mode 100644 (file)
index 0000000..ccbea92
--- /dev/null
@@ -0,0 +1,12 @@
+<0
+ <1
+  <2
+  >2
+ >1
+ <1
+  <2
+ <1
+  <2
+  >2
+ >1
+>0