diff --git a/example/suite/src/main/java/party/iroiro/luajava/LuaTestSuite.java b/example/suite/src/main/java/party/iroiro/luajava/LuaTestSuite.java index 72f00cfb..1a768c64 100644 --- a/example/suite/src/main/java/party/iroiro/luajava/LuaTestSuite.java +++ b/example/suite/src/main/java/party/iroiro/luajava/LuaTestSuite.java @@ -681,6 +681,11 @@ private void testNotSupported() { } private void testStackOperations() { + try (Lua L = constructor.get()) { + assertEquals(0, L.getTop()); + assertEquals(0, L.newThread().getTop()); + } + Lua sub = L.newThread(); int top = L.getTop(); L.setTop(top + 1); diff --git a/example/suite/src/main/java/party/iroiro/luajava/value/LuaValueSuite.java b/example/suite/src/main/java/party/iroiro/luajava/value/LuaValueSuite.java index 01ed2ed8..1acd3816 100644 --- a/example/suite/src/main/java/party/iroiro/luajava/value/LuaValueSuite.java +++ b/example/suite/src/main/java/party/iroiro/luajava/value/LuaValueSuite.java @@ -22,20 +22,33 @@ public LuaValueSuite(T L) { public void test() { L.openLibraries(); - + assertEquals(0, L.getTop()); equalityTest(L); - equalityTest(L.newThread()); + assertEquals(0, L.getTop()); + Lua J = L.newThread(); + L.pop(1); + equalityTest(J); + assertEquals(0, L.getTop()); try (Lua K = new Lua51()) { equalityTest(K); } + assertEquals(0, L.getTop()); differentThreadTest(); + assertEquals(0, L.getTop()); tableTest(); + assertEquals(0, L.getTop()); tableMapTest(); + assertEquals(0, L.getTop()); nilTest(); + assertEquals(0, L.getTop()); stringTest(); + assertEquals(0, L.getTop()); toStringTest(); + assertEquals(0, L.getTop()); callTest(); + assertEquals(0, L.getTop()); luaStateTest(); + assertEquals(0, L.getTop()); } @SuppressWarnings("SuspiciousMethodCalls") @@ -43,16 +56,19 @@ private void tableMapTest() { LuaValue map = L.eval("t = { 1, 2, 3, 4, a = 5, b = 6, c = 7, d = 8 }; return t")[0]; assertEquals(8, map.entrySet().size()); assertEquals(4, map.length()); + assertEquals(0, L.getTop()); assertTrue(map.containsKey("a")); map.entrySet().removeIf(next -> next.getKey().toString().equals("a")); assertEquals(7, map.entrySet().size()); assertEquals(4, map.length()); + assertEquals(0, L.getTop()); L.run("assert(not t.a)"); assertFalse(map.containsKey("a")); assertEquals(7, map.remove("c").toInteger()); assertEquals(6, Objects.requireNonNull(map.put(L.from("b"), L.from(10))).toInteger()); assertEquals(10, map.get("b").toInteger()); assertEquals(1, map.get((Number) 1).toInteger()); + assertEquals(0, L.getTop()); assertThrows(NoSuchElementException.class, () -> L.eval("return {}")[0].entrySet().iterator().next()); assertThrows(IllegalStateException.class, () -> L.eval("return {}")[0].entrySet().iterator().remove()); @@ -67,6 +83,7 @@ private void tableMapTest() { assertThrows(UnsupportedOperationException.class, () -> i.set(1, new Object())); assertThrows(UnsupportedOperationException.class, () -> i.set("", new Object())); assertThrows(UnsupportedOperationException.class, i::call); + assertEquals(0, L.getTop()); assertEquals(1, i.toNumber(), 0.000001); assertEquals(1, i.toInteger()); @@ -74,6 +91,7 @@ private void tableMapTest() { L.push(0); LuaValue j = L.get(); assertFalse(j.toBoolean()); + assertEquals(0, L.getTop()); } private void toStringTest() { @@ -136,6 +154,7 @@ private void nilTest() { private void tableTest() { int top = L.getTop(); + assertEquals(0, L.getTop()); LuaValue[] values = L.eval("return {1, 2, 3, a = 'b', c = 'd'}, 1024"); assertEquals(2, values.length); LuaValue value = values[0]; @@ -147,6 +166,7 @@ private void tableTest() { assertEquals(3., map.get(3.)); assertEquals("b", map.get("a")); assertEquals("d", map.get("c")); + assertEquals(0, L.getTop()); assertEquals(top, L.getTop()); assertEquals(1., value.get(1).toJavaObject()); @@ -179,6 +199,8 @@ private void differentThreadTest() { assertThrows(UnsupportedOperationException.class, () -> L.get().get(K.get())); K.pushNil(); K.get().push(L); + assertEquals(NIL, L.type(-1)); + L.pop(1); K.pushNil(); LuaValue nil = K.get(); @@ -186,6 +208,7 @@ private void differentThreadTest() { assertTrue(L.isNil(-1)); L.pop(1); Lua J = L.newThread(); + L.pop(1); J.pushNil(); L.push(J.get(), Lua.Conversion.NONE); assertTrue(L.isNil(-1)); diff --git a/jni/luajava/jua.cpp b/jni/luajava/jua.cpp index 10335f83..1b83a964 100644 --- a/jni/luajava/jua.cpp +++ b/jni/luajava/jua.cpp @@ -269,6 +269,7 @@ void initMetaRegistry(lua_State * L) { lua_pushcfunction(L, &jobjectEquals); lua_setfield(L, -2, LUA_METAFIELD_EQ); } + lua_pop(L, 1); if (luaL_newmetatable(L, JAVA_PACKAGE_META_REGISTRY) == 1) { /* Lua: @@ -289,7 +290,6 @@ void initMetaRegistry(lua_State * L) { lua_pushcfunction(L, &jclassNewIndex); lua_setfield(L, -2, LUA_METAFIELD_NEWINDEX); } - lua_pop(L, 1); } diff --git a/lua52/jni/mod/luacomp.h b/lua52/jni/mod/luacomp.h index 1a76ef10..7525a1be 100644 --- a/lua52/jni/mod/luacomp.h +++ b/lua52/jni/mod/luacomp.h @@ -10,9 +10,11 @@ */ static inline void luaJ_openlib_call(lua_State * L, const char * libName, lua_CFunction loader) { luaL_requiref(L, libName, loader, 1); + lua_pop(L, 1); } luaL_Reg allAvailableLibs[] = { + { "", luaopen_base }, { "_G", luaopen_base }, { "package", luaopen_package }, { "coroutine", luaopen_coroutine }, diff --git a/lua53/jni/mod/luacomp.h b/lua53/jni/mod/luacomp.h index 208bf320..16b33dff 100644 --- a/lua53/jni/mod/luacomp.h +++ b/lua53/jni/mod/luacomp.h @@ -10,9 +10,11 @@ */ static inline void luaJ_openlib_call(lua_State * L, const char * libName, lua_CFunction loader) { luaL_requiref(L, libName, loader, 1); + lua_pop(L, 1); } luaL_Reg allAvailableLibs[] = { + { "", luaopen_base }, { "_G", luaopen_base }, { "package", luaopen_package }, { "coroutine", luaopen_coroutine }, diff --git a/lua54/jni/mod/luacomp.h b/lua54/jni/mod/luacomp.h index 6f7b8e83..4a041671 100644 --- a/lua54/jni/mod/luacomp.h +++ b/lua54/jni/mod/luacomp.h @@ -10,9 +10,11 @@ */ static inline void luaJ_openlib_call(lua_State * L, const char * libName, lua_CFunction loader) { luaL_requiref(L, libName, loader, 1); + lua_pop(L, 1); } luaL_Reg allAvailableLibs[] = { + { "", luaopen_base }, { "_G", luaopen_base }, { "package", luaopen_package }, { "coroutine", luaopen_coroutine }, diff --git a/luajava/src/main/java/party/iroiro/luajava/value/LuaTableValue.java b/luajava/src/main/java/party/iroiro/luajava/value/LuaTableValue.java index b88cf7de..28f93c19 100644 --- a/luajava/src/main/java/party/iroiro/luajava/value/LuaTableValue.java +++ b/luajava/src/main/java/party/iroiro/luajava/value/LuaTableValue.java @@ -170,7 +170,7 @@ public int size() { n++; L.pop(1); } - L.pop(2); + L.pop(1); return n; } }