Browse Source

fix: uncleared stack for call

Akeit0 7 months ago
parent
commit
4783ea09ea

+ 4 - 4
src/Lua/Runtime/LuaVirtualMachine.cs

@@ -1132,13 +1132,13 @@ public static partial class LuaVirtualMachine
             stack.Get(newBase) = iteratorRaw;
             stack.Get(newBase + 1) = stack.Get(RA + 1);
             stack.Get(newBase + 2) = stack.Get(RA + 2);
-            stack.NotifyTop(newBase + 3);
+            stack.SetTop(newBase + 3);
         }
         else
         {
             stack.Get(newBase) = stack.Get(RA + 1);
             stack.Get(newBase + 1) = stack.Get(RA + 2);
-            stack.NotifyTop(newBase + 2);
+            stack.SetTop(newBase + 2);
         }
 
         var argumentCount = isMetamethod ? 3 : 2;
@@ -1670,7 +1670,7 @@ public static partial class LuaVirtualMachine
                 argumentCount += 1;
             }
 
-            thread.Stack.NotifyTop(newBase + argumentCount);
+            thread.Stack.SetTop(newBase + argumentCount);
         }
 
         var variableArgumentCount = function.GetVariableArgumentCount(argumentCount);
@@ -1701,7 +1701,7 @@ public static partial class LuaVirtualMachine
                 argumentCount += 1;
             }
 
-            thread.Stack.NotifyTop(newBase + argumentCount);
+            thread.Stack.SetTop(newBase + argumentCount);
         }
 
 

+ 7 - 2
tests/Lua.Tests/LuaTests.cs

@@ -16,8 +16,13 @@ public class LuaTests
     
 
     [Test]
-    [TestCase("tests-lua/calls.lua")]
+    [TestCase("tests-lua/code.lua")]
+    [TestCase("tests-lua/goto.lua")]
+    [TestCase("tests-lua/constructs.lua")]
+    //[TestCase("tests-lua/sort.lua")] //check for "invalid order function" is not implemented
+    //[TestCase("tests-lua/calls.lua")] //  string.dump and reader function for load chunk is not implemented
     [TestCase("tests-lua/closure.lua")]
+    [TestCase("tests-lua/events.lua")]
     [TestCase("tests-lua/vararg.lua")]
     [TestCase("tests-lua/nextvar.lua")]
     [TestCase("tests-lua/math.lua")]
@@ -38,7 +43,7 @@ public class LuaTests
         {
             var traceback = e.LuaTraceback;
             var line = traceback.LastLine;
-            throw new Exception($"{path}:line {line}\n{e.InnerException} {e} ");
+            throw new Exception($"{path}:line {line}\n{e.InnerException}\n{e} ");
         }
     }
 }

+ 0 - 227
tests/Lua.Tests/tests-lua/db_mini.lua

