changeset 799:9c13a15a4002

Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 06 Sep 2016 18:03:19 -0600
parents 9eccfede1094
children e2a446c5c7c4
files src/luan/modules/IoLuan.java src/luan/modules/PackageLuan.java src/luan/modules/http/HttpServicer.java src/luan/modules/http/Http_test.luan src/luan/modules/http/Server.luan website/src/manual.html.luan
diffstat 6 files changed, 26 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/modules/IoLuan.java	Tue Sep 06 12:23:03 2016 -0600
+++ b/src/luan/modules/IoLuan.java	Tue Sep 06 18:03:19 2016 -0600
@@ -685,13 +685,7 @@
 		LuanFunction opener = (LuanFunction)schemes.get(luan,scheme);
 		if( opener == null )
 			throw new LuanException( "invalid scheme '"+scheme+"' in '"+name+"'" );
-		boolean isLocked = luan.isLocked;  // hack needed for luan scheme functions
-		luan.isLocked = false;
-		try {
-			return (LuanTable)Luan.first(opener.call(luan,new Object[]{location,options}));
-		} finally {
-			luan.isLocked = isLocked;
-		}
+		return (LuanTable)Luan.first(opener.call(luan,new Object[]{location,options}));
 	}
 
 	public static final class LuanSocket extends LuanIO {
--- a/src/luan/modules/PackageLuan.java	Tue Sep 06 12:23:03 2016 -0600
+++ b/src/luan/modules/PackageLuan.java	Tue Sep 06 18:03:19 2016 -0600
@@ -34,7 +34,7 @@
 
 	public static Object require(LuanState luan,String modName) throws LuanException {
 		Object mod = load(luan,modName);
-		if( mod==null )
+		if( mod.equals(Boolean.FALSE) )
 			throw new LuanException( "module '"+modName+"' not found" );
 		return mod;
 	}
@@ -47,17 +47,19 @@
 				mod = JavaLuan.load(luan,modName.substring(5));
 			} else {
 				String src = read(luan,modName);
-				if( src == null )
-					return null;
-				LuanFunction loader = Luan.load(src,modName);
-				mod = Luan.first(
-					loader.call(luan,new Object[]{modName})
-				);
-				if( mod == null ) {
-					mod = loaded.rawGet(modName);
-					if( mod != null )
-						return mod;
-					throw new LuanException( "module '"+modName+"' returned nil" );
+				if( src == null ) {
+					mod = Boolean.FALSE;
+				} else {
+					LuanFunction loader = Luan.load(src,modName);
+					mod = Luan.first(
+						loader.call(luan,new Object[]{modName})
+					);
+					if( mod == null ) {
+						mod = loaded.rawGet(modName);
+						if( mod != null )
+							return mod;
+						throw new LuanException( "module '"+modName+"' returned nil" );
+					}
 				}
 			}
 			loaded.rawPut(modName,mod);
@@ -87,31 +89,15 @@
 		}
 	}
 
-	private static boolean wouldLoad(LuanState luan,String modName) throws LuanException {
+	public static void enableLoad(LuanState luan,String... mods) throws LuanException {
+		if( !luan.isLocked )
+			return;
 		LuanTable loaded = loaded(luan);
-		if( loaded.rawGet(modName) != null )
-			return false;
-		if( modName.startsWith("java:") )
-			return true;
-		LuanTable t = IoLuan.uri(luan,modName,null);
-		if( t == null )
-			return false;
-		IoLuan.LuanIn in = (IoLuan.LuanIn)t.rawGet("java");
-		try {
-			return in.exists();
-		} catch(IOException e) {
-			throw new LuanException(e);
-		}
-	}
-
-	public static void enableLoad(LuanState luan,String... mods) throws LuanException {
-		if( luan.isLocked ) {
-			for( String mod : mods ) {
-				if( wouldLoad(luan,mod) ) {
-					luan.isLocked = false;
-					luan.deepenClone(luan,new LuanCloner(LuanCloner.Type.COMPLETE));
-					return;
-				}
+		for( String mod : mods ) {
+			if( loaded.rawGet(mod) == null ) {
+				luan.isLocked = false;
+				luan.deepenClone(luan,new LuanCloner(LuanCloner.Type.COMPLETE));
+				break;
 			}
 		}
 	}
--- a/src/luan/modules/http/HttpServicer.java	Tue Sep 06 12:23:03 2016 -0600
+++ b/src/luan/modules/http/HttpServicer.java	Tue Sep 06 18:03:19 2016 -0600
@@ -49,7 +49,7 @@
 			LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http.luan");
 			LuanTable per_session_pages = (LuanTable)module.rawGet("per_session_pages");
 			Object mod = PackageLuan.load(luan,modName);
-			if( mod==null )
+			if( mod.equals(Boolean.FALSE) )
 				return false;
 			if( !(mod instanceof LuanFunction) )
 				throw new LuanException( "module '"+modName+"' must return a function" );
--- a/src/luan/modules/http/Http_test.luan	Tue Sep 06 12:23:03 2016 -0600
+++ b/src/luan/modules/http/Http_test.luan	Tue Sep 06 18:03:19 2016 -0600
@@ -23,7 +23,7 @@
 	try {
 		function()
 			local mod = Package.load("site:"..path..".luan")
-			if mod ~= nil then
+			if mod and true then
 				mod()
 			else
 				local not_found = Package.load("site:/not_found.luan")
--- a/src/luan/modules/http/Server.luan	Tue Sep 06 12:23:03 2016 -0600
+++ b/src/luan/modules/http/Server.luan	Tue Sep 06 18:03:19 2016 -0600
@@ -94,7 +94,6 @@
 	M.handlers.addHandler(NotFound.new(M.luan_handler))
 	M.server = Server.new(M.port)
 	M.server.setHandler(hc)
---	Package.load("site:/init.luan")
 end
 
 function M.start()
--- a/website/src/manual.html.luan	Tue Sep 06 12:23:03 2016 -0600
+++ b/website/src/manual.html.luan	Tue Sep 06 18:03:19 2016 -0600
@@ -2268,7 +2268,7 @@
 To load a new value, <code>Package.load</code> first checks if <code>mod_uri</code> starts with "<b>java:</b>".  If yes, then this is a Java class which is loaded by special Java code.
 
 <p>
-If <code>mod_uri</code> is not a Java class, then <code>Package.load</code> tries to read the text of the file referred to by <code>mod_uri</code>.  If the file doesn't exist, then <code>Package.load</code> returns <b>nil</b>.  If the file exists, then its content is compiled into a chunk calling <a href="#Luan.load"><code>Luan.load</code></a> and passing in an empty table as the <code>env</code> value.  This chunk is run passing in <code>mod_uri</code> as an argument.  If the chunk returns a value other than <b>nil</b>, then that value is the value of this module.  Otherwise the <code>env</code> that was passed in is the value of this module.
+Otherwise <code>Package.load</code> tries to read the text of the file referred to by <code>mod_uri</code>.  If the file doesn't exist, then <code>Package.load</code> returns <b>false</b>.  If the file exists, then its content is compiled into a chunk by calling <a href="#Luan.load"><code>Luan.load</code></a>.  This chunk is run passing in <code>mod_uri</code> as an argument.  The value returned by the chunk must not be <b>nil</b> and is loaded.
 
 <p>
 If a new value for the module successful loaded, then it is stored in <code>Package.loaded[mod_uri]</code>.  The value is returned.