Mercurial Hosting > luan
diff core/src/luan/modules/JavaLuan.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 | 3dcb0f9bee82 |
children | be0275bda373 |
line wrap: on
line diff
--- a/core/src/luan/modules/JavaLuan.java Wed Jul 02 04:52:25 2014 +0000 +++ b/core/src/luan/modules/JavaLuan.java Thu Jul 03 08:19:48 2014 +0000 @@ -24,14 +24,15 @@ import luan.LuanFunction; import luan.LuanJavaFunction; import luan.LuanElement; +import luan.DeepCloner; public final class JavaLuan { public static final LuanFunction LOADER = new LuanFunction() { @Override public Object call(LuanState luan,Object[] args) { - luan.addMetatableGetter(mg); LuanTable module = new LuanTable(); + module.metatableGetter = mg; try { module.put( "class", new LuanJavaFunction(JavaLuan.class.getMethod("getClass",LuanState.class,String.class),null) ); add( module, "proxy", LuanState.class, Static.class, LuanTable.class, Object.class ); @@ -73,14 +74,30 @@ } private static final MetatableGetter mg = new MetatableGetter() { + public LuanTable getMetatable(Object obj) { if( obj==null ) return null; return mt; } + + @Override public MetatableGetter shallowClone() { + return this; + } + @Override public void deepenClone(MetatableGetter clone,DeepCloner cloner) {} }; public static Object __index(LuanState luan,Object obj,Object key) throws LuanException { + LuanTable mt = luan.getMetatable(obj,mg); + if( mt != null ) { + Object h = mt.get("__index"); + if( h instanceof LuanFunction ) { + LuanFunction fn = (LuanFunction)h; + Object rtn = Luan.first(luan.call(fn,new Object[]{obj,key})); + if( rtn != null ) + return rtn; + } + } if( obj instanceof Static ) { if( key instanceof String ) { String name = (String)key;