Mercurial Hosting > luan
comparison core/src/luan/impl/MtGetterLink.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 | |
children |
comparison
equal
deleted
inserted
replaced
194:08df375e2e5f | 195:24ede40ee0aa |
---|---|
1 package luan.impl; | |
2 | |
3 import luan.MetatableGetter; | |
4 import luan.LuanTable; | |
5 import luan.DeepCloneable; | |
6 import luan.DeepCloner; | |
7 | |
8 | |
9 final class MtGetterLink implements DeepCloneable<MtGetterLink> { | |
10 private MetatableGetter mg; | |
11 private MtGetterLink next; | |
12 | |
13 private MtGetterLink() {} | |
14 | |
15 MtGetterLink(MetatableGetter mg,MtGetterLink next) { | |
16 this.mg = mg; | |
17 this.next = next; | |
18 } | |
19 | |
20 LuanTable getMetatable(Object obj,MetatableGetter beforeThis) { | |
21 if( beforeThis != null ) { | |
22 if( beforeThis==mg ) | |
23 beforeThis = null; | |
24 } else { | |
25 LuanTable mt = mg.getMetatable(obj); | |
26 if( mt != null ) | |
27 return mt; | |
28 } | |
29 return next==null ? null : next.getMetatable(obj,beforeThis); | |
30 } | |
31 | |
32 boolean contains(MetatableGetter mg) { | |
33 return this.mg==mg || next!=null && next.contains(mg); | |
34 } | |
35 | |
36 @Override public MtGetterLink shallowClone() { | |
37 return new MtGetterLink(); | |
38 } | |
39 | |
40 @Override public void deepenClone(MtGetterLink clone,DeepCloner cloner) { | |
41 clone.mg = cloner.deepClone(mg); | |
42 clone.next = cloner.deepClone(next); | |
43 } | |
44 } |