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;