diff --git a/src/main/java/org/squiddev/cobalt/LuaTable.java b/src/main/java/org/squiddev/cobalt/LuaTable.java index 6ec82539..a124a8fc 100644 --- a/src/main/java/org/squiddev/cobalt/LuaTable.java +++ b/src/main/java/org/squiddev/cobalt/LuaTable.java @@ -576,8 +576,7 @@ private void rehash(LuaValue extraKey, boolean mode) { private int getFreePos() { if (keys.length == 0) return -1; while (lastFree >= 0) { - LuaValue last = key(lastFree--); - if (last == NIL) { + if (keys[lastFree--] == NIL) { return lastFree + 1; } } @@ -865,8 +864,6 @@ public void rawsetImpl(LuaValue key, LuaValue value) { return; } - // TODO: Check valid key here instead of at the call site! - do { int node = getNode(key); if (node == -1) node = newKey(key); diff --git a/src/test/java/org/squiddev/cobalt/table/TableHashTest.java b/src/test/java/org/squiddev/cobalt/table/TableHashTest.java index b53aae5f..1e1815d3 100644 --- a/src/test/java/org/squiddev/cobalt/table/TableHashTest.java +++ b/src/test/java/org/squiddev/cobalt/table/TableHashTest.java @@ -266,4 +266,21 @@ public void testShrink() { for (int i = 0; i < 8; i++) t.rawset("new_key_" + i, Constants.TRUE); assertEquals(8, TableOperations.getHashLength(t)); } + + @Test + public void testWeakCanBeReplaced() throws LuaError { + var t = new LuaTable(); + + var mt = new LuaTable(); + mt.rawset("__mode", ValueFactory.valueOf("k")); + t.setMetatable(null, mt); + + for (int j = 0; j < 16; j++) { + for (int i = 0; i < 256; i++) t.rawset(new LuaTable(), Constants.TRUE); + System.gc(); + + int hash = TableOperations.getHashLength(t); + if (hash > 512) throw new AssertionError("Expected hash to be <=512, but is " + hash); + } + } }