From f7e236b4b0ca0f0f6e25dcdf797fffd91d0770f4 Mon Sep 17 00:00:00 2001 From: wledfor2 Date: Sun, 8 Oct 2017 07:02:27 -0400 Subject: [PATCH 1/5] Fixed an issue causing a NullReferenceException when a Lua type *CAN* have a metatable, but doesn't --- src/MoonSharp.Interpreter/CoreLib/DebugModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs b/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs index c61d30ba..73d05e4c 100644 --- a/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs +++ b/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs @@ -82,7 +82,7 @@ public static DynValue getmetatable(ScriptExecutionContext executionContext, Cal DynValue v = args[0]; Script S = executionContext.GetScript(); - if (v.Type.CanHaveTypeMetatables()) + if (v.Type.CanHaveTypeMetatables() && S.GetTypeMetatable(v.Type) != null) return DynValue.NewTable(S.GetTypeMetatable(v.Type)); else if (v.Type == DataType.Table) return DynValue.NewTable(v.Table.MetaTable); From deaf6417c620560445e667c70252527d1beaa9df Mon Sep 17 00:00:00 2001 From: wledfor2 Date: Sun, 8 Oct 2017 13:54:00 -0400 Subject: [PATCH 2/5] Merged pull request https://github.com/xanathar/moonsharp/pull/173 --- src/MoonSharp.Interpreter/CoreLib/DebugModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs b/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs index 73d05e4c..1b768b46 100644 --- a/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs +++ b/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs @@ -84,7 +84,7 @@ public static DynValue getmetatable(ScriptExecutionContext executionContext, Cal if (v.Type.CanHaveTypeMetatables() && S.GetTypeMetatable(v.Type) != null) return DynValue.NewTable(S.GetTypeMetatable(v.Type)); - else if (v.Type == DataType.Table) + else if (v.Type == DataType.Table && v.Table.MetaTable != null) return DynValue.NewTable(v.Table.MetaTable); else return DynValue.Nil; From 3c096e72e7191a147d7d3119d19276a84dc05178 Mon Sep 17 00:00:00 2001 From: wledfor2 Date: Sun, 8 Oct 2017 13:59:39 -0400 Subject: [PATCH 3/5] Fixed arguments and return value of debug.setuservalue --- src/MoonSharp.Interpreter/CoreLib/DebugModule.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs b/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs index 1b768b46..ff8ee0e6 100644 --- a/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs +++ b/src/MoonSharp.Interpreter/CoreLib/DebugModule.cs @@ -65,9 +65,11 @@ public static DynValue getuservalue(ScriptExecutionContext executionContext, Cal public static DynValue setuservalue(ScriptExecutionContext executionContext, CallbackArguments args) { DynValue v = args.AsType(0, "setuservalue", DataType.UserData, false); - DynValue t = args.AsType(0, "setuservalue", DataType.Table, true); + DynValue t = args.AsType(1, "setuservalue", DataType.Table, true); - return v.UserData.UserValue = t; + v.UserData.UserValue = t; + + return v; } [MoonSharpModuleMethod] From e33dc082c9d662148aa370fb0117831db165cc22 Mon Sep 17 00:00:00 2001 From: wledfor2 Date: Sun, 8 Oct 2017 14:12:57 -0400 Subject: [PATCH 4/5] Re-enabled debug module tests --- src/MoonSharp.Interpreter.Tests/TapRunner.cs | 2 +- .../TestMore/310-debug.t | 27 ++++++++++++------- .../TestMoreTests.cs | 10 +++---- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/MoonSharp.Interpreter.Tests/TapRunner.cs b/src/MoonSharp.Interpreter.Tests/TapRunner.cs index f31dcfd8..15bab0f3 100644 --- a/src/MoonSharp.Interpreter.Tests/TapRunner.cs +++ b/src/MoonSharp.Interpreter.Tests/TapRunner.cs @@ -50,7 +50,7 @@ public TapRunner(string filename) public void Run() { - Script S = new Script(); + Script S = new Script(CoreModules.Preset_Complete); S.Options.DebugPrint = Print; diff --git a/src/MoonSharp.Interpreter.Tests/TestMore/310-debug.t b/src/MoonSharp.Interpreter.Tests/TestMore/310-debug.t index 76055802..9414a119 100644 --- a/src/MoonSharp.Interpreter.Tests/TestMore/310-debug.t +++ b/src/MoonSharp.Interpreter.Tests/TestMore/310-debug.t @@ -31,10 +31,12 @@ See "Programming in Lua", section 23 "The Debug Library". require 'Test.More' -plan(51) +plan(36) debug = require 'debug' +-- unsupported +--[[ info = debug.getinfo(is) type_ok(info, 'table', "function getinfo (function)") is(info.func, is, " .func") @@ -56,7 +58,6 @@ error_like(function () debug.getinfo('bad') end, error_like(function () debug.getinfo(is, 'X') end, "bad argument #2 to 'getinfo' %(invalid option%)", "function getinfo (bad opt)") - local name, value = debug.getlocal(0, 1) type_ok(name, 'string', "function getlocal (level)") is(value, 0) @@ -68,6 +69,7 @@ error_like(function () debug.getlocal(42, 1) end, local name, value = debug.getlocal(like, 1) type_ok(name, 'string', "function getlocal (func)") is(value, nil) +--]] t = {} is(debug.getmetatable(t), nil, "function getmetatable") @@ -85,13 +87,16 @@ is(debug.getmetatable(a), nil) debug.setmetatable(a, t1) is(debug.getmetatable(t), t1) +-- F61E3AA7247D4D1EB7A45430B0C8C9BB_MATH_RANDOM seems to be the only registry key used by MoonSharp local reg = debug.getregistry() type_ok(reg, 'table', "function getregistry") -type_ok(reg._LOADED, 'table') +type_ok(reg["F61E3AA7247D4D1EB7A45430B0C8C9BB_MATH_RANDOM"], 'userdata') local name = debug.getupvalue(plan, 1) type_ok(name, 'string', "function getupvalue") +-- unsupported +--[[ debug.sethook() hook, mask, count = debug.gethook() is(hook, nil, "function gethook") @@ -120,14 +125,15 @@ is(name, nil, "function setlocal (level)") error_like(function () debug.setlocal(42, 1, true) end, "bad argument #1 to 'setlocal' %(level out of range%)", "function getlocal (out of range)") +--]] t = {} t1 = {} is(debug.setmetatable(t, t1), t, "function setmetatable") -is(getmetatable(t), t1) +is(debug.getmetatable(t), t1) error_like(function () debug.setmetatable(t, true) end, - "^[^:]+:%d+: bad argument #2 to 'setmetatable' %(nil or table expected%)") + "^[^:]+:%d+: bad argument #2 to 'setmetatable' %(nil or table expected, got boolean%)") local name = debug.setupvalue(plan, 1, require 'Test.Builder':new()) type_ok(name, 'string', "function setupvalue") @@ -143,6 +149,7 @@ else is(old, nil, "function getuservalue") end is(debug.getuservalue(true), nil) + local data = {} r = debug.setuservalue(u, data) is(r, u, "function setuservalue") @@ -150,20 +157,22 @@ is(debug.getuservalue(u), data) r = debug.setuservalue(u, old) is(debug.getuservalue(u), old) +-- bad argument #2 to 'setuservalue' (nil or table expected, got boolean) error_like(function () debug.setuservalue({}, data) end, "^[^:]+:%d+: bad argument #1 to 'setuservalue' %(userdata expected, got table%)") error_like(function () debug.setuservalue(u, true) end, - "^[^:]+:%d+: bad argument #2 to 'setuservalue' %(table expected, got boolean%)") + "^[^:]+:%d+: bad argument #2 to 'setuservalue' %(nil or table expected, got boolean%)") -like(debug.traceback(), "^stack traceback:\n", "function traceback") +like(debug.traceback(), "^stack traceback:", "function traceback") -like(debug.traceback("message\n"), "^message\n\nstack traceback:\n", "function traceback with message") +like(debug.traceback("message"), "^message", "function traceback with message") like(debug.traceback(false), "false", "function traceback") +-- debug.upvalueid returns number instead of userdata as per implementation local id = debug.upvalueid(plan, 1) -type_ok(id, 'userdata', "function upvalueid") +type_ok(id, 'number', "function upvalueid") debug.upvaluejoin (pass, 1, fail, 1) diff --git a/src/MoonSharp.Interpreter.Tests/TestMoreTests.cs b/src/MoonSharp.Interpreter.Tests/TestMoreTests.cs index 31e44101..88a64b91 100644 --- a/src/MoonSharp.Interpreter.Tests/TestMoreTests.cs +++ b/src/MoonSharp.Interpreter.Tests/TestMoreTests.cs @@ -271,12 +271,12 @@ public void TestMore_309_os() } - //[Test] + [Test] //[Ignore] - //public void TestMore_310_debug() - //{ - // TapRunner.Run(@"TestMore/310-debug.t"); - //} + public void TestMore_310_debug() + { + TapRunner.Run(@"TestMore/310-debug.t"); + } [Test] From 9f4138265c77569bead79c347a401da1dd5ce0e8 Mon Sep 17 00:00:00 2001 From: wledfor2 Date: Sun, 8 Oct 2017 14:52:41 -0400 Subject: [PATCH 5/5] Updated all tap debug tests --- .../TestMore/310-debug.t | 27 ++++++++++++------- .../TestMore/310-debug.t | 27 ++++++++++++------- .../TestMore/310-debug.t | 27 ++++++++++++------- 3 files changed, 54 insertions(+), 27 deletions(-) diff --git a/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.Embeddable.portable40/TestMore/310-debug.t b/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.Embeddable.portable40/TestMore/310-debug.t index 76055802..9414a119 100644 --- a/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.Embeddable.portable40/TestMore/310-debug.t +++ b/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.Embeddable.portable40/TestMore/310-debug.t @@ -31,10 +31,12 @@ See "Programming in Lua", section 23 "The Debug Library". require 'Test.More' -plan(51) +plan(36) debug = require 'debug' +-- unsupported +--[[ info = debug.getinfo(is) type_ok(info, 'table', "function getinfo (function)") is(info.func, is, " .func") @@ -56,7 +58,6 @@ error_like(function () debug.getinfo('bad') end, error_like(function () debug.getinfo(is, 'X') end, "bad argument #2 to 'getinfo' %(invalid option%)", "function getinfo (bad opt)") - local name, value = debug.getlocal(0, 1) type_ok(name, 'string', "function getlocal (level)") is(value, 0) @@ -68,6 +69,7 @@ error_like(function () debug.getlocal(42, 1) end, local name, value = debug.getlocal(like, 1) type_ok(name, 'string', "function getlocal (func)") is(value, nil) +--]] t = {} is(debug.getmetatable(t), nil, "function getmetatable") @@ -85,13 +87,16 @@ is(debug.getmetatable(a), nil) debug.setmetatable(a, t1) is(debug.getmetatable(t), t1) +-- F61E3AA7247D4D1EB7A45430B0C8C9BB_MATH_RANDOM seems to be the only registry key used by MoonSharp local reg = debug.getregistry() type_ok(reg, 'table', "function getregistry") -type_ok(reg._LOADED, 'table') +type_ok(reg["F61E3AA7247D4D1EB7A45430B0C8C9BB_MATH_RANDOM"], 'userdata') local name = debug.getupvalue(plan, 1) type_ok(name, 'string', "function getupvalue") +-- unsupported +--[[ debug.sethook() hook, mask, count = debug.gethook() is(hook, nil, "function gethook") @@ -120,14 +125,15 @@ is(name, nil, "function setlocal (level)") error_like(function () debug.setlocal(42, 1, true) end, "bad argument #1 to 'setlocal' %(level out of range%)", "function getlocal (out of range)") +--]] t = {} t1 = {} is(debug.setmetatable(t, t1), t, "function setmetatable") -is(getmetatable(t), t1) +is(debug.getmetatable(t), t1) error_like(function () debug.setmetatable(t, true) end, - "^[^:]+:%d+: bad argument #2 to 'setmetatable' %(nil or table expected%)") + "^[^:]+:%d+: bad argument #2 to 'setmetatable' %(nil or table expected, got boolean%)") local name = debug.setupvalue(plan, 1, require 'Test.Builder':new()) type_ok(name, 'string', "function setupvalue") @@ -143,6 +149,7 @@ else is(old, nil, "function getuservalue") end is(debug.getuservalue(true), nil) + local data = {} r = debug.setuservalue(u, data) is(r, u, "function setuservalue") @@ -150,20 +157,22 @@ is(debug.getuservalue(u), data) r = debug.setuservalue(u, old) is(debug.getuservalue(u), old) +-- bad argument #2 to 'setuservalue' (nil or table expected, got boolean) error_like(function () debug.setuservalue({}, data) end, "^[^:]+:%d+: bad argument #1 to 'setuservalue' %(userdata expected, got table%)") error_like(function () debug.setuservalue(u, true) end, - "^[^:]+:%d+: bad argument #2 to 'setuservalue' %(table expected, got boolean%)") + "^[^:]+:%d+: bad argument #2 to 'setuservalue' %(nil or table expected, got boolean%)") -like(debug.traceback(), "^stack traceback:\n", "function traceback") +like(debug.traceback(), "^stack traceback:", "function traceback") -like(debug.traceback("message\n"), "^message\n\nstack traceback:\n", "function traceback with message") +like(debug.traceback("message"), "^message", "function traceback with message") like(debug.traceback(false), "false", "function traceback") +-- debug.upvalueid returns number instead of userdata as per implementation local id = debug.upvalueid(plan, 1) -type_ok(id, 'userdata', "function upvalueid") +type_ok(id, 'number', "function upvalueid") debug.upvaluejoin (pass, 1, fail, 1) diff --git a/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.net40-client/TestMore/310-debug.t b/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.net40-client/TestMore/310-debug.t index 76055802..9414a119 100644 --- a/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.net40-client/TestMore/310-debug.t +++ b/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.net40-client/TestMore/310-debug.t @@ -31,10 +31,12 @@ See "Programming in Lua", section 23 "The Debug Library". require 'Test.More' -plan(51) +plan(36) debug = require 'debug' +-- unsupported +--[[ info = debug.getinfo(is) type_ok(info, 'table', "function getinfo (function)") is(info.func, is, " .func") @@ -56,7 +58,6 @@ error_like(function () debug.getinfo('bad') end, error_like(function () debug.getinfo(is, 'X') end, "bad argument #2 to 'getinfo' %(invalid option%)", "function getinfo (bad opt)") - local name, value = debug.getlocal(0, 1) type_ok(name, 'string', "function getlocal (level)") is(value, 0) @@ -68,6 +69,7 @@ error_like(function () debug.getlocal(42, 1) end, local name, value = debug.getlocal(like, 1) type_ok(name, 'string', "function getlocal (func)") is(value, nil) +--]] t = {} is(debug.getmetatable(t), nil, "function getmetatable") @@ -85,13 +87,16 @@ is(debug.getmetatable(a), nil) debug.setmetatable(a, t1) is(debug.getmetatable(t), t1) +-- F61E3AA7247D4D1EB7A45430B0C8C9BB_MATH_RANDOM seems to be the only registry key used by MoonSharp local reg = debug.getregistry() type_ok(reg, 'table', "function getregistry") -type_ok(reg._LOADED, 'table') +type_ok(reg["F61E3AA7247D4D1EB7A45430B0C8C9BB_MATH_RANDOM"], 'userdata') local name = debug.getupvalue(plan, 1) type_ok(name, 'string', "function getupvalue") +-- unsupported +--[[ debug.sethook() hook, mask, count = debug.gethook() is(hook, nil, "function gethook") @@ -120,14 +125,15 @@ is(name, nil, "function setlocal (level)") error_like(function () debug.setlocal(42, 1, true) end, "bad argument #1 to 'setlocal' %(level out of range%)", "function getlocal (out of range)") +--]] t = {} t1 = {} is(debug.setmetatable(t, t1), t, "function setmetatable") -is(getmetatable(t), t1) +is(debug.getmetatable(t), t1) error_like(function () debug.setmetatable(t, true) end, - "^[^:]+:%d+: bad argument #2 to 'setmetatable' %(nil or table expected%)") + "^[^:]+:%d+: bad argument #2 to 'setmetatable' %(nil or table expected, got boolean%)") local name = debug.setupvalue(plan, 1, require 'Test.Builder':new()) type_ok(name, 'string', "function setupvalue") @@ -143,6 +149,7 @@ else is(old, nil, "function getuservalue") end is(debug.getuservalue(true), nil) + local data = {} r = debug.setuservalue(u, data) is(r, u, "function setuservalue") @@ -150,20 +157,22 @@ is(debug.getuservalue(u), data) r = debug.setuservalue(u, old) is(debug.getuservalue(u), old) +-- bad argument #2 to 'setuservalue' (nil or table expected, got boolean) error_like(function () debug.setuservalue({}, data) end, "^[^:]+:%d+: bad argument #1 to 'setuservalue' %(userdata expected, got table%)") error_like(function () debug.setuservalue(u, true) end, - "^[^:]+:%d+: bad argument #2 to 'setuservalue' %(table expected, got boolean%)") + "^[^:]+:%d+: bad argument #2 to 'setuservalue' %(nil or table expected, got boolean%)") -like(debug.traceback(), "^stack traceback:\n", "function traceback") +like(debug.traceback(), "^stack traceback:", "function traceback") -like(debug.traceback("message\n"), "^message\n\nstack traceback:\n", "function traceback with message") +like(debug.traceback("message"), "^message", "function traceback with message") like(debug.traceback(false), "false", "function traceback") +-- debug.upvalueid returns number instead of userdata as per implementation local id = debug.upvalueid(plan, 1) -type_ok(id, 'userdata', "function upvalueid") +type_ok(id, 'number', "function upvalueid") debug.upvaluejoin (pass, 1, fail, 1) diff --git a/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.portable40/TestMore/310-debug.t b/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.portable40/TestMore/310-debug.t index 76055802..9414a119 100644 --- a/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.portable40/TestMore/310-debug.t +++ b/src/MoonSharp.Interpreter.Tests/_Projects/MoonSharp.Interpreter.Tests.portable40/TestMore/310-debug.t @@ -31,10 +31,12 @@ See "Programming in Lua", section 23 "The Debug Library". require 'Test.More' -plan(51) +plan(36) debug = require 'debug' +-- unsupported +--[[ info = debug.getinfo(is) type_ok(info, 'table', "function getinfo (function)") is(info.func, is, " .func") @@ -56,7 +58,6 @@ error_like(function () debug.getinfo('bad') end, error_like(function () debug.getinfo(is, 'X') end, "bad argument #2 to 'getinfo' %(invalid option%)", "function getinfo (bad opt)") - local name, value = debug.getlocal(0, 1) type_ok(name, 'string', "function getlocal (level)") is(value, 0) @@ -68,6 +69,7 @@ error_like(function () debug.getlocal(42, 1) end, local name, value = debug.getlocal(like, 1) type_ok(name, 'string', "function getlocal (func)") is(value, nil) +--]] t = {} is(debug.getmetatable(t), nil, "function getmetatable") @@ -85,13 +87,16 @@ is(debug.getmetatable(a), nil) debug.setmetatable(a, t1) is(debug.getmetatable(t), t1) +-- F61E3AA7247D4D1EB7A45430B0C8C9BB_MATH_RANDOM seems to be the only registry key used by MoonSharp local reg = debug.getregistry() type_ok(reg, 'table', "function getregistry") -type_ok(reg._LOADED, 'table') +type_ok(reg["F61E3AA7247D4D1EB7A45430B0C8C9BB_MATH_RANDOM"], 'userdata') local name = debug.getupvalue(plan, 1) type_ok(name, 'string', "function getupvalue") +-- unsupported +--[[ debug.sethook() hook, mask, count = debug.gethook() is(hook, nil, "function gethook") @@ -120,14 +125,15 @@ is(name, nil, "function setlocal (level)") error_like(function () debug.setlocal(42, 1, true) end, "bad argument #1 to 'setlocal' %(level out of range%)", "function getlocal (out of range)") +--]] t = {} t1 = {} is(debug.setmetatable(t, t1), t, "function setmetatable") -is(getmetatable(t), t1) +is(debug.getmetatable(t), t1) error_like(function () debug.setmetatable(t, true) end, - "^[^:]+:%d+: bad argument #2 to 'setmetatable' %(nil or table expected%)") + "^[^:]+:%d+: bad argument #2 to 'setmetatable' %(nil or table expected, got boolean%)") local name = debug.setupvalue(plan, 1, require 'Test.Builder':new()) type_ok(name, 'string', "function setupvalue") @@ -143,6 +149,7 @@ else is(old, nil, "function getuservalue") end is(debug.getuservalue(true), nil) + local data = {} r = debug.setuservalue(u, data) is(r, u, "function setuservalue") @@ -150,20 +157,22 @@ is(debug.getuservalue(u), data) r = debug.setuservalue(u, old) is(debug.getuservalue(u), old) +-- bad argument #2 to 'setuservalue' (nil or table expected, got boolean) error_like(function () debug.setuservalue({}, data) end, "^[^:]+:%d+: bad argument #1 to 'setuservalue' %(userdata expected, got table%)") error_like(function () debug.setuservalue(u, true) end, - "^[^:]+:%d+: bad argument #2 to 'setuservalue' %(table expected, got boolean%)") + "^[^:]+:%d+: bad argument #2 to 'setuservalue' %(nil or table expected, got boolean%)") -like(debug.traceback(), "^stack traceback:\n", "function traceback") +like(debug.traceback(), "^stack traceback:", "function traceback") -like(debug.traceback("message\n"), "^message\n\nstack traceback:\n", "function traceback with message") +like(debug.traceback("message"), "^message", "function traceback with message") like(debug.traceback(false), "false", "function traceback") +-- debug.upvalueid returns number instead of userdata as per implementation local id = debug.upvalueid(plan, 1) -type_ok(id, 'userdata', "function upvalueid") +type_ok(id, 'number', "function upvalueid") debug.upvaluejoin (pass, 1, fail, 1)