comparison core/src/luan/impl/LuanStateImpl.java @ 194:08df375e2e5f

remove EnvGetter git-svn-id: https://luan-java.googlecode.com/svn/trunk@195 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Wed, 02 Jul 2014 04:52:25 +0000
parents 3dcb0f9bee82
children 24ede40ee0aa
comparison
equal deleted inserted replaced
193:66ed8886abc0 194:08df375e2e5f
55 } 55 }
56 56
57 private Frame frame = null; 57 private Frame frame = null;
58 Object returnValues; 58 Object returnValues;
59 Closure tailFn; 59 Closure tailFn;
60 Map<UpValue.EnvGetter,UpValue> envs = new HashMap<UpValue.EnvGetter,UpValue>();
61 60
62 LuanStateImpl() {} 61 LuanStateImpl() {}
63 62
64 private LuanStateImpl(LuanStateImpl luan) { 63 private LuanStateImpl(LuanStateImpl luan) {
65 super(luan); 64 super(luan);
67 66
68 @Override public LuanState shallowClone() { 67 @Override public LuanState shallowClone() {
69 // if( frame != null ) 68 // if( frame != null )
70 // throw new IllegalStateException("frame isn't null"); 69 // throw new IllegalStateException("frame isn't null");
71 return new LuanStateImpl(this); 70 return new LuanStateImpl(this);
72 }
73
74 @Override public void deepenClone(LuanState clone,DeepCloner cloner) {
75 super.deepenClone(clone,cloner);
76 LuanStateImpl cloneImpl = (LuanStateImpl)clone;
77 cloneImpl.envs = new HashMap<UpValue.EnvGetter,UpValue>();
78 for( Map.Entry<UpValue.EnvGetter,UpValue> entry : envs.entrySet() ) {
79 cloneImpl.envs.put( entry.getKey(), cloner.deepClone(entry.getValue()) );
80 }
81 } 71 }
82 72
83 // returns stack 73 // returns stack
84 Object[] newFrame(Closure closure, int stackSize, Object[] varArgs) { 74 Object[] newFrame(Closure closure, int stackSize, Object[] varArgs) {
85 returnValues = LuanFunction.NOTHING; 75 returnValues = LuanFunction.NOTHING;
116 106
117 UpValue getUpValue(int index) { 107 UpValue getUpValue(int index) {
118 return frame.getUpValue(index); 108 return frame.getUpValue(index);
119 } 109 }
120 110
121 UpValue getUpValue(UpValue.EnvGetter getter) throws LuanException {
122 UpValue uv = envs.get(getter);
123 if( uv == null ) {
124 LuanTable env = new LuanTable();
125 uv = new UpValue(env);
126 envs.put(getter,uv);
127 }
128 return uv;
129 }
130
131 @Override public LuanTable currentEnvironment() { 111 @Override public LuanTable currentEnvironment() {
132 if( frame==null ) 112 if( frame==null )
133 return null; 113 return null;
134 return (LuanTable)frame.closure.upValues()[0].get(); 114 return (LuanTable)frame.closure.upValues()[0].get();
135 } 115 }