diff --git a/src/core/org/luaj/vm2/LuaValue.java b/src/core/org/luaj/vm2/LuaValue.java index 694c2dde..32efb000 100644 --- a/src/core/org/luaj/vm2/LuaValue.java +++ b/src/core/org/luaj/vm2/LuaValue.java @@ -216,7 +216,7 @@ public class LuaValue extends Varargs { public LuaValue call() { return callmt().call(this); } public LuaValue call(LuaValue arg) { return callmt().call(this,arg); } public LuaValue call(LuaValue arg1, LuaValue arg2) { return callmt().call(this,arg1,arg2); } - public LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) { return callmt().invoke(LuaValue.varargsOf(new LuaValue[]{this,arg1,arg2,arg3})).arg1(); } + public LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) { return callmt().invoke(new LuaValue[]{this,arg1,arg2,arg3}).arg1(); } public LuaValue method(String name) { return this.get(name).call(this); } public LuaValue method(LuaValue name) { return this.get(name).call(this); } public LuaValue method(String name, LuaValue arg) { return this.get(name).call(this,arg); } @@ -224,7 +224,7 @@ public class LuaValue extends Varargs { public LuaValue method(String name, LuaValue arg1, LuaValue arg2) { return this.get(name).call(this,arg1,arg2); } public LuaValue method(LuaValue name, LuaValue arg1, LuaValue arg2) { return this.get(name).call(this,arg1,arg2); } public Varargs invoke() { return invoke(NONE); } - public Varargs invoke(Varargs args) { return callmt().invoke(args); } + public Varargs invoke(Varargs args) { return callmt().invoke(this,args); } public Varargs invoke(LuaValue arg,Varargs varargs) { return invoke(varargsOf(arg,varargs)); } public Varargs invoke(LuaValue arg1,LuaValue arg2,Varargs varargs) { return invoke(varargsOf(arg1,arg2,varargs)); } public Varargs invoke(LuaValue[] args) { return invoke(varargsOf(args)); } diff --git a/src/core/org/luaj/vm2/lib/DebugLib.java b/src/core/org/luaj/vm2/lib/DebugLib.java index bddb1909..0dee5d2a 100644 --- a/src/core/org/luaj/vm2/lib/DebugLib.java +++ b/src/core/org/luaj/vm2/lib/DebugLib.java @@ -557,6 +557,7 @@ public class DebugLib extends VarArgFunction { case TBOOLEAN: LuaBoolean.s_metatable = mt; break; case TSTRING: LuaString.s_metatable = mt; break; case TFUNCTION: LuaFunction.s_metatable = mt; break; + case TTHREAD: LuaThread.s_metatable = mt; break; default: object.setmetatable( mt ); } return LuaValue.TRUE; diff --git a/test/junit/org/luaj/vm2/CompatibiltyTest.java b/test/junit/org/luaj/vm2/CompatibiltyTest.java index 0769cd70..2b63c03f 100644 --- a/test/junit/org/luaj/vm2/CompatibiltyTest.java +++ b/test/junit/org/luaj/vm2/CompatibiltyTest.java @@ -49,6 +49,7 @@ public class CompatibiltyTest extends TestSuite { public void testIoLib() { runTest("iolib"); } public void testManyUpvals() { runTest("manyupvals"); } public void testMathLib() { runTest("mathlib"); } + public void testMetatags() { runTest("metatags"); } public void testOsLib() { runTest("oslib"); } public void testStringLib() { runTest("stringlib"); } public void testTableLib() { runTest("tablelib"); } diff --git a/test/lua/metatags.lua b/test/lua/metatags.lua new file mode 100644 index 00000000..ca5e59a2 --- /dev/null +++ b/test/lua/metatags.lua @@ -0,0 +1,39 @@ +print( '---- initial metatables' ) +local values = { 1, false, coroutine.create( function() end ) } +for i=1,#values do + print( debug.getmetatable( values[i] ) ) +end + +local mt = { + __call=function(a,b,c) + print( 'mt.__call()', type(a), type(b), type(c), b, c ) + return '__call-result' + end, +} + +-- pcall a function and check for a pattern in the error string +ecall = function(pattern, ...) + local s,e = pcall(...) + if not s then e = string.match(e,pattern) or e end + return s,e +end + +print( '---- __call' ) +for i=1,#values do + print( type(values[i]), 'before', ecall( 'attempt to call', function() return values[i]('a','b') end ) ) + print( debug.setmetatable( values[i], mt ) ) + print( type(values[i]), 'after', pcall( function() return values[i]() end ) ) + print( type(values[i]), 'after', pcall( function() return values[i]('a') end ) ) + print( type(values[i]), 'after', pcall( function() return values[i]('a','b') end ) ) + print( type(values[i]), 'after', pcall( function() return values[i]('a','b','c') end ) ) + print( type(values[i]), 'after', pcall( function() return values[i]('a','b','c','d') end ) ) + print( debug.setmetatable( values[i], nil ) ) +end + + + +print( '---- final metatables' ) +for i=1,#values do + print( debug.getmetatable( values[i] ) ) +end + \ No newline at end of file