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