--- esi.py- 2016-09-15 00:00:00.000000000 +0900 +++ esi.py 2016-09-15 01:00:00.000000000 +0900 @@ -360,10 +360,7 @@ def get_env(info, g=False): return info.get('genv') if g else get_call_inf(info).get('env') def get_flags(info): - return get_call_inf(info).get('flags') - -def loop_add(info, add): - get_call_inf(info)['loop'] += add + return info.get('flags') def was_flags(info, f): flags = get_flags(info) @@ -492,7 +489,7 @@ def do_arr(name, idx, info): def do_kwd(v, expr, info): if v == 'return': r = do_expr( expr[2], info ) - get_call_inf(info)['ret'] = r + info['ret'] = r return None if v == 'if': if do_expr( expr[2], info ): @@ -501,13 +498,11 @@ def do_kwd(v, expr, info): do_expr( expr[4], info ) return None if v == 'while': - loop_add(info, 1) while do_expr( expr[2], info ): do_expr( expr[3], info ) if was_flags(info, 'break'): break was_flags(info, 'continue') - loop_add(info, -1) return None if v == 'for': args = expr[2][2] @@ -515,7 +510,6 @@ def do_kwd(v, expr, info): f = lambda lst, i: lst[:i] + [ [ 'num', '1' ] ] + lst[i:] if is_omit(lst, i) else lst args = reduce( f, [ 0, 2, 4 ], args )[::2] - loop_add(info, 1) do_expr( args[0], info ) while do_expr( args[1], info ): do_expr( expr[3], info ) @@ -523,7 +517,6 @@ def do_kwd(v, expr, info): break was_flags(info, 'continue') do_expr( args[2], info ) - loop_add(info, -1) return None if v in [ 'break', 'continue' ]: get_flags(info).append(v) @@ -597,7 +590,7 @@ def do_blk(blk, info): call_inf = get_call_inf(info) for expr in lst: do_expr(expr, info) - if 'ret' in call_inf: + if 'ret' in info: return flags = get_flags(info) if 'break' in flags or 'continue' in flags: @@ -630,16 +623,20 @@ def do_fcall(name, args, info): env = dict( zip(names, args) ) call_stk = info.get('call_stk') - call_stk.append( { 'name' : name, 'env' : env, 'flags' : [], 'loop' : 0 } ) + call_stk.append( { 'name' : name, 'env' : env } ) do_blk(body, info) call_inf = call_stk.pop() - return call_inf.get('ret', None) + + was_flags(info, 'break') + was_flags(info, 'continue') + ret = info.pop('ret', None) + return ret def do_global(lst, verb): genv = {} - inf = { 'name' : None, 'env' : genv, 'flags' : [], 'loop' : 0 } + inf = { 'name' : None, 'env' : genv } call_stk = [ inf ] - info = { 'lst' : lst, 'call_stk' : call_stk, 'genv' : genv, 'verb' : verb } + info = { 'lst' : lst, 'call_stk' : call_stk, 'genv' : genv, 'flags' : [], 'verb' : verb } blk = [ 'br_s', '{', lst ] do_expr(blk, info) info.get('call_stk').pop()