Mercurial Hosting > luan
diff core/src/luan/modules/StringLuan.java @ 197:4c96cb73dd93
fix metatable cloning
git-svn-id: https://luan-java.googlecode.com/svn/trunk@198 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Thu, 03 Jul 2014 18:36:46 +0000 |
parents | be0275bda373 |
children | 75750ceb45ee |
line wrap: on
line diff
--- a/core/src/luan/modules/StringLuan.java Thu Jul 03 18:03:53 2014 +0000 +++ b/core/src/luan/modules/StringLuan.java Thu Jul 03 18:36:46 2014 +0000 @@ -18,7 +18,9 @@ public static final LuanFunction LOADER = new LuanFunction() { @Override public Object call(LuanState luan,Object[] args) { LuanTable module = new LuanTable(); - module.put( MetatableGetter.KEY, new MyMetatableGetter(module) ); + MyMetatableGetter mmg = new MyMetatableGetter(); + mmg.init(module); + module.put( MetatableGetter.KEY, mmg ); try { add( module, "to_binary", String.class ); add( module, "to_integers", String.class ); @@ -51,9 +53,26 @@ private MyMetatableGetter() {} - MyMetatableGetter(LuanTable module) { + private void init(LuanTable module) { this.module = module; - this.metatable = table(); + this.metatable = new LuanTable(); + try { + metatable.put( "__index", new LuanJavaFunction( + MyMetatableGetter.class.getMethod( "__index", LuanState.class, String.class, Object.class ), this + ) ); + } catch(NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + @Override public MetatableGetter shallowClone() { + return new MyMetatableGetter(); + } + + @Override public void deepenClone(MetatableGetter c,DeepCloner cloner) { + MyMetatableGetter clone = (MyMetatableGetter)c; + clone.module = cloner.deepClone(module); + clone.metatable = cloner.deepClone(metatable); } @Override public LuanTable getMetatable(Object obj) { @@ -82,28 +101,6 @@ LuanFunction fn = (LuanFunction)h; return luan.call(fn,new Object[]{s,key}); } - - LuanTable table() { - LuanTable tbl = new LuanTable(); - try { - tbl.put( "__index", new LuanJavaFunction( - MyMetatableGetter.class.getMethod( "__index", LuanState.class, String.class, Object.class ), this - ) ); - } catch(NoSuchMethodException e) { - throw new RuntimeException(e); - } - return tbl; - } - - @Override public MetatableGetter shallowClone() { - return new MyMetatableGetter(); - } - - @Override public void deepenClone(MetatableGetter c,DeepCloner cloner) { - MyMetatableGetter clone = (MyMetatableGetter)c; - clone.module = cloner.deepClone(module); - clone.metatable = clone.table(); - } } static int start(String s,int i) {