Improve package lib behavior and error reporting.

This commit is contained in:
James Roseborough
2010-05-16 17:53:33 +00:00
parent fe7658e83b
commit ce13cc8621
14 changed files with 46 additions and 36 deletions

View File

@@ -361,7 +361,7 @@ public class Print extends Lua {
break; break;
case LuaValue.TFUNCTION: case LuaValue.TFUNCTION:
ps.print( ( v instanceof LuaClosure )? ps.print( ( v instanceof LuaClosure )?
((LuaClosure)v).p.tojstring(): v.tojstring() ); ((LuaClosure)v).p.toString(): v.tojstring() );
break; break;
case LuaValue.TUSERDATA: case LuaValue.TUSERDATA:
Object o = v.touserdata(); Object o = v.touserdata();

View File

@@ -44,8 +44,8 @@ public class Prototype {
public int maxstacksize; public int maxstacksize;
public String tojstring() { public String toString() {
return source + ":" + linedefined; return source + ":" + linedefined+"-"+lastlinedefined;
} }
/** Get the name of a local variable. /** Get the name of a local variable.

View File

@@ -46,6 +46,7 @@ public class CoroutineLib extends VarArgFunction {
"create", "resume", "running", "status", "yield", "wrap" }, "create", "resume", "running", "status", "yield", "wrap" },
CREATE); CREATE);
env.set("coroutine", t); env.set("coroutine", t);
PackageLib.instance.LOADED.set("coroutine", t);
return t; return t;
} }

View File

@@ -114,6 +114,7 @@ public class DebugLib extends VarArgFunction {
LuaTable t = new LuaTable(); LuaTable t = new LuaTable();
bind(t, DebugLib.class, NAMES, DEBUG); bind(t, DebugLib.class, NAMES, DEBUG);
env.set("debug", t); env.set("debug", t);
PackageLib.instance.LOADED.set("debug", t);
return t; return t;
} }

View File

@@ -197,6 +197,7 @@ public class IoLib extends OneArgFunction {
// return the table // return the table
env.set("io", t); env.set("io", t);
PackageLib.instance.LOADED.set("io", t);
return t; return t;
} }

View File

@@ -61,6 +61,7 @@ public class MathLib extends OneArgFunction {
((MathLibV) t.get("randomseed")).mathlib = this; ((MathLibV) t.get("randomseed")).mathlib = this;
((MathLibV) t.get("random" )).mathlib = this; ((MathLibV) t.get("random" )).mathlib = this;
env.set("math", t); env.set("math", t);
PackageLib.instance.LOADED.set("math", t);
return t; return t;
} }

View File

@@ -90,6 +90,7 @@ public class OsLib extends VarArgFunction {
LuaTable t = new LuaTable(); LuaTable t = new LuaTable();
bind(t, this.getClass(), NAMES, CLOCK); bind(t, this.getClass(), NAMES, CLOCK);
env.set("os", t); env.set("os", t);
PackageLib.instance.LOADED.set("os", t);
return t; return t;
} }

View File

@@ -21,7 +21,6 @@
******************************************************************************/ ******************************************************************************/
package org.luaj.vm2.lib; package org.luaj.vm2.lib;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintStream; import java.io.PrintStream;
@@ -92,6 +91,7 @@ public class PackageLib extends OneArgFunction {
lua_loader = new PkgLibV(env,"lua_loader", OP_LUA_LOADER,this), lua_loader = new PkgLibV(env,"lua_loader", OP_LUA_LOADER,this),
java_loader = new PkgLibV(env,"java_loader", OP_JAVA_LOADER,this), java_loader = new PkgLibV(env,"java_loader", OP_JAVA_LOADER,this),
}) }) ); }) }) );
LOADED.set("package", PACKAGE);
return env; return env;
} }
@@ -212,6 +212,8 @@ public class PackageLib extends OneArgFunction {
LuaFunction f = LuaThread.getCallstackFunction(1); LuaFunction f = LuaThread.getCallstackFunction(1);
if ( f == null ) if ( f == null )
error("no calling function"); error("no calling function");
if ( ! f.isclosure() )
error("'module' not called from a Lua function");
f.setfenv(module); f.setfenv(module);
// apply the functions // apply the functions
@@ -321,6 +323,7 @@ public class PackageLib extends OneArgFunction {
} }
public static Varargs loadlib( Varargs args ) { public static Varargs loadlib( Varargs args ) {
args.checkstring(1);
return varargsOf(NIL, valueOf("dynamic libraries not enabled"), valueOf("absent")); return varargsOf(NIL, valueOf("dynamic libraries not enabled"), valueOf("absent"));
} }

View File

@@ -51,6 +51,7 @@ public class StringLib extends OneArgFunction {
instance = t; instance = t;
if ( LuaString.s_metatable == null ) if ( LuaString.s_metatable == null )
LuaString.s_metatable = tableOf( new LuaValue[] { INDEX, t } ); LuaString.s_metatable = tableOf( new LuaValue[] { INDEX, t } );
PackageLib.instance.LOADED.set("string", t);
return t; return t;
} }

View File

@@ -36,6 +36,7 @@ public class TableLib extends OneArgFunction {
bind(t, TableLibV.class, new String[] { bind(t, TableLibV.class, new String[] {
"remove", "concat", "insert", "sort", "foreach", "foreachi", } ); "remove", "concat", "insert", "sort", "foreach", "foreachi", } );
env.set("table", t); env.set("table", t);
PackageLib.instance.LOADED.set("table", t);
return t; return t;
} }

