Mercurial Hosting > luan
diff core/src/luan/LuanState.java @ 404:d55e873e1f0d
metatables now only apply to tables
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 29 Apr 2015 07:04:40 -0600 |
parents | 8f1be9704726 |
children | 1b38de2b1845 |
line wrap: on
line diff
--- a/core/src/luan/LuanState.java Tue Apr 28 22:49:33 2015 -0600 +++ b/core/src/luan/LuanState.java Wed Apr 29 07:04:40 2015 -0600 @@ -21,18 +21,15 @@ final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>(); private LuanTableImpl registry; - private LuanTableImpl metatable; // generic metatable protected LuanState() { registry = new LuanTableImpl(); - metatable = newMetatable(); } protected LuanState(LuanState luan) {} @Override public void deepenClone(LuanState clone,DeepCloner cloner) { clone.registry = cloner.deepClone(registry); - clone.metatable = cloner.deepClone(metatable); } public abstract LuanTable currentEnvironment(); @@ -59,63 +56,15 @@ return call(fn); } - public final LuanTable getMetatable(Object obj) { - if( obj==null ) - return null; - if( obj instanceof LuanTable ) { - LuanTable table = (LuanTable)obj; - return table.getMetatable(); - } - return metatable; - } - public final LuanBit bit(LuanElement el) { return new LuanBit(this,el); } - public final Object getHandler(String op,Object obj) { - LuanTable t = getMetatable(obj); - return t==null ? null : t.get(op); - } - - public final Object getHandler(String op,LuanTable table) { + public final static Object getHandler(String op,LuanTable table) { LuanTable t = table.getMetatable(); return t==null ? null : t.get(op); } - private static LuanTableImpl newMetatable() { - LuanTableImpl metatable = new LuanTableImpl(); - try { - metatable.put( "__index", new LuanJavaFunction( - LuanState.class.getMethod("__index",LuanState.class,Object.class,Object.class), null - ) ); - metatable.put( "__newindex", new LuanJavaFunction( - LuanState.class.getMethod("__newindex",LuanState.class,Object.class,Object.class,Object.class), null - ) ); - } catch(NoSuchMethodException e) { - throw new RuntimeException(e); - } - return metatable; - } - - public static Object __index(LuanState luan,Object obj,Object key) throws LuanException { - if( obj instanceof String ) { - Object rtn = StringLuan.__index(luan,(String)obj,key); - if( rtn != null ) - return rtn; - } - if( obj instanceof byte[] ) { - Object rtn = BinaryLuan.__index(luan,(byte[])obj,key); - if( rtn != null ) - return rtn; - } - return JavaLuan.__index(luan,obj,key); - } - - public static void __newindex(LuanState luan,Object obj,Object key,Object value) throws LuanException { - JavaLuan.__newindex(luan,obj,key,value); - } - // convenience methods private final LuanBit JAVA = bit(LuanElement.JAVA);