Skip to content

Commit b775ac1

Browse files
committed
[Truffle] Last of hash specs passing.
1 parent fb49596 commit b775ac1

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed

core/src/main/java/org/jruby/truffle/nodes/core/FixnumNodes.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,11 @@ public boolean equal(long a, double b) {
831831
public boolean equal(long a, BigInteger b) {
832832
return SlowPathBigInteger.compareTo(BigInteger.valueOf(a), b) == 0;
833833
}
834+
835+
@Fallback
836+
public boolean equal(Object a, Object b) {
837+
return false;
838+
}
834839
}
835840

836841
@CoreMethod(names = "<=>", minArgs = 1, maxArgs = 1)

core/src/main/java/org/jruby/truffle/nodes/core/SymbolNodes.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ public boolean equal(RubySymbol a, long b) {
5656
return a.toString().equals(Long.toString(b));
5757
}
5858

59+
@Specialization(guards = "notSymbol")
60+
public boolean equal(RubySymbol a, Object b) {
61+
return false;
62+
}
63+
64+
protected boolean notSymbol(RubySymbol a, Object b) {
65+
return !(b instanceof RubySymbol);
66+
}
67+
5968
}
6069

6170
@CoreMethod(names = "all_symbols", isModuleMethod = true, needsSelf = false, maxArgs = 0)

core/src/main/java/org/jruby/truffle/nodes/literal/HashLiteralNode.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,36 +81,53 @@ public RubyHash executeRubyHash(VirtualFrame frame) {
8181

8282
public static class SmallHashLiteralNode extends HashLiteralNode {
8383

84+
@Child protected DispatchHeadNode equalNode;
85+
8486
public SmallHashLiteralNode(RubyContext context, SourceSection sourceSection, RubyNode[] keyValues) {
8587
super(context, sourceSection, keyValues);
88+
equalNode = new DispatchHeadNode(context);
8689
}
8790

8891
@ExplodeLoop
8992
@Override
9093
public RubyHash executeRubyHash(VirtualFrame frame) {
9194
final Object[] storage = new Object[RubyContext.HASHES_SMALL * 2];
9295

93-
for (int n = 0; n < keyValues.length; n += 2) {
96+
int position = 0;
97+
98+
initializers: for (int n = 0; n < keyValues.length; n += 2) {
9499
Object key = keyValues[n].execute(frame);
95-
final Object value = keyValues[n + 1].execute(frame);
96100

97101
if (key instanceof RubyString) {
98102
key = freezeNode.call(frame, dupNode.call(frame, key, "dup", null), "freeze", null);
99103
}
100104

101-
storage[n] = key;
102-
storage[n + 1] = value;
105+
final Object value = keyValues[n + 1].execute(frame);
106+
107+
for (int i = 0; i < n; i += 2) {
108+
if ((boolean) equalNode.call(frame, key, "==", null, storage[i])) {
109+
storage[i + 1] = value;
110+
continue initializers;
111+
}
112+
}
113+
114+
storage[position] = key;
115+
storage[position + 1] = value;
116+
position += 2;
103117
}
104118

105-
return new RubyHash(getContext().getCoreLibrary().getHashClass(), null, storage, keyValues.length / 2);
119+
return new RubyHash(getContext().getCoreLibrary().getHashClass(), null, storage, position / 2);
106120
}
107121

108122
}
109123

110124
public static class GenericHashLiteralNode extends HashLiteralNode {
111125

126+
@Child protected DispatchHeadNode equalNode;
127+
112128
public GenericHashLiteralNode(RubyContext context, SourceSection sourceSection, RubyNode[] keyValues) {
113129
super(context, sourceSection, keyValues);
130+
equalNode = new DispatchHeadNode(context);
114131
}
115132

116133
@ExplodeLoop
@@ -122,12 +139,13 @@ public RubyHash executeRubyHash(VirtualFrame frame) {
122139

123140
for (int n = 0; n < keyValues.length; n += 2) {
124141
Object key = keyValues[n].execute(frame);
125-
final Object value = keyValues[n + 1].execute(frame);
126142

127143
if (key instanceof RubyString) {
128144
key = freezeNode.call(frame, dupNode.call(frame, key, "dup", null), "freeze", null);
129145
}
130146

147+
final Object value = keyValues[n + 1].execute(frame);
148+
131149
storage.put(key, value);
132150
}
133151

spec/truffle/tags/language/hash_tags.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)