Mercurial Hosting > luan
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 |