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) {