From 45e60c4b21a9691d9dbf11201e5304ce56d5574d Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Wed, 23 Jul 2008 23:52:20 +0000 Subject: [PATCH] Improve argument type checking. --- src/core/org/luaj/lib/BaseLib.java | 4 +++- src/core/org/luaj/vm/LuaErrorException.java | 2 +- src/core/org/luaj/vm/LuaState.java | 5 ++++- src/test/errors/args.lua | 7 +++++-- src/test/errors/baselibargs.lua | 2 +- src/test/errors/mathlibargs.lua | 8 ++++---- src/test/res/mathlib.lua | 2 ++ src/test/res/module.lua | 16 ++++++++++++++++ src/test/res/pcalls.lua | 8 ++++++++ 9 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/core/org/luaj/lib/BaseLib.java b/src/core/org/luaj/lib/BaseLib.java index d00032f1..2331ef5c 100644 --- a/src/core/org/luaj/lib/BaseLib.java +++ b/src/core/org/luaj/lib/BaseLib.java @@ -18,6 +18,7 @@ import org.luaj.vm.LString; import org.luaj.vm.LTable; import org.luaj.vm.LValue; import org.luaj.vm.Lua; +import org.luaj.vm.LuaErrorException; import org.luaj.vm.LuaState; import org.luaj.vm.Platform; @@ -118,6 +119,7 @@ public class BaseLib extends LFunction { vm.pushnil(); vm.pushstring( message ); } + public boolean luaStackCall(LuaState vm) { switch ( id ) { case PRINT: { @@ -240,7 +242,7 @@ public class BaseLib extends LFunction { break; } case ERROR: { - vm.error(vm.checkstring(2), vm.optint(3,1)); + vm.error(vm.optstring(2,null), vm.optint(3,1)); break; } case ASSERT: { diff --git a/src/core/org/luaj/vm/LuaErrorException.java b/src/core/org/luaj/vm/LuaErrorException.java index 604e08a2..609aee61 100644 --- a/src/core/org/luaj/vm/LuaErrorException.java +++ b/src/core/org/luaj/vm/LuaErrorException.java @@ -74,7 +74,7 @@ public class LuaErrorException extends RuntimeException { * @return */ private static String addLineInfo(LuaState vm, String message, int level) { - if ( level < 1 ) + if ( level < 1 || message == null ) return message; if ( vm == null ) { if ( LThread.running != null ) diff --git a/src/core/org/luaj/vm/LuaState.java b/src/core/org/luaj/vm/LuaState.java index 076c1a13..78182425 100644 --- a/src/core/org/luaj/vm/LuaState.java +++ b/src/core/org/luaj/vm/LuaState.java @@ -401,7 +401,10 @@ public class LuaState extends Lua { closeUpVals(oldtop); /* close eventual pending closures */ String s = t.getMessage(); resettop(); - pushstring( s!=null? s: t.toString() ); + if ( s != null ) + pushstring( s ); + else + pushnil(); return (t instanceof OutOfMemoryError? LUA_ERRMEM: LUA_ERRRUN); } } diff --git a/src/test/errors/args.lua b/src/test/errors/args.lua index 35ed604e..25995d96 100644 --- a/src/test/errors/args.lua +++ b/src/test/errors/args.lua @@ -152,13 +152,16 @@ local function subbanner(name) print( '--- '..tostring(name) ) end +local function pack(s,...) + return s,{...} +end + -- check that all combinations of arguments pass function checkallpass( name, typesets, typesonly ) subbanner('checkallpass') for i,v in arglists(typesets) do local sig = signature(name,v) - local r = { invoke( name, v ) } - local s = table.remove( r, 1 ) + local s,r = pack( invoke( name, v ) ) if s then if typesonly then print( ok, sig, types(r) ) diff --git a/src/test/errors/baselibargs.lua b/src/test/errors/baselibargs.lua index 5e9da711..2ac6189e 100644 --- a/src/test/errors/baselibargs.lua +++ b/src/test/errors/baselibargs.lua @@ -59,7 +59,7 @@ checkallerrors('loadfile', {nonstring}, 'bad argument #1') banner('loadstring') checkallpass('loadstring', {{'return'}}) checkallpass('loadstring', {{'return'},{'mychunk'}}) -checkallpass('loadstring', {{'return a ... b'},{'mychunk'}}) +checkallpass('loadstring', {{'return a ... b'},{'mychunk'}},true) checkallerrors('loadstring', {{'return a ... b'},{'mychunk'}},'hello') checkallerrors('loadstring', {notastring,{nil,astring,anumber}}, 'bad argument #1') checkallerrors('loadstring', {{'return'},{afunction,atable}}, 'bad argument #2') diff --git a/src/test/errors/mathlibargs.lua b/src/test/errors/mathlibargs.lua index 50625a0a..7ca615d3 100644 --- a/src/test/errors/mathlibargs.lua +++ b/src/test/errors/mathlibargs.lua @@ -8,20 +8,20 @@ local notanumber = {nil,astring,aboolean,afunction,atable,athread} local nonnumber = {astring,aboolean,afunction,atable} local singleargfunctions = { - 'abs', 'acos', 'asin', 'atan', 'ceil', 'cos', 'cosh', 'deg', 'exp', 'floor', + 'abs', 'acos', 'asin', 'atan', 'cos', 'cosh', 'deg', 'exp', 'floor', 'rad', 'randomseed', 'sin', 'sinh', 'tan', 'tanh', 'frexp', } local singleargposdomain = { - 'log', 'log10', 'sqrt', + 'log', 'log10', 'sqrt', 'ceil', } local twoargfunctions = { - 'atan2', 'fmod', + 'atan2', } local twoargsposdomain = { - 'pow', + 'pow', 'fmod', } -- single argument tests diff --git a/src/test/res/mathlib.lua b/src/test/res/mathlib.lua index 3b4dedb9..49d47be0 100644 --- a/src/test/res/mathlib.lua +++ b/src/test/res/mathlib.lua @@ -4,6 +4,8 @@ print( math.sqrt( 9.0 ) ) print( math.modf( 5.25 ) ) local aliases = { + ['0']='', + ['-0']='', ['nan']='', ['inf']='', ['-inf']='', diff --git a/src/test/res/module.lua b/src/test/res/module.lua index d335dff3..cce7ddfa 100644 --- a/src/test/res/module.lua +++ b/src/test/res/module.lua @@ -1,3 +1,5 @@ + + -- unit tests for module() function local ids = {} local function id(obj) @@ -72,3 +74,17 @@ f() print( a ) print( getfenv(f)['a'] ) print( a ) + +-- do metatables work with package.loaded and require? +print( 'setting metatable for package.loaded' ) +print( 'package.loaded.mypreload', package.loaded.mypreload ) +print( 'setmetatable') +pcall( setmetatable, package.loaded, { __index={mypreload=12345}}) +print( 'package.loaded.mypreload', package.loaded.mypreload ) +print( "require, 'mypreload'", pcall( require, 'mypreload' ) ) +print( 'package.loaded.mypreload', package.loaded.mypreload ) +print( 'resetting metatable for package.loaded' ) +print( 'setmetatable') +pcall( setmetatable, package.loaded, nil ) +print( "require, 'mypreload'", (pcall( require, 'mypreload' )) ) +print( 'package.loaded.mypreload', package.loaded.mypreload ) diff --git a/src/test/res/pcalls.lua b/src/test/res/pcalls.lua index 066a3ee8..e1cab2ea 100644 --- a/src/test/res/pcalls.lua +++ b/src/test/res/pcalls.lua @@ -20,6 +20,13 @@ local function ct(f,a,b,c) return f(a,b,c) end +-- wrap pcall to be more useful in testing +local pc = pcall +local pcall = function(...) + local s,c = pc(...) + return s, type(c) +end + -- lua calls print( 'lc(22,33,44)', lc(22,33,44) ) print( 'pcall(lc,22,33,44)', pcall(lc,22,33,44) ) @@ -50,3 +57,4 @@ for i = 0,4 do print( 'pcall(le,i)', i, pcall(le,i) ) print( 'pcall(ge,i)', i, pcall(ge,i) ) end +