@@ -1,227 +0,0 @@
--- testing debug library
-
-
-
-local a = 1
-
-local function multi_assert(expected, ...)
-    local arg = { ... }
-    for i = 1, #arg do
-        assert(arg[i] == expected[i])
-    end
-end
-local function test_locals(x, ...)
-    local b = "local b"
-    assert(debug.getlocal(test_locals, 1) == "x")
-    multi_assert({ "x", 1 }, debug.getlocal(1, 1))
-    multi_assert({ "b", "local b" }, debug.getlocal(1, 2))
-    multi_assert({ "(vararg)", 2 }, debug.getlocal(1, -1))
-    multi_assert({ "(vararg)", 3 }, debug.getlocal(1, -2))
-    multi_assert({ "a", 1 }, debug.getlocal(2, 1))
-    assert(debug.setlocal(2, 1, "new a") == "a")
-
-end
-
-test_locals(1, 2, 3)
-assert(a == "new a")
-
--- test file and string names truncation
-a = "function f () end"
-local function dostring (s, x)
-    return load(s, x)()
-end
-dostring(a)
-assert(debug.getinfo(f).short_src == string.format('[string "%s"]', a))
-dostring(a .. string.format("; %s\n=1", string.rep('p', 400)))
-assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$'))
-dostring(a .. string.format("; %s=1", string.rep('p', 400)))
-assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$'))
-dostring("\n" .. a)
-assert(debug.getinfo(f).short_src == '[string "..."]')
-dostring(a, "")
-assert(debug.getinfo(f).short_src == '[string ""]')
-dostring(a, "@xuxu")
-assert(debug.getinfo(f).short_src == "xuxu")
-dostring(a, "@" .. string.rep('p', 1000) .. 't')
-assert(string.find(debug.getinfo(f).short_src, "^%.%.%.p*t$"))
-dostring(a, "=xuxu")
-assert(debug.getinfo(f).short_src == "xuxu")
-dostring(a, string.format("=%s", string.rep('x', 500)))
-assert(string.find(debug.getinfo(f).short_src, "^x*$"))
-dostring(a, "=")
-assert(debug.getinfo(f).short_src == "")
-a = nil;
-f = nil;
-
-repeat
-    local g = { x = function()
-        local a = debug.getinfo(2)
-        assert(a.name == 'f' and a.namewhat == 'local')
-        a = debug.getinfo(1)
-        assert(a.name == 'x' and a.namewhat == 'field')
-        return 'xixi'
-    end }
-    local f = function()
-        return 1 + 1 and (not 1 or g.x())
-    end
-    assert(f() == 'xixi')
-    g = debug.getinfo(f)
-    assert(g.what == "Lua" and g.func == f and g.namewhat == "" and not g.name)
-
-    function f (x, name)
-        -- local!
-        if not name then
-            name = 'f'
-        end
-        local a = debug.getinfo(1)
-        print(a.name, a.namewhat, name)
-        assert(a.name == name and a.namewhat == 'local')
-        return x
-    end
-
-    -- breaks in different conditions
-    if 3 > 4 then
-        break
-    end ;
-    f()
-    if 3 < 4 then
-        a = 1
-    else
-        break
-    end ;
-    f()
-    while 1 do
-        local x = 10;
-        break
-    end ;
-    f()
-    local b = 1
-    if 3 > 4 then
-        return math.sin(1)
-    end ;
-    f()
-    a = 3 < 4;
-    f()
-    a = 3 < 4 or 1;
-    f()
-    repeat local x = 20;
-        if 4 > 3 then
-            f()
-        else
-            break
-        end ;
-        f() until 1
-    g = {}
-    f(g).x = f(2) and f(10) + f(9)
-    assert(g.x == f(19))
-    function g(x)
-        if not x then
-            return 3
-        end
-        return (x('a', 'x'))
-    end
-    assert(g(f) == 'a')
-until 1
-
-local function test_upvalues()
-    local a = 3
-    local function f(x)
-        local b = a + x
-        local function g(y)
-            local c = b + y
-            local function h()
-                return a + b + c
-            end
-            multi_assert({ "a", 3 }, debug.getupvalue(h, 1))
-            multi_assert({ "b", 4 }, debug.getupvalue(h, 2))
-            multi_assert({ "c", 6 }, debug.getupvalue(h, 3))
-            multi_assert({ "b", 4 }, debug.getupvalue(g, 1))
-            multi_assert({ "a", 3 }, debug.getupvalue(g, 2))
-            multi_assert({ "a", 3 }, debug.getupvalue(f, 1))
-            debug.setupvalue(h, 1, 10)
-            debug.setupvalue(h, 2, 20)
-            debug.setupvalue(h, 3, 30)
-            assert(h() == 60)
-        end
-        g(2)
-    end
-    f(1)
-end
-test_upvalues()
-local mt = {
-    __metatable = "my own metatable",
-    __index = function(o, k)
-        return o + k
-    end
-}
-
-local a = 1
-local b = 2
-local function f()
-    return a
-end
-local function g()
-    return b
-end
-
-debug.upvaluejoin(f, 1, g, 1)
-
-assert(f() == 2)
-b = 3
-assert(f() == 3)
-
-debug.setmetatable(10, mt)
-assert(debug.getmetatable(10) == mt)
-a = 10
-assert(a[3] == 13)
-
-assert(debug.traceback(print) == print)
-assert(debug.traceback(print) == print)
-
-assert(type(debug.getregistry()) == "table")
-
--- testing nparams, nups e isvararg
-local t = debug.getinfo(print, "u")
-assert(t.isvararg == true and t.nparams == 0 and t.nups == 0)
-
-t = debug.getinfo(function(a, b, c)
-end, "u")
-assert(t.isvararg == false and t.nparams == 3 and t.nups == 0)
-
-t = debug.getinfo(function(a, b, ...)
-    return t[a]
-end, "u")
-assert(t.isvararg == true and t.nparams == 2 and t.nups == 1)
-
-t = debug.getinfo(1)   -- main
-assert(t.isvararg == true and t.nparams == 0 and t.nups == 1 and
-        debug.getupvalue(t.func, 1) == "_ENV")
-
-
--- testing debugging of coroutines
-
-local function checktraceback (co, p, level)
-    local tb = debug.traceback(co, nil, level)
-    local i = 0
-    for l in string.gmatch(tb, "[^\n]+\n?") do
-        assert(i == 0 or string.find(l, p[i]))
-        i = i + 1
-    end
-    assert(p[i] == nil)
-end
-
-local function f (n)
-    if n > 0 then
-        f(n - 1)
-    else
-        coroutine.yield()
-    end
-end
-
-local co = coroutine.create(f)
-coroutine.resume(co, 3)
-checktraceback(co, { "yield", "db_mini.lua", "db_mini.lua", "db_mini.lua", "db_mini.lua" })
-checktraceback(co, { "db_mini.lua", "db_mini.lua", "db_mini.lua", "db_mini.lua" }, 1)
-checktraceback(co, { "db_mini.lua", "db_mini.lua", "db_mini.lua" }, 2)
-checktraceback(co, { "db_mini.lua" }, 4)
-checktraceback(co, {}, 40)