diff src/luan/LuanState.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 d41997776788
children 503bde9a7c80
line wrap: on
line diff
--- a/src/luan/LuanState.java	Sun Sep 30 19:10:48 2018 -0600
+++ b/src/luan/LuanState.java	Mon Nov 12 02:10:41 2018 -0700
@@ -1,9 +1,14 @@
 package luan;
 
+import java.lang.reflect.Array;
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.Map;
 import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.Arrays;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import luan.impl.LuanCompiler;
@@ -64,7 +69,7 @@
 	public String toString(Object obj) throws LuanException {
 		if( obj instanceof LuanTable ) {
 			LuanTable tbl = (LuanTable)obj;
-			return tbl.toString(this);
+			return tbl.toStringLuan();
 		}
 		if( obj == null )
 			return "nil";
@@ -78,7 +83,7 @@
 	public Object index(Object obj,Object key) throws LuanException {
 		if( obj instanceof LuanTable ) {
 			LuanTable tbl = (LuanTable)obj;
-			return tbl.get(this,key);
+			return tbl.get(key);
 		}
 		if( obj != null && javaOk.ok )
 			return JavaLuan.__index(this,obj,key);
@@ -121,9 +126,41 @@
 	}
 
 	public LuanFunction getHandlerFunction(String op,LuanTable t) throws LuanException {
-		Object f = t.getHandler(this,op);
+		Object f = t.getHandler(op);
 		if( f == null )
 			return null;
 		return Luan.checkFunction(f);
 	}
+
+	public LuanTable toTable(Object obj) {
+		if( obj == null )
+			return null;
+		if( obj instanceof LuanTable )
+			return (LuanTable)obj;
+		if( obj instanceof List ) {
+			return new LuanTable(this,(List)obj);
+		}
+		if( obj instanceof Map ) {
+			return new LuanTable(this,(Map)obj);
+		}
+		if( obj instanceof Set ) {
+			return new LuanTable(this,(Set)obj);
+		}
+		Class cls = obj.getClass();
+		if( cls.isArray() ) {
+			if( cls.getComponentType().isPrimitive() ) {
+				int len = Array.getLength(obj);
+				List list = new ArrayList();
+				for( int i=0; i<len; i++ ) {
+					list.add(Array.get(obj,i));
+				}
+				return new LuanTable(this,list);
+			} else {
+				Object[] a = (Object[])obj;
+				return new LuanTable(this,Arrays.asList(a));
+			}
+		}
+		return null;
+	}
+
 }