Mercurial Hosting > luan
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; }