Skip to content

Commit 87fec1a

Browse files
committed
[GR-30852] Add RubyEncoding field to RubySymbol
PullRequest: truffleruby/2803
2 parents 710a1a2 + 19ec2c2 commit 87fec1a

18 files changed

+99
-53
lines changed

src/main/java/org/truffleruby/RubyLanguage.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.truffleruby.core.array.RubyArray;
3737
import org.truffleruby.core.basicobject.RubyBasicObject;
3838
import org.truffleruby.core.binding.RubyBinding;
39+
import org.truffleruby.core.encoding.RubyEncoding;
3940
import org.truffleruby.core.encoding.RubyEncodingConverter;
4041
import org.truffleruby.core.exception.RubyException;
4142
import org.truffleruby.core.exception.RubyFrozenError;
@@ -314,8 +315,8 @@ public RubySymbol getSymbol(String string) {
314315

315316

316317
@TruffleBoundary
317-
public RubySymbol getSymbol(Rope rope) {
318-
return symbolTable.getSymbol(rope);
318+
public RubySymbol getSymbol(Rope rope, RubyEncoding encoding) {
319+
return symbolTable.getSymbol(rope, encoding);
319320
}
320321

321322
public Assumption getTracingAssumption() {

src/main/java/org/truffleruby/cext/CExtNodes.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1635,7 +1635,9 @@ public abstract static class RbCheckSymbolCStrNode extends CoreMethodArrayArgume
16351635
@Specialization(guards = "strings.isRubyString(string)")
16361636
protected Object checkSymbolCStr(Object string,
16371637
@CachedLibrary(limit = "2") RubyStringLibrary strings) {
1638-
final RubySymbol sym = getLanguage().symbolTable.getSymbolIfExists(strings.getRope(string));
1638+
final RubySymbol sym = getLanguage().symbolTable.getSymbolIfExists(
1639+
strings.getRope(string),
1640+
strings.getEncoding(string));
16391641
return sym == null ? nil : sym;
16401642
}
16411643
}

src/main/java/org/truffleruby/core/cast/StringToSymbolNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ public abstract class StringToSymbolNode extends RubyContextSourceNode {
2424

2525
@Specialization
2626
protected RubySymbol doString(RubyString string) {
27-
return getSymbol(string.rope);
27+
return getSymbol(string.rope, string.encoding);
2828
}
2929

3030
@Specialization
3131
protected RubySymbol doString(ImmutableRubyString string) {
32-
return getSymbol(string.rope);
32+
return getSymbol(string.rope, string.encoding);
3333
}
3434

3535
}

src/main/java/org/truffleruby/core/cast/ToRubyEncodingNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ protected RubyEncoding immutableStringToEncoding(ImmutableRubyString value) {
4040

4141
@Specialization
4242
protected RubyEncoding symbolToEncoding(RubySymbol value) {
43-
return getContext().getEncodingManager().getRubyEncoding(value.getRope().getEncoding());
43+
return value.encoding;
4444
}
4545

4646
@Specialization

src/main/java/org/truffleruby/core/cast/ToSymbolNode.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.oracle.truffle.api.dsl.CachedLanguage;
1414
import com.oracle.truffle.api.library.CachedLibrary;
1515
import org.truffleruby.RubyLanguage;
16+
import org.truffleruby.core.encoding.RubyEncoding;
1617
import org.truffleruby.core.rope.Rope;
1718
import org.truffleruby.core.rope.RopeNodes;
1819
import org.truffleruby.core.symbol.RubySymbol;
@@ -57,22 +58,24 @@ protected RubySymbol toSymbolJavaStringUncached(String str,
5758
@Specialization(
5859
guards = {
5960
"strings.isRubyString(str)",
60-
"equals.execute(strings.getRope(str), cachedRope)" },
61+
"equals.execute(strings.getRope(str), cachedRope)",
62+
"strings.getEncoding(str) == cachedEncoding" },
6163
limit = "getCacheLimit()")
6264
protected RubySymbol toSymbolRubyString(Object str,
6365
@CachedLibrary(limit = "2") RubyStringLibrary strings,
6466
@Cached(value = "strings.getRope(str)") Rope cachedRope,
67+
@Cached(value = "strings.getEncoding(str)") RubyEncoding cachedEncoding,
6568
@CachedLanguage RubyLanguage language,
6669
@Cached RopeNodes.EqualNode equals,
67-
@Cached(value = "language.getSymbol(cachedRope)") RubySymbol rubySymbol) {
70+
@Cached(value = "language.getSymbol(cachedRope, cachedEncoding)") RubySymbol rubySymbol) {
6871
return rubySymbol;
6972
}
7073

7174
@Specialization(guards = "strings.isRubyString(str)", replaces = "toSymbolRubyString")
7275
protected RubySymbol toSymbolRubyStringUncached(Object str,
7376
@CachedLanguage RubyLanguage language,
7477
@CachedLibrary(limit = "2") RubyStringLibrary strings) {
75-
return language.getSymbol(strings.getRope(str));
78+
return language.getSymbol(strings.getRope(str), strings.getEncoding(str));
7679
}
7780

7881
protected int getCacheLimit() {

src/main/java/org/truffleruby/core/encoding/EncodingNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ protected RubyEncoding encodingGetObjectEncodingImmutableString(ImmutableRubyStr
643643

644644
@Specialization
645645
protected RubyEncoding encodingGetObjectEncodingSymbol(RubySymbol object) {
646-
return getRubyEncodingNode.executeGetRubyEncoding(object.getRope().getEncoding());
646+
return object.encoding;
647647
}
648648

649649
@Specialization

src/main/java/org/truffleruby/core/format/printf/PrintfSimpleTreeBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.oracle.truffle.api.CompilerDirectives;
1616
import org.jcodings.specific.USASCIIEncoding;
1717
import org.truffleruby.RubyLanguage;
18+
import org.truffleruby.core.encoding.Encodings;
1819
import org.truffleruby.core.format.FormatNode;
1920
import org.truffleruby.core.format.LiteralFormatNode;
2021
import org.truffleruby.core.format.SharedTreeBuilder;
@@ -65,7 +66,7 @@ private void buildTree() {
6566
final RubySymbol key = language.getSymbol(RopeOperations.create(
6667
config.getNamesBytes(),
6768
USASCIIEncoding.INSTANCE,
68-
CodeRange.CR_7BIT));
69+
CodeRange.CR_7BIT), Encodings.US_ASCII);
6970
valueNode = ReadHashValueNodeGen.create(key, new SourceNode());
7071
} else if (config.getAbsoluteArgumentIndex() != null) {
7172
valueNode = ReadArgumentIndexValueNodeGen

src/main/java/org/truffleruby/core/regexp/RegexpNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ protected RubyArray regexpNames(RubyRegexp regexp) {
216216
final byte[] bytes = Arrays.copyOfRange(e.name, e.nameP, e.nameEnd);
217217

218218
final Rope rope = RopeOperations.create(bytes, UTF8Encoding.INSTANCE, CodeRange.CR_UNKNOWN);
219-
final RubySymbol name = getSymbol(rope);
219+
final RubySymbol name = getSymbol(rope, Encodings.UTF_8);
220220

221221
final int[] backrefs = e.getBackRefs();
222222
final RubyArray backrefsRubyArray = createArray(backrefs);

src/main/java/org/truffleruby/core/rope/RopeWithEncoding.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
import org.truffleruby.core.encoding.RubyEncoding;
1313

14-
public class RopeWithEncoding {
14+
import java.util.Objects;
15+
16+
public final class RopeWithEncoding {
1517

1618
private final Rope rope;
1719
private final RubyEncoding encoding;
@@ -29,4 +31,22 @@ public Rope getRope() {
2931
public RubyEncoding getEncoding() {
3032
return encoding;
3133
}
34+
35+
@Override
36+
public boolean equals(Object o) {
37+
if (this == o) {
38+
return true;
39+
}
40+
if (!(o instanceof RopeWithEncoding)) {
41+
return false;
42+
}
43+
RopeWithEncoding that = (RopeWithEncoding) o;
44+
return rope.equals(that.rope) && encoding == that.encoding;
45+
}
46+
47+
@Override
48+
public int hashCode() {
49+
return Objects.hash(rope, encoding);
50+
}
51+
3252
}

src/main/java/org/truffleruby/core/string/StringNodes.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2806,20 +2806,22 @@ public abstract static class ToSymNode extends CoreMethodArrayArgumentsNode {
28062806
@Specialization(
28072807
guards = {
28082808
"!isBrokenCodeRange(strings.getRope(string), codeRangeNode)",
2809-
"equalNode.execute(strings.getRope(string),cachedRope)" },
2809+
"equalNode.execute(strings.getRope(string),cachedRope)",
2810+
"strings.getEncoding(string) == cachedEncoding" },
28102811
limit = "getDefaultCacheLimit()")
28112812
protected RubySymbol toSymCached(Object string,
28122813
@CachedLibrary(limit = "2") RubyStringLibrary strings,
28132814
@Cached("strings.getRope(string)") Rope cachedRope,
2814-
@Cached("getSymbol(cachedRope)") RubySymbol cachedSymbol,
2815+
@Cached("strings.getEncoding(string)") RubyEncoding cachedEncoding,
2816+
@Cached("getSymbol(cachedRope, cachedEncoding)") RubySymbol cachedSymbol,
28152817
@Cached RopeNodes.EqualNode equalNode) {
28162818
return cachedSymbol;
28172819
}
28182820

28192821
@Specialization(guards = "!isBrokenCodeRange(strings.getRope(string), codeRangeNode)", replaces = "toSymCached")
28202822
protected RubySymbol toSym(Object string,
28212823
@CachedLibrary(limit = "2") RubyStringLibrary strings) {
2822-
return getSymbol(strings.getRope(string));
2824+
return getSymbol(strings.getRope(string), strings.getEncoding(string));
28232825
}
28242826

28252827
@Specialization(guards = "isBrokenCodeRange(strings.getRope(string), codeRangeNode)")

0 commit comments

Comments
 (0)