Skip to content

Commit

Permalink
Showing 4 changed files with 24 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -62,7 +62,7 @@ private Object lookupRestKeywordArgumentHash(VirtualFrame frame) {
final RubyHash hash = RubyArguments.getUserKeywordsHash(frame.getArguments(), minimum);

if (hash == null) {
return new RubyHash(getContext().getCoreLibrary().getHashClass(), null, null, null, 0, null);
return HashNodes.createEmptyHash(getContext().getCoreLibrary().getHashClass());
}

final List<KeyValue> entries = new ArrayList<>();
Original file line number Diff line number Diff line change
@@ -89,7 +89,7 @@ public EmptyHashLiteralNode(RubyContext context, SourceSection sourceSection) {
@ExplodeLoop
@Override
public RubyHash executeRubyHash(VirtualFrame frame) {
return new RubyHash(getContext().getCoreLibrary().getHashClass(), null, null, null, 0, null);
return HashNodes.createEmptyHash(getContext().getCoreLibrary().getHashClass());
}

}
@@ -147,7 +147,7 @@ public RubyHash executeRubyHash(VirtualFrame frame) {
size++;
}

return new RubyHash(getContext().getCoreLibrary().getHashClass(), null, null, store, size, null);
return HashNodes.createHash(getContext().getCoreLibrary().getHashClass(), null, null, store, size, null);
}

}
Original file line number Diff line number Diff line change
@@ -99,6 +99,18 @@ public static void setLastInSequence(RubyHash hash, Entry lastInSequence) {
hash.lastInSequence = lastInSequence;
}

public static RubyHash createEmptyHash(RubyClass hashClass) {
return createHash(hashClass, null, null, null, 0, null);
}

public static RubyHash createHash(RubyClass hashClass, Object[] store, int size) {
return createHash(hashClass, null, null, (Object) store, size, null);
}

public static RubyHash createHash(RubyClass hashClass, RubyProc defaultBlock, Object defaultValue, Object store, int size, Entry firstInSequence) {
return new RubyHash(hashClass, defaultBlock, defaultValue, store, size, firstInSequence);
}

@CoreMethod(names = "[]", constructor = true, argumentsAsArray = true)
@ImportStatic(HashGuards.class)
public abstract static class ConstructNode extends CoreMethodArrayArgumentsNode {
@@ -147,7 +159,7 @@ public Object construct(VirtualFrame frame, RubyClass hashClass, Object[] args)
}
}

return new RubyHash(hashClass, null, null, newStore, size, null);
return createHash(hashClass, newStore, size);
}

@Specialization
@@ -928,7 +940,7 @@ public MergeNode(RubyContext context, SourceSection sourceSection) {
public RubyHash mergePackedArrayNull(RubyHash hash, RubyHash other, NotProvided block) {
final Object[] store = (Object[]) getStore(hash);
final Object[] copy = PackedArrayStrategy.copyStore(store);
return new RubyHash(hash.getLogicalClass(), getDefaultBlock(hash), getDefaultValue(hash), copy, getSize(hash), null);
return createHash(hash.getLogicalClass(), getDefaultBlock(hash), getDefaultValue(hash), copy, getSize(hash), null);
}

@ExplodeLoop
@@ -973,14 +985,14 @@ public RubyHash mergePackedArrayPackedArray(VirtualFrame frame, RubyHash hash, R

if (mergeFromACount == 0) {
nothingFromFirstProfile.enter();
return new RubyHash(hash.getLogicalClass(), getDefaultBlock(hash), getDefaultValue(hash), PackedArrayStrategy.copyStore(storeB), storeBSize, null);
return createHash(hash.getLogicalClass(), getDefaultBlock(hash), getDefaultValue(hash), PackedArrayStrategy.copyStore(storeB), storeBSize, null);
}

considerNothingFromSecondProfile.enter();

if (conflictsCount == storeBSize) {
nothingFromSecondProfile.enter();
return new RubyHash(hash.getLogicalClass(), getDefaultBlock(hash), getDefaultValue(hash), PackedArrayStrategy.copyStore(storeA), storeASize, null);
return createHash(hash.getLogicalClass(), getDefaultBlock(hash), getDefaultValue(hash), PackedArrayStrategy.copyStore(storeA), storeASize, null);
}

considerResultIsSmallProfile.enter();
@@ -1012,7 +1024,7 @@ public RubyHash mergePackedArrayPackedArray(VirtualFrame frame, RubyHash hash, R
index++;
}

return new RubyHash(hash.getLogicalClass(), getDefaultBlock(hash), getDefaultValue(hash), merged, mergedSize, null);
return createHash(hash.getLogicalClass(), getDefaultBlock(hash), getDefaultValue(hash), merged, mergedSize, null);
}

CompilerDirectives.transferToInterpreter();
@@ -1025,7 +1037,7 @@ public RubyHash mergePackedArrayPackedArray(VirtualFrame frame, RubyHash hash, R
public RubyHash mergeBucketsBuckets(RubyHash hash, RubyHash other, NotProvided block) {
CompilerDirectives.transferToInterpreter();

final RubyHash merged = new RubyHash(hash.getLogicalClass(), null, null, new Entry[BucketsStrategy.capacityGreaterThan(getSize(hash) + getSize(other))], 0, null);
final RubyHash merged = createHash(hash.getLogicalClass(), null, null, new Entry[BucketsStrategy.capacityGreaterThan(getSize(hash) + getSize(other))], 0, null);

int size = 0;

@@ -1051,7 +1063,7 @@ public RubyHash mergeBucketsBuckets(RubyHash hash, RubyHash other, NotProvided b
public RubyHash merge(VirtualFrame frame, RubyHash hash, RubyHash other, RubyProc block) {
CompilerDirectives.transferToInterpreter();

final RubyHash merged = new RubyHash(hash.getLogicalClass(), null, null, new Entry[BucketsStrategy.capacityGreaterThan(getSize(hash) + getSize(other))], 0, null);
final RubyHash merged = createHash(hash.getLogicalClass(), null, null, new Entry[BucketsStrategy.capacityGreaterThan(getSize(hash) + getSize(other))], 0, null);

int size = 0;

@@ -1392,7 +1404,7 @@ public static class HashAllocator implements Allocator {

@Override
public RubyBasicObject allocate(RubyContext context, RubyClass rubyClass, Node currentNode) {
return new RubyHash(rubyClass, null, null, null, 0, null);
return createEmptyHash(rubyClass);
}

}
Original file line number Diff line number Diff line change
@@ -29,7 +29,7 @@ public static RubyHash verySlowFromEntries(RubyContext context, List<KeyValue> e

@TruffleBoundary
public static RubyHash verySlowFromEntries(RubyClass hashClass, List<KeyValue> entries, boolean byIdentity) {
final RubyHash hash = new RubyHash(hashClass, null, null, null, 0, null);
final RubyHash hash = HashNodes.createEmptyHash(hashClass);
verySlowSetKeyValues(hash, entries, byIdentity);
assert HashOperations.verifyStore(hash);
return hash;

0 comments on commit 703c6c9

Please sign in to comment.