Mercurial Hosting > luan
diff src/luan/interp/LuaStateImpl.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 | 0cdc1da466ee |
line wrap: on
line diff
--- a/src/luan/interp/LuaStateImpl.java Thu Dec 13 02:50:04 2012 +0000 +++ b/src/luan/interp/LuaStateImpl.java Fri Dec 14 05:40:35 2012 +0000 @@ -8,43 +8,86 @@ final class LuaStateImpl implements LuaState { private final LuaTable env = new LuaTable(); - public LuaTable env() { + @Override public LuaTable env() { return env; } - private static class LuaStack { - final LuaStack previousStack; - final Object[] a; + private static class Frame { + final Frame previousFrame; + final LuaClosure closure; + final Object[] stack; final Object[] varArgs; + UpValue[] downValues = null; + + Frame( Frame previousFrame, LuaClosure closure, int stackSize, Object[] varArgs) { + this.previousFrame = previousFrame; + this.closure = closure; + this.stack = new Object[stackSize]; + this.varArgs = varArgs; + } - LuaStack( LuaStack previousStack, int stackSize, Object[] varArgs) { - this.previousStack = previousStack; - this.a = new Object[stackSize]; - this.varArgs = varArgs; + void stackClear(int start,int end) { + if( downValues != null ) { + for( int i=start; i<end; i++ ) { + UpValue downValue = downValues[i]; + if( downValue != null ) { + downValue.close(); + downValues[i] = null; + } + } + } + for( int i=start; i<end; i++ ) { + stack[i] = null; + } + } + + UpValue getUpValue(int index) { + if( downValues==null ) + downValues = new UpValue[stack.length]; + if( downValues[index] == null ) + downValues[index] = new UpValue(stack,index); + return downValues[index]; } } - private LuaStack stack = null; - public Object[] returnValues; - public LuaClosure tailFn; + private Frame frame = null; + Object[] returnValues; + LuaClosure tailFn; - Object[] newStack(int stackSize, Object[] varArgs) { - stack = new LuaStack(stack,stackSize,varArgs); - return stack.a; + // returns stack + Object[] newFrame(LuaClosure closure, int stackSize, Object[] varArgs) { + frame = new Frame(frame,closure,stackSize,varArgs); + return frame.stack; } - void popStack() { + void popFrame() { returnValues = LuaFunction.EMPTY_RTN; tailFn = null; - stack = stack.previousStack; + frame = frame.previousFrame; + } + + Object stackGet(int index) { + return frame.stack[index]; + } + + void stackSet(int index,Object value) { + frame.stack[index] = value; } - public Object[] stack() { - return stack.a; + void stackClear(int start,int end) { + frame.stackClear(start,end); + } + + Object[] varArgs() { + return frame.varArgs; } - public Object[] varArgs() { - return stack.varArgs; + LuaClosure closure() { + return frame.closure; + } + + UpValue getUpValue(int index) { + return frame.getUpValue(index); } }