Mercurial Hosting > luan
comparison src/luan/interp/GenericForStmt.java @ 32:c3eab5a3ce3c
implement closures
git-svn-id: https://luan-java.googlecode.com/svn/trunk@33 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 14 Dec 2012 05:40:35 +0000 |
parents | 5cf15507d77e |
children | e3624b7cd603 |
comparison
equal
deleted
inserted
replaced
31:5cf15507d77e | 32:c3eab5a3ce3c |
---|---|
18 this.block = block; | 18 this.block = block; |
19 } | 19 } |
20 | 20 |
21 @Override public void eval(LuaStateImpl lua) throws LuaException { | 21 @Override public void eval(LuaStateImpl lua) throws LuaException { |
22 LuaFunction iter = Lua.checkFunction( iterExpr.eval(lua) ); | 22 LuaFunction iter = Lua.checkFunction( iterExpr.eval(lua) ); |
23 Object[] stack = lua.stack(); | |
24 try { | 23 try { |
25 while(true) { | 24 while(true) { |
26 Object[] vals = iter.call(lua); | 25 Object[] vals = iter.call(lua); |
27 if( vals.length==0 || vals[0]==null ) | 26 if( vals.length==0 || vals[0]==null ) |
28 break; | 27 break; |
29 for( int i=0; i<nVars; i++ ) { | 28 for( int i=0; i<nVars; i++ ) { |
30 stack[iVars+i] = i < vals.length ? vals[i] : null; | 29 lua.stackSet( iVars+i, i < vals.length ? vals[i] : null ); |
31 } | 30 } |
32 block.eval(lua); | 31 block.eval(lua); |
33 } | 32 } |
34 } catch(BreakException e) { | 33 } catch(BreakException e) { |
35 } finally { | 34 } finally { |
36 for( int i=iVars; i<iVars+nVars; i++ ) { | 35 lua.stackClear(iVars,iVars+nVars); |
37 stack[i] = null; | |
38 } | |
39 } | 36 } |
40 } | 37 } |
41 | 38 |
42 } | 39 } |