comparison core/src/luan/LuanState.java @ 195:24ede40ee0aa

make MetatableGetter DeepCloneable, scoped, and secure git-svn-id: https://luan-java.googlecode.com/svn/trunk@196 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 03 Jul 2014 08:19:48 +0000
parents cf939124461a
children 8960c81eb4bc
comparison
equal deleted inserted replaced
194:08df375e2e5f 195:24ede40ee0aa
55 private LuanTable global; 55 private LuanTable global;
56 private LuanTable loaded; 56 private LuanTable loaded;
57 private LuanTable preload; 57 private LuanTable preload;
58 private LuanTable searchers; 58 private LuanTable searchers;
59 59
60 private final List<MetatableGetter> mtGetters;
61 final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>(); 60 final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>();
62 61
63 protected LuanState() { 62 protected LuanState() {
64 global = new LuanTable(); 63 global = new LuanTable();
65 global.put("_G",global); 64 global.put("_G",global);
66 loaded = new LuanTable(); 65 loaded = new LuanTable();
67 preload = new LuanTable(); 66 preload = new LuanTable();
68 searchers = new LuanTable(); 67 searchers = new LuanTable();
69 mtGetters = new ArrayList<MetatableGetter>();
70 }
71
72 protected LuanState(LuanState luan) {
73 mtGetters = new ArrayList<MetatableGetter>(luan.mtGetters);
74 } 68 }
75 69
76 @Override public void deepenClone(LuanState clone,DeepCloner cloner) { 70 @Override public void deepenClone(LuanState clone,DeepCloner cloner) {
77 clone.global = cloner.deepClone(global); 71 clone.global = cloner.deepClone(global);
78 clone.loaded = cloner.deepClone(loaded); 72 clone.loaded = cloner.deepClone(loaded);
144 throw new RuntimeException(e); 138 throw new RuntimeException(e);
145 } 139 }
146 } 140 }
147 141
148 public final LuanTable getMetatable(Object obj) { 142 public final LuanTable getMetatable(Object obj) {
149 if( obj instanceof LuanTable ) { 143 return getMetatable(obj,null);
150 LuanTable table = (LuanTable)obj;
151 return table.getMetatable();
152 }
153 for( MetatableGetter mg : mtGetters ) {
154 LuanTable table = mg.getMetatable(obj);
155 if( table != null )
156 return table;
157 }
158 return null;
159 } 144 }
160 145
161 public final void addMetatableGetter(MetatableGetter mg) { 146 public abstract LuanTable getMetatable(Object obj,MetatableGetter beforeThis);
162 mtGetters.add(mg); 147
163 } 148 public abstract void addMetatableGetter(MetatableGetter mg);
164 149
165 public final LuanBit bit(LuanElement el) { 150 public final LuanBit bit(LuanElement el) {
166 return new LuanBit(this,el); 151 return new LuanBit(this,el);
167 } 152 }
168 153