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;
+		}
+	}
+
+}