Mercurial Hosting > luan
diff src/luan/LuanTable.java @ 1267:9fa8b8389578
add LuanTable.luan;
support metatable __gc();
add luan.sql;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 12 Nov 2018 02:10:41 -0700 |
parents | 73d754b1889f |
children | 503bde9a7c80 |
line wrap: on
line diff
--- a/src/luan/LuanTable.java Sun Sep 30 19:10:48 2018 -0600 +++ b/src/luan/LuanTable.java Mon Nov 12 02:10:41 2018 -0700 @@ -14,15 +14,18 @@ public final class LuanTable implements LuanCloneable { + private LuanState luan; private Map map = null; private List list = null; private LuanTable metatable = null; public LuanJavaOk javaOk; private LuanCloner cloner; - public LuanTable() {} + public LuanTable(LuanState luan) { + this.luan = luan; + } - public LuanTable(List list) { + public LuanTable(LuanState luan,List list) { int n = list.size(); for( int i=0; i<n; i++ ) { Object val = list.get(i); @@ -31,7 +34,8 @@ } } - public LuanTable(Map map) { + public LuanTable(LuanState luan,Map map) { + this.luan = luan; for( Object stupid : map.entrySet() ) { Map.Entry entry = (Map.Entry)stupid; Object key = entry.getKey(); @@ -41,7 +45,8 @@ } } - public LuanTable(Set set) { + public LuanTable(LuanState luan,Set set) { + this.luan = luan; for( Object el : set ) { if( el != null ) rawPut(el,Boolean.TRUE); @@ -49,6 +54,7 @@ } public LuanTable(LuanTable tbl) { + this.luan = tbl.luan; if( tbl.map != null && !tbl.map.isEmpty() ) this.map = new LinkedHashMap<Object,Object>(tbl.map); if( tbl.rawLength() > 0 ) @@ -57,7 +63,7 @@ } @Override public LuanTable shallowClone() { - return new LuanTable(); + return new LuanTable(luan); } @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { @@ -85,6 +91,7 @@ } private void deepenClone(LuanTable clone,LuanCloner cloner) { + clone.luan = (LuanState)cloner.clone(luan); if( map != null ) { Map newMap = newMap(); for( Object stupid : map.entrySet() ) { @@ -118,8 +125,8 @@ return map!=null ? map : Collections.emptyMap(); } - public String toString(LuanState luan) throws LuanException { - Object h = getHandler(luan,"__to_string"); + public String toStringLuan() throws LuanException { + Object h = getHandler("__to_string"); if( h == null ) return rawToString(); LuanFunction fn = Luan.checkFunction(h); @@ -130,11 +137,11 @@ return "table: " + Integer.toHexString(hashCode()); } - public Object get(LuanState luan,Object key) throws LuanException { + public Object get(Object key) throws LuanException { Object value = rawGet(key); if( value != null ) return value; - Object h = getHandler(luan,"__index"); + Object h = getHandler("__index"); if( h==null ) return null; if( h instanceof LuanFunction ) { @@ -163,8 +170,8 @@ return map.get(key); } - public void put(LuanState luan,Object key,Object value) throws LuanException { - Object h = getHandler(luan,"__new_index"); + public void put(Object key,Object value) throws LuanException { + Object h = getHandler("__new_index"); if( h==null || rawGet(key)!=null ) { rawPut(key,value); return; @@ -176,7 +183,7 @@ } if( h instanceof LuanTable ) { LuanTable tbl = (LuanTable)h; - tbl.put(luan,key,value); + tbl.put(key,value); return; } throw new LuanException("invalid type "+Luan.type(h)+" for metamethod __new_index"); @@ -267,8 +274,8 @@ Collections.sort(list(),cmp); } - public int length(LuanState luan) throws LuanException { - Object h = getHandler(luan,"__len"); + public int length() throws LuanException { + Object h = getHandler("__len"); if( h != null ) { LuanFunction fn = Luan.checkFunction(h); return (Integer)Luan.first(fn.call(luan,new Object[]{this})); @@ -281,8 +288,8 @@ return list==null ? 0 : list.size(); } - public Iterable<Map.Entry> iterable(LuanState luan) throws LuanException { - final Iterator<Map.Entry> iter = iterator(luan); + public Iterable<Map.Entry> iterable() throws LuanException { + final Iterator<Map.Entry> iter = iterator(); return new Iterable<Map.Entry>() { public Iterator<Map.Entry> iterator() { return iter; @@ -299,10 +306,10 @@ }; } - public Iterator<Map.Entry> iterator(final LuanState luan) throws LuanException { - if( getHandler(luan,"__pairs") == null ) + public Iterator<Map.Entry> iterator() throws LuanException { + if( getHandler("__pairs") == null ) return rawIterator(); - final LuanFunction fn = pairs(luan); + final LuanFunction fn = pairs(); return new Iterator<Map.Entry>() { private Map.Entry<Object,Object> next = getNext(); @@ -336,8 +343,8 @@ }; } - public LuanFunction pairs(LuanState luan) throws LuanException { - Object h = getHandler(luan,"__pairs"); + public LuanFunction pairs() throws LuanException { + Object h = getHandler("__pairs"); if( h != null ) { if( h instanceof LuanFunction ) { LuanFunction fn = (LuanFunction)h; @@ -420,7 +427,7 @@ public LuanTable rawSubList(int from,int to) { check(); - LuanTable tbl = new LuanTable(); + LuanTable tbl = new LuanTable(luan); tbl.list = new ArrayList<Object>(list().subList(from-1,to-1)); return tbl; } @@ -435,34 +442,34 @@ this.metatable = metatable; } - public Object getHandler(LuanState luan,String op) throws LuanException { + public Object getHandler(String op) throws LuanException { check(); - return metatable==null ? null : metatable.get(luan,op); + return metatable==null ? null : metatable.get(op); } private Map<Object,Object> newMap() { return new LinkedHashMap<Object,Object>(); } - public boolean isSet(LuanState luan) throws LuanException { - for( Map.Entry<Object,Object> entry : iterable(luan) ) { + public boolean isSet() throws LuanException { + for( Map.Entry<Object,Object> entry : iterable() ) { if( !entry.getValue().equals(Boolean.TRUE) ) return false; } return true; } - public Set<Object> asSet(LuanState luan) throws LuanException { + public Set<Object> asSet() throws LuanException { Set<Object> set = new HashSet<Object>(); - for( Map.Entry<Object,Object> entry : iterable(luan) ) { + for( Map.Entry<Object,Object> entry : iterable() ) { set.add(entry.getKey()); } return set; } - public Map<Object,Object> asMap(LuanState luan) throws LuanException { + public Map<Object,Object> asMap() throws LuanException { Map<Object,Object> map = newMap(); - for( Map.Entry<Object,Object> entry : iterable(luan) ) { + for( Map.Entry<Object,Object> entry : iterable() ) { map.put(entry.getKey(),entry.getValue()); } return map; @@ -495,4 +502,14 @@ n += list.size(); return n; } + + protected void finalize() throws Throwable { + Object h = getHandler("__gc"); + if( h != null ) { + LuanFunction fn = Luan.checkFunction(h); + fn.call(luan,new Object[]{this}); + } + super.finalize(); + } + }