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();
+	}
+
 }