Mercurial Hosting > luan
comparison src/luan/interp/NumericForStmt.java @ 18:3971113699b8
add NumericForStmt
git-svn-id: https://luan-java.googlecode.com/svn/trunk@19 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Sun, 02 Dec 2012 07:00:44 +0000 |
parents | |
children | d85510d92eee |
comparison
equal
deleted
inserted
replaced
17:09d41f7490a8 | 18:3971113699b8 |
---|---|
1 package luan.interp; | |
2 | |
3 import luan.Lua; | |
4 import luan.LuaNumber; | |
5 import luan.LuaState; | |
6 import luan.LuaException; | |
7 | |
8 | |
9 final class NumericForStmt implements Stmt { | |
10 private final int iVar; | |
11 private final Expr fromExpr; | |
12 private final Expr toExpr; | |
13 private final Expr stepExpr; | |
14 private final Stmt block; | |
15 | |
16 NumericForStmt(int iVar,Expr fromExpr,Expr toExpr,Expr stepExpr,Stmt block) { | |
17 this.iVar = iVar; | |
18 this.fromExpr = fromExpr; | |
19 this.toExpr = toExpr; | |
20 this.stepExpr = stepExpr; | |
21 this.block = block; | |
22 } | |
23 | |
24 @Override public void eval(LuaState lua) throws LuaException { | |
25 double v = Lua.checkNumber( fromExpr.eval(lua) ).value(); | |
26 double limit = Lua.checkNumber( toExpr.eval(lua) ).value(); | |
27 double step = Lua.checkNumber( stepExpr.eval(lua) ).value(); | |
28 Object[] stack = lua.stack(); | |
29 try { | |
30 while( step > 0.0 && v <= limit || step < 0.0 && v >= limit ) { | |
31 stack[iVar] = new LuaNumber(v); | |
32 block.eval(lua); | |
33 v += step; | |
34 } | |
35 } finally { | |
36 stack[iVar] = null; | |
37 } | |
38 } | |
39 | |
40 } |