diff src/luan/LuanTable.java @ 782:655280eab1e2

start limited cloning
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 30 Aug 2016 01:29:33 -0600
parents fbbdd369a13a
children 6a7c6879158d
line wrap: on
line diff
--- a/src/luan/LuanTable.java	Mon Aug 29 22:49:32 2016 -0600
+++ b/src/luan/LuanTable.java	Tue Aug 30 01:29:33 2016 -0600
@@ -18,6 +18,11 @@
 	private List list = null;
 	private LuanTable metatable = null;
 	public LuanJava java;
+	private LuanCloner cloner;
+
+	private LuanTable(LuanCloner cloner) {
+		this.cloner = cloner;
+	}
 
 	public LuanTable() {}
 
@@ -55,8 +60,8 @@
 		this.metatable = tbl.metatable;
 	}
 
-	@Override public LuanTable shallowClone() {
-		return new LuanTable();
+	@Override public LuanTable shallowClone(LuanCloner cloner) {
+		return new LuanTable(cloner.deep ? null : cloner);
 	}
 
 	@Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) {
@@ -65,18 +70,22 @@
 			clone.map = newMap();
 			for( Object stupid : map.entrySet() ) {
 				Map.Entry entry = (Map.Entry)stupid;
-				clone.map.put( cloner.get(entry.getKey()), cloner.get(entry.getValue()) );
+				Object val = entry.getValue();
+				if( cloner.deep || !(val instanceof LuanTable) )
+					val = cloner.get(val);
+				clone.map.put( cloner.get(entry.getKey()), val );
 			}
 		}
 		if( list != null ) {
 			clone.list = new ArrayList<Object>();
 			for( Object obj : list ) {
-				clone.list.add( cloner.get(obj) );
+				if( cloner.deep || !(obj instanceof LuanTable) )
+					obj = cloner.get(obj);
+				clone.list.add(obj);
 			}
 		}
-		if( metatable != null )
-			clone.metatable = (LuanTable)cloner.get(metatable);
-		clone.java = (LuanJava)cloner.deepClone(java);
+		clone.metatable = (LuanTable)cloner.clone(metatable);
+		clone.java = (LuanJava)cloner.clone(java);
 	}
 
 	public boolean isList() {
@@ -398,7 +407,7 @@
 	}
 
 	public LuanTable rawSubList(int from,int to) {
-		LuanTable tbl = shallowClone();
+		LuanTable tbl = new LuanTable(cloner);
 		tbl.list = new ArrayList<Object>(list().subList(from-1,to-1));
 		return tbl;
 	}