diff --git a/src/core/org/luaj/lib/BaseLib.java b/src/core/org/luaj/lib/BaseLib.java index 087a82c9..7ff8e119 100644 --- a/src/core/org/luaj/lib/BaseLib.java +++ b/src/core/org/luaj/lib/BaseLib.java @@ -397,8 +397,8 @@ public class BaseLib extends LFunction { } } - // return true if laoded, false if error put onto the stack - private static boolean loadis(LuaState vm, InputStream is, String chunkname ) { + // return true if loaded, false if error put onto the stack + static boolean loadis(LuaState vm, InputStream is, String chunkname ) { try { vm.resettop(); if ( 0 != vm.load(is, chunkname) ) { diff --git a/src/core/org/luaj/lib/PackageLib.java b/src/core/org/luaj/lib/PackageLib.java index 127cb0a7..d3fa2bc2 100644 --- a/src/core/org/luaj/lib/PackageLib.java +++ b/src/core/org/luaj/lib/PackageLib.java @@ -23,6 +23,7 @@ package org.luaj.lib; import java.io.InputStream; import java.io.PrintStream; +import java.util.Vector; import org.luaj.vm.CallInfo; import org.luaj.vm.LBoolean; @@ -33,10 +34,13 @@ import org.luaj.vm.LTable; import org.luaj.vm.LValue; import org.luaj.vm.Lua; import org.luaj.vm.LuaState; +import org.luaj.vm.Platform; public class PackageLib extends LFunction { + public static final String DEFAULT_LUA_PATH = "?.luac;?.lua"; + public static InputStream STDIN = null; public static PrintStream STDOUT = System.out; public static LTable LOADED = new LTable(); @@ -47,6 +51,11 @@ public class PackageLib extends LFunction { private static final LString _DOT = new LString("."); private static final LString _EMPTY = new LString(""); private static final LString __INDEX = new LString("__index"); + private static final LString _LOADERS = new LString("loaders"); + private static final LString _PRELOAD = new LString("preload"); + private static final LString _PATH = new LString("path"); + private static final LValue _SENTINEL = _EMPTY; + private static final LString _LUA_PATH = new LString(DEFAULT_LUA_PATH); private static final String[] NAMES = { "package", @@ -54,6 +63,9 @@ public class PackageLib extends LFunction { "require", "loadlib", "seeall", + "preload_loader", + "lua_loader", + "java_loader", }; private static final int INSTALL = 0; @@ -61,16 +73,27 @@ public class PackageLib extends LFunction { private static final int REQUIRE = 2; private static final int LOADLIB = 3; private static final int SEEALL = 4; + private static final int PRELOAD_LOADER = 5; + private static final int LUA_LOADER = 6; + private static final int JAVA_LOADER = 7; + // all functions in package share this environment + private static LTable pckg; public static void install( LTable globals ) { - for ( int i=1; i§2.8). * */ - public void getfield(int index, String k) { + public void getfield(int index, LString k) { LTable t = totable(index); - // TODO: what if this triggers metatable ops - // pushlvalue( t.luaGetTable(this, t, new LString(k)) ); - t.luaGetTable(this, t, new LString(k)); + t.luaGetTable(this, t, k); } /** @@ -2039,10 +2043,10 @@ public class LuaState extends Lua { * trigger a metamethod for the "newindex" event (see §2.8). */ - public void setfield(int index, String k) { + public void setfield(int index, LString k) { LTable t = totable(index); LValue v = poplvalue(); - t.luaSetTable(this, t, new LString(k), v); + t.luaSetTable(this, t, k, v); } /** @@ -2570,4 +2574,21 @@ public class LuaState extends Lua { return topointer(index).toJavaBoxedLong(); } + /** + * Get the current environment. + * + * @return LTable the current environment + */ +// public LTable curr_env() { +// LuaState vm = (LThread.running!=null? +// LThread.running.threadVm: +// this); +// for ( int i=vm.cc; i>=0; i-- ) { +// LClosure c = vm.calls[cc].closure; +// if ( c != null ) +// return c.env; +// } +// return _G; +// } + } diff --git a/src/sample/org/luaj/sample/LuaRunner.java b/src/sample/org/luaj/sample/LuaRunner.java index 363fbe05..2dd47dad 100644 --- a/src/sample/org/luaj/sample/LuaRunner.java +++ b/src/sample/org/luaj/sample/LuaRunner.java @@ -54,6 +54,8 @@ public class LuaRunner { // load the file InputStream is = LuaRunner.class.getResourceAsStream( script ); + if ( is == null ) + throw new java.io.FileNotFoundException( "not found: "+script ); LPrototype p = LoadState.undump(state, is, script); // create closure and execute diff --git a/src/test/java/org/luaj/vm/LuaJTest.java b/src/test/java/org/luaj/vm/LuaJTest.java index d7e98023..d548179d 100644 --- a/src/test/java/org/luaj/vm/LuaJTest.java +++ b/src/test/java/org/luaj/vm/LuaJTest.java @@ -90,6 +90,10 @@ public class LuaJTest extends TestCase { runTest( "pcalls" ); } + public void testRequire() throws IOException, InterruptedException { + runTest( "require" ); + } + public void testSelect() throws IOException, InterruptedException { runTest( "select" ); } diff --git a/src/test/res/require.lua b/src/test/res/require.lua index ed3ff7a4..f7e0e610 100644 --- a/src/test/res/require.lua +++ b/src/test/res/require.lua @@ -1,5 +1,6 @@ -- unit tests for require() function local ids = {} +local ti = table.insert local function id(obj) if not obj or type(obj) == 'number' or type(obj) == 'string' then return obj @@ -8,12 +9,13 @@ local function id(obj) if v then return v end - table.insert(ids,obj) + ti(ids,obj) ids[obj] = type(obj)..'.'..tostring(#ids) return ids[obj] end -- tests on require +package.path='?.lua;src/test/res/?.lua' function f( name ) print( module( 'testmod', package.seeall ) ) print( 'before', id(sample), id(bogus), id(_G[name]) ); @@ -33,7 +35,7 @@ f('bogus') print( 'main', id(sample), id(bogus), id(custom) ); -- custom loader chain -for i=1,4 do +for i=1,3 do print( i,id(package.loaders[i]) ) end function loader1( ... )