From 700d3878a01125b067be4b6da3ddfb4fe4ef0966 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Mon, 5 Jul 2010 18:30:04 +0000 Subject: [PATCH] Simplify weak table implementation. --- src/core/org/luaj/vm2/LuaTable.java | 2 +- src/core/org/luaj/vm2/WeakTable.java | 94 +++++++++++++--------- test/junit/org/luaj/vm2/WeakTableTest.java | 5 +- 3 files changed, 59 insertions(+), 42 deletions(-) diff --git a/src/core/org/luaj/vm2/LuaTable.java b/src/core/org/luaj/vm2/LuaTable.java index 66a7a1fe..f336c6f3 100644 --- a/src/core/org/luaj/vm2/LuaTable.java +++ b/src/core/org/luaj/vm2/LuaTable.java @@ -444,7 +444,7 @@ public class LuaTable extends LuaValue { } } - private void hashClearSlot( int i ) { + protected void hashClearSlot( int i ) { if ( hashKeys[ i ] != null ) { int j = i; diff --git a/src/core/org/luaj/vm2/WeakTable.java b/src/core/org/luaj/vm2/WeakTable.java index c486162c..0b602961 100644 --- a/src/core/org/luaj/vm2/WeakTable.java +++ b/src/core/org/luaj/vm2/WeakTable.java @@ -26,14 +26,13 @@ import java.lang.ref.WeakReference; import org.luaj.vm2.lib.TwoArgFunction; public class WeakTable extends LuaTable { - private LuaTable backing; private boolean weakkeys,weakvalues; public WeakTable(boolean weakkeys, boolean weakvalues) { this(weakkeys, weakvalues, 0, 0); } protected WeakTable(boolean weakkeys, boolean weakvalues, int narray, int nhash) { - this.backing = new LuaTable(narray, nhash); + super(narray, nhash); this.weakkeys = weakkeys; this.weakvalues = weakvalues; } @@ -47,19 +46,19 @@ public class WeakTable extends LuaTable { } public void presize( int narray ) { - backing.presize(narray); + super.presize(narray); } public void presize(int narray, int nhash) { - backing.presize(narray, nhash); + super.presize(narray, nhash); } protected int getArrayLength() { - return backing.getArrayLength(); + return super.getArrayLength(); } protected int getHashLength() { - return backing.getHashLength(); + return super.getHashLength(); } protected WeakTable changemode(boolean weakkeys, boolean weakvalues) { @@ -84,7 +83,7 @@ public class WeakTable extends LuaTable { public void rawset( int key, LuaValue value ) { if ( weakvalues ) value = weaken( value ); - backing.set(key, value); + super.rawset(key, value); } /** caller must ensure key is not nil */ @@ -103,26 +102,43 @@ public class WeakTable extends LuaTable { break; } } - backing.set(key, value); + super.rawset(key, value); } public LuaValue rawget( int key ) { - return rawget(valueOf(key)); - } - - public LuaValue rawget( LuaValue key ) { - LuaValue v = backing.rawget(key); + LuaValue v = super.rawget(key).strongvalue(); if ( v.isnil() ) - return NIL; - v = v.strongvalue(); - if ( v.isnil() ) - backing.rawset(key, NIL); + super.rawset(key, NIL); return v; } + public LuaValue rawget( LuaValue key ) { + LuaValue v = super.rawget(key).strongvalue(); + if ( v.isnil() ) + super.rawset(key, NIL); + return v; + } + + // override to remove values for weak keys as we search + public int hashFindSlot(LuaValue key) { + int i = ( key.hashCode() & 0x7FFFFFFF ) % hashKeys.length; + LuaValue k; + while ( i