Skip to content

Commit

Permalink
Showing 1 changed file with 25 additions and 3 deletions.
28 changes: 25 additions & 3 deletions truffle/src/main/java/org/jruby/truffle/core/hash/HashNodes.java
Original file line number Diff line number Diff line change
@@ -207,6 +207,19 @@ public Object getConstantIndexPackedArray(VirtualFrame frame, DynamicObject hash
return PackedArrayStrategy.getValue(store, cachedIndex);
}

@Specialization(guards = {
"isPackedHash(hash)",
"isCompareByIdentity(hash)",
"cachedIndex >= 0",
"cachedIndex < getSize(hash)",
"equal(frame, key, getKeyAt(hash, cachedIndex))"
}, limit = "1")
public Object getConstantIndexPackedArrayByIdentity(VirtualFrame frame, DynamicObject hash, Object key,
@Cached("index(frame, hash, key)") int cachedIndex) {
final Object[] store = (Object[]) Layouts.HASH.getStore(hash);
return PackedArrayStrategy.getValue(store, cachedIndex);
}

protected int hash(VirtualFrame frame, Object key) {
return hashNode.hash(frame, key);
}
@@ -226,14 +239,23 @@ protected int index(VirtualFrame frame, DynamicObject hash, Object key) {
return -1;
}

final int hashed = hashNode.hash(frame, key);
int hashed = 0;
if (!HashGuards.isCompareByIdentity(hash)) {
hashed = hashNode.hash(frame, key);
}

final Object[] store = (Object[]) Layouts.HASH.getStore(hash);
final int size = Layouts.HASH.getSize(hash);

for (int n = 0; n < size; n++) {
if (hashed == PackedArrayStrategy.getHashed(store, n) && eql(frame, key, PackedArrayStrategy.getKey(store, n))) {
return n;
if (HashGuards.isCompareByIdentity(hash)) {
if (equal(frame, key, PackedArrayStrategy.getKey(store, n))) {
return n;
}
} else {
if (hashed == PackedArrayStrategy.getHashed(store, n) && eql(frame, key, PackedArrayStrategy.getKey(store, n))) {
return n;
}
}
}

0 comments on commit dcc3501

Please sign in to comment.