Mercurial Hosting > luan
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/src/luan/impl/MtGetterLink.java Thu Jul 03 08:19:48 2014 +0000 @@ -0,0 +1,44 @@ +package luan.impl; + +import luan.MetatableGetter; +import luan.LuanTable; +import luan.DeepCloneable; +import luan.DeepCloner; + + +final class MtGetterLink implements DeepCloneable<MtGetterLink> { + private MetatableGetter mg; + private MtGetterLink next; + + private MtGetterLink() {} + + MtGetterLink(MetatableGetter mg,MtGetterLink next) { + this.mg = mg; + this.next = next; + } + + LuanTable getMetatable(Object obj,MetatableGetter beforeThis) { + if( beforeThis != null ) { + if( beforeThis==mg ) + beforeThis = null; + } else { + LuanTable mt = mg.getMetatable(obj); + if( mt != null ) + return mt; + } + return next==null ? null : next.getMetatable(obj,beforeThis); + } + + boolean contains(MetatableGetter mg) { + return this.mg==mg || next!=null && next.contains(mg); + } + + @Override public MtGetterLink shallowClone() { + return new MtGetterLink(); + } + + @Override public void deepenClone(MtGetterLink clone,DeepCloner cloner) { + clone.mg = cloner.deepClone(mg); + clone.next = cloner.deepClone(next); + } +}