From: Jean Privat Date: Wed, 10 Jun 2009 14:00:28 +0000 (-0400) Subject: compile: Fix closure break marker resetting X-Git-Tag: v0.2.1~10 X-Git-Url: http://nitlanguage.org compile: Fix closure break marker resetting 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 --- diff --git a/src/compiling/compiling_methods.nit b/src/compiling/compiling_methods.nit index b02e9fc..ca03727 100644 --- a/src/compiling/compiling_methods.nit +++ b/src/compiling/compiling_methods.nit @@ -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 index 0000000..8fb7b33 --- /dev/null +++ b/tests/base_closure10.nit @@ -0,0 +1,55 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2009 Jean Privat +# +# 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 index 0000000..ccbea92 --- /dev/null +++ b/tests/sav/base_closure10.sav @@ -0,0 +1,12 @@ +<0 + <1 + <2 + >2 + >1 + <1 + <2 + <1 + <2 + >2 + >1 +>0