View File

@@ -45,6 +45,7 @@ import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs; import org.luaj.vm2.Varargs;
import org.luaj.vm2.lib.BaseLib; import org.luaj.vm2.lib.BaseLib;
import org.luaj.vm2.lib.OneArgFunction; import org.luaj.vm2.lib.OneArgFunction;
import org.luaj.vm2.lib.PackageLib;
import org.luaj.vm2.lib.ThreeArgFunction; import org.luaj.vm2.lib.ThreeArgFunction;
import org.luaj.vm2.lib.TwoArgFunction; import org.luaj.vm2.lib.TwoArgFunction;
import org.luaj.vm2.lib.VarArgFunction; import org.luaj.vm2.lib.VarArgFunction;
@@ -72,10 +73,6 @@ public class LuajavaLib extends VarArgFunction {
private static LuaValue LENGTH = valueOf("length"); private static LuaValue LENGTH = valueOf("length");
public static void install(LuaValue globals) {
globals.set("luajava", new LuajavaLib());
}
public LuajavaLib() { public LuajavaLib() {
} }
@@ -86,6 +83,7 @@ public class LuajavaLib extends VarArgFunction {
LuaTable t = new LuaTable(); LuaTable t = new LuaTable();
bind( t, LuajavaLib.class, NAMES, BINDCLASS ); bind( t, LuajavaLib.class, NAMES, BINDCLASS );
env.set("luajava", t); env.set("luajava", t);
PackageLib.instance.LOADED.set("luajava", t);
return t; return t;
} }
case BINDCLASS: { case BINDCLASS: {

View File

@@ -132,12 +132,11 @@ local function arglists(typesets)
return ipairs(argsets) return ipairs(argsets)
end end
function lookup( name )
local function lookup( name )
return loadstring('return '..name)() return loadstring('return '..name)()
end end
local function invoke( name, arglist ) function invoke( name, arglist )
local s,c = pcall(lookup, name) local s,c = pcall(lookup, name)
if not s then return s,c end if not s then return s,c end
return pcall(c, unpack(arglist,1,arglist.n or #arglist)) return pcall(c, unpack(arglist,1,arglist.n or #arglist))

View File

@@ -1,6 +1,12 @@
package.path = "?.lua;test/lua/errors/?.lua" package.path = "?.lua;test/lua/errors/?.lua"
require 'args' require 'args'
local tostring = tostring
_G.tostring = function(x)
local s = tostring(x)
return type(x)=='number' and #s>4 and (s:sub(1,5)..'...') or s
end
-- arg type tests for math library functions -- arg type tests for math library functions
local somenumber = {1,0.75,'-1','-0.25'} local somenumber = {1,0.75,'-1','-0.25'}
local somepositive = {1,0.75,'2', '2.5'} local somepositive = {1,0.75,'2', '2.5'}

View File

@@ -22,28 +22,25 @@ checkallerrors('package.seeall',{notatable},'bad argument')
-- module tests - require special rigging -- module tests - require special rigging
banner('module') banner('module')
print( pcall( function() checkallerrors('module',{{20001},{nil,package.seeall,n=2},{nil,function()end,n=2}},"'module' not called from a Lua function")
checkallpass('module',{{20001}}) checkallerrors('module',{{'testmodule1'},{nil,'pqrs',aboolean,athread,atable}},"'module' not called from a Lua function")
end ) ) checkallerrors('module',{{aboolean,atable,function() end}},'bad argument')
print( pcall( function() checkallerrors('module',{{aboolean,atable,function() end},{package.seeall}},'bad argument')
checkallpass('module',{{20002},{package.seeall}})
end ) ) -- enclose each invokation in its own function
print( pcall( function() function invoke( name, arglist )
checkallpass('module',{{20003},{package.seeall},{function() end}}) assert( name=='module', 'module rig used for '..name )
end ) ) local func = function()
print( pcall( function() module( unpack(arglist,1,arglist.n or #arglist) )
checkallerrors('module',{{aboolean,atable,function() end}},'bad argument') end
checkallerrors('module',{{aboolean,atable,function() end},{package.seeall}},'bad argument') return pcall( func )
end ) ) end
print( pcall( function() checkallpass('module',{{'foo1',20001}})
checkallerrors('module',{{'testmodule1'},{'pqrs'}},'attempt to call') checkallpass('module',{{'foo2',20002},{package.seeall}})
end ) ) checkallpass('module',{{'foo3',20003},{package.seeall},{function() end}})
print( pcall( function() checkallerrors('module',{{aboolean,atable,function() end}},'bad argument')
checkallerrors('module',{{'testmodule2'},{aboolean}},'attempt to call') checkallerrors('module',{{aboolean,atable,function() end},{package.seeall}},'bad argument')
end ) ) checkallerrors('module',{{'testmodule2'},{'pqrs'}},'attempt to call')
print( pcall( function() checkallerrors('module',{{'testmodule3'},{aboolean}},'attempt to call')
checkallerrors('module',{{'testmodule3'},{athread}},'attempt to call') checkallerrors('module',{{'testmodule4'},{athread}},'attempt to call')
end ) ) checkallerrors('module',{{'testmodule5'},{atable}},'attempt to call')
print( pcall( function()
checkallerrors('module',{{'testmodule4'},{atable}},'attempt to call')
end ) )