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 }