Mercurial Hosting > luan
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/interp/NumericForStmt.java Sun Dec 02 07:00:44 2012 +0000 @@ -0,0 +1,40 @@ +package luan.interp; + +import luan.Lua; +import luan.LuaNumber; +import luan.LuaState; +import luan.LuaException; + + +final class NumericForStmt implements Stmt { + private final int iVar; + private final Expr fromExpr; + private final Expr toExpr; + private final Expr stepExpr; + private final Stmt block; + + NumericForStmt(int iVar,Expr fromExpr,Expr toExpr,Expr stepExpr,Stmt block) { + this.iVar = iVar; + this.fromExpr = fromExpr; + this.toExpr = toExpr; + this.stepExpr = stepExpr; + this.block = block; + } + + @Override public void eval(LuaState lua) throws LuaException { + double v = Lua.checkNumber( fromExpr.eval(lua) ).value(); + double limit = Lua.checkNumber( toExpr.eval(lua) ).value(); + double step = Lua.checkNumber( stepExpr.eval(lua) ).value(); + Object[] stack = lua.stack(); + try { + while( step > 0.0 && v <= limit || step < 0.0 && v >= limit ) { + stack[iVar] = new LuaNumber(v); + block.eval(lua); + v += step; + } + } finally { + stack[iVar] = null; + } + } + +}