Mercurial Hosting > luan
view 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 source
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); } }