changeset 304:03e9cda4748d

add JavaLuan.Static.luan_proxy() git-svn-id: https://luan-java.googlecode.com/svn/trunk@305 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 18 Dec 2014 12:06:56 +0000
parents fdb4bd391c28
children 5e7450ac27f2
files core/src/luan/modules/JavaLuan.java
diffstat 1 files changed, 36 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
diff -r fdb4bd391c28 -r 03e9cda4748d core/src/luan/modules/JavaLuan.java
--- a/core/src/luan/modules/JavaLuan.java	Thu Dec 18 07:51:29 2014 +0000
+++ b/core/src/luan/modules/JavaLuan.java	Thu Dec 18 12:06:56 2014 +0000
@@ -74,8 +74,12 @@
 							return new AmbiguousJavaFunction(fns);
 						}
 					}
+/*
 				} else if( "assert".equals(name) ) {
 					return new LuanJavaFunction(assertClass,new AssertClass(cls));
+*/
+				} else if( "luan_proxy".equals(name) ) {
+					return new LuanJavaFunction(luan_proxyMethod,st);
 				} else {
 					List<Member> members = getStaticMembers(cls,name);
 					if( !members.isEmpty() ) {
@@ -308,6 +312,36 @@
 		@Override public boolean isSynthetic() {
 			return cls.isSynthetic();
 		}
+
+		public Object luan_proxy(final LuanState luan,final LuanTable t,final Object base) throws LuanException {
+			return Proxy.newProxyInstance(
+				cls.getClassLoader(),
+				new Class[]{cls},
+				new InvocationHandler() {
+					public Object invoke(Object proxy,Method method, Object[] args)
+						throws Throwable
+					{
+						if( args==null )
+							args = new Object[0];
+						String name = method.getName();
+						Object fnObj = t.get(name);
+						if( fnObj==null && base!=null )
+							return method.invoke(base,args);
+						LuanFunction fn = luan.checkFunction(fnObj);
+						return Luan.first(luan.call(fn,name,args));
+					}
+				}
+			);
+		}
+	}
+	private static final Method luan_proxyMethod;
+	static {
+		try {
+			luan_proxyMethod = Static.class.getMethod("luan_proxy",LuanState.class,LuanTable.class,Object.class);
+			luan_proxyMethod.setAccessible(true);
+		} catch(NoSuchMethodException e) {
+			throw new RuntimeException(e);
+		}
 	}
 
 	public static Static load(LuanState luan,String name) throws LuanException {
@@ -371,7 +405,7 @@
 		}
 	}
 
-
+/*
 	private static class AssertClass {
 		private final Class cls;
 
@@ -419,6 +453,7 @@
 			}
 		);
 	}
+*/