diff src/luan/modules/IoLuan.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 e38f5869e9df
children d83f6cc558de
line wrap: on
line diff
--- a/src/luan/modules/IoLuan.java	Sun Sep 30 19:10:48 2018 -0600
+++ b/src/luan/modules/IoLuan.java	Mon Nov 12 02:10:41 2018 -0700
@@ -79,8 +79,8 @@
 		};
 	}
 
-	public static LuanTable textWriter(final PrintStream out) {
-		return writer(luanWriter(out));
+	public static LuanTable textWriter(LuanState luan,final PrintStream out) {
+		return writer(luan,luanWriter(out));
 	}
 
 	private static LuanWriter luanWriter(final Writer out) {
@@ -102,12 +102,12 @@
 		};
 	}
 
-	public static LuanTable textWriter(final Writer out) {
-		return writer(luanWriter(out));
+	public static LuanTable textWriter(LuanState luan,final Writer out) {
+		return writer(luan,luanWriter(out));
 	}
 
-	private static LuanTable writer(LuanWriter luanWriter) {
-		LuanTable writer = new LuanTable();
+	private static LuanTable writer(LuanState luan,LuanWriter luanWriter) {
+		LuanTable writer = new LuanTable(luan);
 		writer.rawPut( "java", luanWriter.out() );
 		try {
 			writer.rawPut( "write", new LuanJavaFunction(
@@ -123,8 +123,8 @@
 	}
 
 
-	public static LuanTable binaryWriter(final OutputStream out) {
-		LuanTable writer = new LuanTable();
+	public static LuanTable binaryWriter(LuanState luan,final OutputStream out) {
+		LuanTable writer = new LuanTable(luan);
 		writer.rawPut( "java", out );
 		try {
 			writer.rawPut( "write", new LuanJavaFunction(
@@ -202,40 +202,40 @@
 
 
 	public static abstract class LuanIn {
-		public abstract InputStream inputStream() throws IOException, LuanException;
+		public abstract InputStream inputStream(LuanState luan) throws IOException, LuanException;
 		public abstract String to_string();
 		public abstract String to_uri_string();
 
-		public Reader reader() throws IOException, LuanException {
-			return new InputStreamReader(inputStream());
+		public Reader reader(LuanState luan) throws IOException, LuanException {
+			return new InputStreamReader(inputStream(luan));
 		}
 
-		public String read_text() throws IOException, LuanException {
-			Reader in = reader();
+		public String read_text(LuanState luan) throws IOException, LuanException {
+			Reader in = reader(luan);
 			String s = Utils.readAll(in);
 			in.close();
 			return s;
 		}
 
-		public byte[] read_binary() throws IOException, LuanException {
-			InputStream in = inputStream();
+		public byte[] read_binary(LuanState luan) throws IOException, LuanException {
+			InputStream in = inputStream(luan);
 			byte[] a = Utils.readAll(in);
 			in.close();
 			return a;
 		}
 
-		public LuanFunction read_lines() throws IOException, LuanException {
-			return lines(new BufferedReader(reader()));
+		public LuanFunction read_lines(LuanState luan) throws IOException, LuanException {
+			return lines(new BufferedReader(reader(luan)));
 		}
 
-		public LuanFunction read_blocks(Integer blockSize) throws IOException, LuanException {
+		public LuanFunction read_blocks(LuanState luan,Integer blockSize) throws IOException, LuanException {
 			int n = blockSize!=null ? blockSize : Utils.bufSize;
-			return blocks(inputStream(),n);
+			return blocks(inputStream(luan),n);
 		}
 
-		public boolean exists() throws IOException, LuanException {
+		public boolean exists(LuanState luan) throws IOException, LuanException {
 			try {
-				inputStream().close();
+				inputStream(luan).close();
 				return true;
 			} catch(FileNotFoundException e) {
 				return false;
@@ -244,9 +244,9 @@
 			}
 		}
 
-		public long checksum() throws IOException, LuanException {
+		public long checksum(LuanState luan) throws IOException, LuanException {
 			long cs = 0;
-			InputStream in = new BufferedInputStream(inputStream());
+			InputStream in = new BufferedInputStream(inputStream(luan));
 			int c;
 			while( (c=in.read()) != -1 ) {
 				cs = 31 * cs + c;
@@ -255,8 +255,8 @@
 			return cs;
 		}
 
-		public LuanTable table() {
-			LuanTable tbl = new LuanTable();
+		public LuanTable table(LuanState luan) {
+			LuanTable tbl = new LuanTable(luan);
 			try {
 				tbl.rawPut( "java", this );
 				tbl.rawPut( "to_string", new LuanJavaFunction(
@@ -266,22 +266,22 @@
 					LuanIn.class.getMethod( "to_uri_string" ), this
 				) );
 				tbl.rawPut( "read_text", new LuanJavaFunction(
-					LuanIn.class.getMethod( "read_text" ), this
+					LuanIn.class.getMethod( "read_text", LuanState.class ), this
 				) );
 				tbl.rawPut( "read_binary", new LuanJavaFunction(
-					LuanIn.class.getMethod( "read_binary" ), this
+					LuanIn.class.getMethod( "read_binary", LuanState.class ), this
 				) );
 				tbl.rawPut( "read_lines", new LuanJavaFunction(
-					LuanIn.class.getMethod( "read_lines" ), this
+					LuanIn.class.getMethod( "read_lines", LuanState.class ), this
 				) );
 				tbl.rawPut( "read_blocks", new LuanJavaFunction(
-					LuanIn.class.getMethod( "read_blocks", Integer.class ), this
+					LuanIn.class.getMethod( "read_blocks", LuanState.class, Integer.class ), this
 				) );
 				tbl.rawPut( "exists", new LuanJavaFunction(
-					LuanIn.class.getMethod( "exists" ), this
+					LuanIn.class.getMethod( "exists", LuanState.class ), this
 				) );
 				tbl.rawPut( "checksum", new LuanJavaFunction(
-					LuanIn.class.getMethod( "checksum" ), this
+					LuanIn.class.getMethod( "checksum", LuanState.class ), this
 				) );
 			} catch(NoSuchMethodException e) {
 				throw new RuntimeException(e);
@@ -292,7 +292,7 @@
 
 	public static final LuanIn defaultStdin = new LuanIn() {
 
-		@Override public InputStream inputStream() {
+		@Override public InputStream inputStream(LuanState luan) {
 			return System.in;
 		}
 
@@ -304,15 +304,15 @@
 			return "stdin:";
 		}
 
-		@Override public String read_text() throws IOException {
+		@Override public String read_text(LuanState luan) throws IOException {
 			return Utils.readAll(new InputStreamReader(System.in));
 		}
 
-		@Override public byte[] read_binary() throws IOException {
+		@Override public byte[] read_binary(LuanState luan) throws IOException {
 			return Utils.readAll(System.in);
 		}
 
-		@Override public boolean exists() {
+		@Override public boolean exists(LuanState luan) {
 			return true;
 		}
 	};
@@ -320,7 +320,7 @@
 	public static abstract class LuanIO extends LuanIn {
 		abstract OutputStream outputStream() throws IOException;
 
-		public void write(Object obj) throws LuanException, IOException {
+		public void write(LuanState luan,Object obj) throws LuanException, IOException {
 			if( obj instanceof String ) {
 				String s = (String)obj;
 				Writer out = new OutputStreamWriter(outputStream());
@@ -340,7 +340,7 @@
 				Object java = t.rawGet("java");
 				if( java instanceof LuanIn ) {
 					LuanIn luanIn = (LuanIn)java;
-					InputStream in = luanIn.inputStream();
+					InputStream in = luanIn.inputStream(luan);
 					OutputStream out = outputStream();
 					Utils.copyAll(in,out);
 					out.close();
@@ -351,12 +351,12 @@
 			throw new LuanException( "bad argument #1 to 'write' (string or binary or Io.uri expected)" );
 		}
 
-		public LuanTable text_writer() throws IOException {
-			return textWriter(new BufferedWriter(new OutputStreamWriter(outputStream())));
+		public LuanTable text_writer(LuanState luan) throws IOException {
+			return textWriter(luan,new BufferedWriter(new OutputStreamWriter(outputStream())));
 		}
 
-		public LuanTable binary_writer() throws IOException {
-			return binaryWriter(new BufferedOutputStream(outputStream()));
+		public LuanTable binary_writer(LuanState luan) throws IOException {
+			return binaryWriter(luan,new BufferedOutputStream(outputStream()));
 		}
 
 		public void write_text(LuanState luan,Object... args) throws LuanException, IOException {
@@ -365,17 +365,17 @@
 			luanWriter.close();
 		}
 
-		@Override public LuanTable table() {
-			LuanTable tbl = super.table();
+		@Override public LuanTable table(LuanState luan) {
+			LuanTable tbl = super.table(luan);
 			try {
 				tbl.rawPut( "write", new LuanJavaFunction(
-					LuanIO.class.getMethod( "write", Object.class ), this
+					LuanIO.class.getMethod( "write", LuanState.class, Object.class ), this
 				) );
 				tbl.rawPut( "text_writer", new LuanJavaFunction(
-					LuanIO.class.getMethod( "text_writer" ), this
+					LuanIO.class.getMethod( "text_writer", LuanState.class ), this
 				) );
 				tbl.rawPut( "binary_writer", new LuanJavaFunction(
-					LuanIO.class.getMethod( "binary_writer" ), this
+					LuanIO.class.getMethod( "binary_writer", LuanState.class ), this
 				) );
 				tbl.rawPut( "write_text", new LuanJavaFunction(
 					LuanIO.class.getMethod( "write_text", LuanState.class, new Object[0].getClass() ), this
@@ -397,7 +397,7 @@
 			@Override public void write(int b) {}
 		};
 
-		@Override public InputStream inputStream() {
+		@Override public InputStream inputStream(LuanState luan) {
 			return in;
 		}
 
@@ -422,7 +422,7 @@
 			this.s = s;
 		}
 
-		@Override public InputStream inputStream() {
+		@Override public InputStream inputStream(LuanState luan) {
 			throw new UnsupportedOperationException();
 		}
 
@@ -438,19 +438,19 @@
 			return "string:" + s;
 		}
 
-		@Override public Reader reader() {
+		@Override public Reader reader(LuanState luan) {
 			return new StringReader(s);
 		}
 
-		@Override public String read_text() {
+		@Override public String read_text(LuanState luan) {
 			return s;
 		}
 
-		@Override public boolean exists() {
+		@Override public boolean exists(LuanState luan) {
 			return true;
 		}
 
-		@Override public LuanTable text_writer() throws IOException {
+		@Override public LuanTable text_writer(LuanState luan) throws IOException {
 			LuanWriter luanWriter = new LuanWriter() {
 				private final Writer out = new StringWriter();
 
@@ -468,7 +468,7 @@
 					s = out.toString();
 				}
 			};
-			return writer(luanWriter);
+			return writer(luan,luanWriter);
 		}
 	}
 
@@ -484,7 +484,7 @@
 			this.file = file;
 		}
 
-		@Override public InputStream inputStream() throws IOException {
+		@Override public InputStream inputStream(LuanState luan) throws IOException {
 			return new FileInputStream(file);
 		}
 
@@ -501,16 +501,16 @@
 		}
 
 		public LuanTable child(LuanState luan,String name) throws LuanException {
-			return new LuanFile(luan,new File(file,name)).table();
+			return new LuanFile(luan,new File(file,name)).table(luan);
 		}
 
 		public LuanTable children(LuanState luan) throws LuanException {
 			File[] files = file.listFiles();
 			if( files==null )
 				return null;
-			LuanTable list = new LuanTable();
+			LuanTable list = new LuanTable(luan);
 			for( File f : files ) {
-				list.rawPut(list.rawLength()+1,new LuanFile(luan,f).table());
+				list.rawPut(list.rawLength()+1,new LuanFile(luan,f).table(luan));
 			}
 			return list;
 		}
@@ -519,10 +519,10 @@
 			File parent = file.getParentFile();
 			if( parent==null )
 				parent = file.getCanonicalFile().getParentFile();
-			return new LuanFile(luan,parent).table();
+			return new LuanFile(luan,parent).table(luan);
 		}
 
-		@Override public boolean exists() {
+		@Override public boolean exists(LuanState luan) {
 			return file.exists();
 		}
 
@@ -535,12 +535,12 @@
 		}
 
 		public LuanTable canonical(LuanState luan) throws LuanException, IOException {
-			return new LuanFile(luan,file.getCanonicalFile()).table();
+			return new LuanFile(luan,file.getCanonicalFile()).table(luan);
 		}
 
 		public LuanTable create_temp_file(LuanState luan,String prefix,String suffix) throws LuanException, IOException {
 			File tmp = File.createTempFile(prefix,suffix,file);
-			return new LuanFile(luan,tmp).table();
+			return new LuanFile(luan,tmp).table(luan);
 		}
 
 		public void delete() throws LuanException {
@@ -571,8 +571,8 @@
 				throw new LuanException("couldn't set_last_modified on "+file);
 		}
 
-		@Override public LuanTable table() {
-			LuanTable tbl = super.table();
+		@Override public LuanTable table(LuanState luan) {
+			LuanTable tbl = super.table(luan);
 			try {
 				tbl.rawPut( "name", new LuanJavaFunction(
 					File.class.getMethod( "getName" ), file
@@ -626,18 +626,18 @@
 		}
 	}
 
-	public static LuanTable null_(String ignore) {
-		return nullIO.table();
+	public static LuanTable null_(LuanState luan,String ignore) {
+		return nullIO.table(luan);
 	}
 
-	public static LuanTable string(String s) throws LuanException {
+	public static LuanTable string(LuanState luan,String s) throws LuanException {
 		Utils.checkNotNull(s);
-		return new LuanString(s).table();
+		return new LuanString(s).table(luan);
 	}
 
 	public static LuanTable file(LuanState luan,String name) throws LuanException {
 		File file = new File(name);
-		return new LuanFile(luan,file).table();
+		return new LuanFile(luan,file).table(luan);
 	}
 
 	public static LuanTable classpath(LuanState luan,String name) throws LuanException {
@@ -666,13 +666,13 @@
 			}
 		}
 		if( url != null )
-			return new LuanUrl(luan,url,null).table();
+			return new LuanUrl(url,null).table(luan);
 
 		return null;
 	}
 
 	private static LuanTable url(LuanState luan,String url,LuanTable options) throws IOException, LuanException {
-		return new LuanUrl(luan,new URL(url),options).table();
+		return new LuanUrl(new URL(url),options).table(luan);
 	}
 
 	public static LuanTable http(LuanState luan,String path,LuanTable options) throws IOException, LuanException {
@@ -689,14 +689,14 @@
 
 	public static LuanTable stdin(LuanState luan) throws LuanException {
 		LuanTable io = (LuanTable)PackageLuan.require(luan,"luan:Io.luan");
-		return (LuanTable)io.get(luan,"stdin");
+		return (LuanTable)io.get("stdin");
 	}
 
-	public static LuanTable newSchemes() {
-		LuanTable schemes = new LuanTable();
+	public static LuanTable newSchemes(LuanState luan) {
+		LuanTable schemes = new LuanTable(luan);
 		try {
-			schemes.rawPut( "null", new LuanJavaFunction(IoLuan.class.getMethod("null_",String.class),null) );
-			add( schemes, "string", String.class );
+			schemes.rawPut( "null", new LuanJavaFunction(IoLuan.class.getMethod("null_",LuanState.class,String.class),null) );
+			add( schemes, "string", LuanState.class, String.class );
 			add( schemes, "file", LuanState.class, String.class );
 			add( schemes, "classpath", LuanState.class, String.class );
 //			add( schemes, "socket", String.class );
@@ -715,10 +715,10 @@
 	private static LuanTable schemes(LuanState luan) throws LuanException {
 		LuanTable t = (LuanTable)PackageLuan.loaded(luan).rawGet("luan:Io.luan");
 		if( t == null )
-			return newSchemes();
-		t = (LuanTable)t.get(luan,"schemes");
+			return newSchemes(luan);
+		t = (LuanTable)t.get("schemes");
 		if( t == null )
-			return newSchemes();
+			return newSchemes(luan);
 		return t;
 	}
 
@@ -729,7 +729,7 @@
 		String scheme = name.substring(0,i);
 		String location = name.substring(i+1);
 		LuanTable schemes = schemes(luan);
-		LuanFunction opener = (LuanFunction)schemes.get(luan,scheme);
+		LuanFunction opener = (LuanFunction)schemes.get(scheme);
 		if( opener == null )
 			throw new LuanException( "invalid scheme '"+scheme+"' in '"+name+"'" );
 		return (LuanTable)Luan.first(opener.call(luan,new Object[]{location,options}));
@@ -802,11 +802,11 @@
 		final File dir;
 		Process proc;
 
-		private BaseOs(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException {
+		private BaseOs(String cmd,LuanTable options) throws IOException, LuanException {
 			this.cmd = cmd;
 			File dir = null;
 			if( options != null ) {
-				Map map = options.asMap(luan);
+				Map map = options.asMap();
 				Object obj = map.remove("dir");
 				dir = objToFile(obj);
 				if( dir==null )
@@ -817,7 +817,7 @@
 			this.dir = dir;
 		}
 
-		@Override public InputStream inputStream() throws IOException {
+		@Override public InputStream inputStream(LuanState luan) throws IOException {
 			return proc.getInputStream();
 		}
 
@@ -833,7 +833,7 @@
 			throw new UnsupportedOperationException();
 		}
 
-		@Override public boolean exists() {
+		@Override public boolean exists(LuanState luan) {
 			return true;
 		}
 
@@ -854,14 +854,14 @@
 			}
 		}
 
-		@Override public String read_text() throws IOException, LuanException {
-			String s = super.read_text();
+		@Override public String read_text(LuanState luan) throws IOException, LuanException {
+			String s = super.read_text(luan);
 			wait_for();
 			return s;
 		}
 
-		@Override public LuanTable table() {
-			LuanTable tbl = super.table();
+		@Override public LuanTable table(LuanState luan) {
+			LuanTable tbl = super.table(luan);
 			try {
 				tbl.rawPut( "wait_for", new LuanJavaFunction(
 					BaseOs.class.getMethod( "wait_for" ), this
@@ -875,26 +875,26 @@
 
 	public static final class LuanOs extends BaseOs {
 		private LuanOs(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException {
-			super(luan,cmd,options);
+			super(cmd,options);
 			check(luan,"os:"+cmd);
 			this.proc = Runtime.getRuntime().exec(cmd,null,dir);
 		}
 	}
 
 	public static LuanTable os(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException {
-		return new LuanOs(luan,cmd,options).table();
+		return new LuanOs(luan,cmd,options).table(luan);
 	}
 
 	public static final class LuanBash extends BaseOs {
 		private LuanBash(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException {
-			super(luan,cmd,options);
+			super(cmd,options);
 			check(luan,"bash:"+cmd);
 			this.proc = Runtime.getRuntime().exec(new String[]{"bash","-c",cmd},null,dir);
 		}
 	}
 
 	public static LuanTable bash(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException {
-		return new LuanBash(luan,cmd,options).table();
+		return new LuanBash(luan,cmd,options).table(luan);
 	}
 
 
@@ -906,7 +906,7 @@
 			this.in = in;
 		}
 
-		@Override public InputStream inputStream() {
+		@Override public InputStream inputStream(LuanState luan) {
 			return in;
 		}
 
@@ -918,7 +918,7 @@
 			throw new UnsupportedOperationException();
 		}
 
-		@Override public boolean exists() {
+		@Override public boolean exists(LuanState luan) {
 			return true;
 		}
 	};
@@ -932,8 +932,8 @@
 		}
 	}
 
-	public static LuanTable my_ips() throws IOException {
-		LuanTable tbl = new LuanTable();
+	public static LuanTable my_ips(LuanState luan) throws IOException {
+		LuanTable tbl = new LuanTable(luan);
 		for( Enumeration<NetworkInterface> e1 = NetworkInterface.getNetworkInterfaces(); e1.hasMoreElements(); ) {
 			NetworkInterface ni = e1.nextElement();
 			for( Enumeration<InetAddress> e2 = ni.getInetAddresses(); e2.hasMoreElements(); ) {