From a63f819a375245f9badf60864b13510b050bd5de Mon Sep 17 00:00:00 2001 From: Aleksandr Fedchin Date: Wed, 22 Jul 2026 16:38:13 +0200 Subject: [PATCH 1/3] Call NotifyTop after pushing the length of a table onto the stack --- src/Lua/Runtime/LuaVirtualMachine.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Lua/Runtime/LuaVirtualMachine.cs b/src/Lua/Runtime/LuaVirtualMachine.cs index 6519850d..6b6a2b0b 100644 --- a/src/Lua/Runtime/LuaVirtualMachine.cs +++ b/src/Lua/Runtime/LuaVirtualMachine.cs @@ -2666,6 +2666,7 @@ out metamethod { var RA = context.Instruction.A + context.FrameBase; stack.Get(RA) = table.ArrayLength; + stack.NotifyTop(RA + 1); return true; } From d7d251cbe7946a9e79a35be0bbd21c801711d79d Mon Sep 17 00:00:00 2001 From: Aleksandr Fedchin Date: Wed, 22 Jul 2026 16:45:27 +0200 Subject: [PATCH 2/3] Add a regression test to verify that the stack is cleared correctly after computing the length of a table --- tests/Lua.Tests/LuaTests.cs | 1 + tests/Lua.Tests/tests-lua/table-length.lua | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 tests/Lua.Tests/tests-lua/table-length.lua diff --git a/tests/Lua.Tests/LuaTests.cs b/tests/Lua.Tests/LuaTests.cs index 1c48638a..f4933847 100644 --- a/tests/Lua.Tests/LuaTests.cs +++ b/tests/Lua.Tests/LuaTests.cs @@ -81,6 +81,7 @@ static string PatchFilesLuaSource(string source) [TestCase("tests-lua/coroutine.lua")] [TestCase("tests-lua/db.lua")] [TestCase("tests-lua/verybig.lua")] + [TestCase("tests-lua/table-length.lua")] public async Task Test_Lua(string file) { var path = FileHelper.GetAbsolutePath(file); diff --git a/tests/Lua.Tests/tests-lua/table-length.lua b/tests/Lua.Tests/tests-lua/table-length.lua new file mode 100644 index 00000000..b255fe6f --- /dev/null +++ b/tests/Lua.Tests/tests-lua/table-length.lua @@ -0,0 +1,11 @@ +function f1() + local c = {} + return #c +end + +function f2(a, b) + assert(b == nil) +end + +f1() +f2() From a9124e04505b1d39127c4c55cab9f434fcc21413 Mon Sep 17 00:00:00 2001 From: Sasha Fedchin Date: Thu, 23 Jul 2026 09:53:55 +0200 Subject: [PATCH 3/3] Move the test to OperatorTests --- tests/Lua.Tests/LuaTests.cs | 1 - tests/Lua.Tests/OperatorTests.cs | 20 ++++++++++++++++++++ tests/Lua.Tests/tests-lua/table-length.lua | 11 ----------- 3 files changed, 20 insertions(+), 12 deletions(-) delete mode 100644 tests/Lua.Tests/tests-lua/table-length.lua diff --git a/tests/Lua.Tests/LuaTests.cs b/tests/Lua.Tests/LuaTests.cs index f4933847..1c48638a 100644 --- a/tests/Lua.Tests/LuaTests.cs +++ b/tests/Lua.Tests/LuaTests.cs @@ -81,7 +81,6 @@ static string PatchFilesLuaSource(string source) [TestCase("tests-lua/coroutine.lua")] [TestCase("tests-lua/db.lua")] [TestCase("tests-lua/verybig.lua")] - [TestCase("tests-lua/table-length.lua")] public async Task Test_Lua(string file) { var path = FileHelper.GetAbsolutePath(file); diff --git a/tests/Lua.Tests/OperatorTests.cs b/tests/Lua.Tests/OperatorTests.cs index 8e46b88c..de5c54c5 100644 --- a/tests/Lua.Tests/OperatorTests.cs +++ b/tests/Lua.Tests/OperatorTests.cs @@ -184,4 +184,24 @@ public async Task Test_GreaterThanOrEquals(double a, double b) Assert.That(result, Has.Length.EqualTo(1)); Assert.That(result[0], Is.EqualTo(new LuaValue(a >= b))); } + + [Test] + public async Task Test_TableLength() + { + using var state = LuaState.Create(); + state.OpenBasicLibrary(); + var source = + @" +function f1() + local c = {} + return #c +end +function f2(a, b) + assert(b == nil) +end +f1() +f2() +"; + await state.DoStringAsync(source); + } } diff --git a/tests/Lua.Tests/tests-lua/table-length.lua b/tests/Lua.Tests/tests-lua/table-length.lua deleted file mode 100644 index b255fe6f..00000000 --- a/tests/Lua.Tests/tests-lua/table-length.lua +++ /dev/null @@ -1,11 +0,0 @@ -function f1() - local c = {} - return #c -end - -function f2(a, b) - assert(b == nil) -end - -f1() -f2()