diff src/luan/LuanTable.java @ 1561:e1a13e707bf3

start immutable
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 05 Nov 2020 20:24:09 -0700
parents d4407e8de707
children b89212fd04b5
line wrap: on
line diff
--- a/src/luan/LuanTable.java	Thu Oct 22 00:33:04 2020 -0600
+++ b/src/luan/LuanTable.java	Thu Nov 05 20:24:09 2020 -0700
@@ -21,12 +21,13 @@
 	public LuanClosure closure;
 	private LuanCloner cloner;
 	private String security = null;
+	private boolean immutable = false;
 
 	public LuanTable(Luan luan) {
 		this.luan = luan;
 	}
 
-	public LuanTable(Luan luan,List list){
+	public LuanTable(Luan luan,List list) {
 		this.luan = luan;
 		list();
 		int n = list.size();
@@ -48,7 +49,7 @@
 		}
 	}
 
-	public LuanTable(Luan luan,Set set){
+	public LuanTable(Luan luan,Set set) {
 		this.luan = luan;
 		for( Object el : set ) {
 			if( el != null )
@@ -66,6 +67,7 @@
 	}
 
 	@Override public LuanTable shallowClone() {
+		if(immutable) throw new RuntimeException();
 		return new LuanTable(luan);
 	}
 
@@ -101,25 +103,22 @@
 
 	private void completeClone(LuanTable clone,LuanCloner cloner) {
 		clone.luan = (Luan)cloner.clone(luan);
-		if( map != null ) {
-			Map newMap = newMap();
-			for( Object stupid : map.entrySet() ) {
-				Map.Entry entry = (Map.Entry)stupid;
-				newMap.put( cloner.get(entry.getKey()), cloner.get(entry.getValue()) );
-			}
-			clone.map = newMap;
-		}
-		if( list != null ) {
-			List newList = new ArrayList<Object>();
-			for( Object obj : list ) {
-				newList.add(cloner.get(obj));
-			}
-			clone.list = newList;
-		}
+		clone.map = cloner.clone(map);
+		clone.list = (List)cloner.clone(list);
 		clone.metatable = (LuanTable)cloner.clone(metatable);
 		clone.closure = (LuanClosure)cloner.clone(closure);
 	}
 
+	@Override public void makeImmutable(LuanImmutabler immutabler) throws LuanException {
+		check();
+		immutabler.makeImmutable(luan);
+		immutabler.makeImmutable(map);
+		immutabler.makeImmutable(list);
+		immutabler.makeImmutable(metatable);
+		immutabler.makeImmutable(closure);
+		immutable = true;
+	}
+
 	public boolean isList() {
 		return map==null || map.isEmpty();
 	}
@@ -203,6 +202,8 @@
 	}
 
 	public Object rawPut(Object key,Object val) throws LuanException {
+		if( immutable )
+			throw new LuanException("table is immutable");
 		if( security != null )
 			Luan.checkSecurity(luan,"table",security,"put",key,val);
 		return rawPut2(key,val);
@@ -479,7 +480,7 @@
 		return metatable==null ? null : metatable.get(op);
 	}
 
-	private Map<Object,Object> newMap() {
+	private static Map<Object,Object> newMap() {
 		return new LinkedHashMap<Object,Object>();
 	}
 
@@ -535,7 +536,9 @@
 		return n;
 	}
 
-	public Object remove(Object key) {
+	public Object remove(Object key) throws LuanException {
+		if( immutable )
+			throw new LuanException("table is immutable");
 		Object old = rawGet(key);
 		rawPut2(key,null);
 		return old;