diff --git a/core/src/main/java/org/luaj/vm2/WeakTable.java b/core/src/main/java/org/luaj/vm2/WeakTable.java index 20606b37..c161ac45 100644 --- a/core/src/main/java/org/luaj/vm2/WeakTable.java +++ b/core/src/main/java/org/luaj/vm2/WeakTable.java @@ -119,8 +119,12 @@ public class WeakTable implements Metatable { if ( key != null && value != null ) { return new LuaTable.NormalEntry(key, value); } else { - this.key = null; - this.value = null; + if ( key == null ) { + this.key = null; + } + if ( value == null ) { + this.value = null; + } return null; } } diff --git a/jse/src/test/java/org/luaj/vm2/WeakTableTest.java b/jse/src/test/java/org/luaj/vm2/WeakTableTest.java index 92eca050..05e29c6c 100644 --- a/jse/src/test/java/org/luaj/vm2/WeakTableTest.java +++ b/jse/src/test/java/org/luaj/vm2/WeakTableTest.java @@ -104,6 +104,23 @@ abstract public class WeakTableTest extends TableTest { assertEquals(LuaValue.NIL, t.get(1)); assertFalse("strings should not be in weak references", t.get("string").isnil()); } + + public void testWeakValueRehashAfterGcDoesNotDropStrongKeyOrThrow() { + LuaTable t = new_Table(); + + for ( int i = 0; i < 100; i++ ) { + t.set("dead-" + i, new LuaTable()); + } + + collectGarbage(); + + for ( int i = 0; i < 100; i++ ) { + assertEquals(LuaValue.NIL, t.get("dead-" + i)); + } + + t.set("survivor", LuaValue.valueOf("ok")); + assertEquals(LuaValue.valueOf("ok"), t.get("survivor")); + } } public static class WeakKeyTableTest extends WeakTableTest {