Skip to content

Commit 59f6cc9

Browse files
committed
Avoid creating an extra TruffleString for visitStringNode()
1 parent 5f51922 commit 59f6cc9

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public FrozenStringLiterals(TStringCache tStringCache) {
3838

3939
@TruffleBoundary
4040
public ImmutableRubyString getFrozenStringLiteral(TruffleString tstring, RubyEncoding encoding) {
41-
return getFrozenStringLiteral(tstring.getInternalByteArrayUncached(encoding.tencoding),
41+
return getFrozenStringLiteral(
42+
tstring.getInternalByteArrayUncached(encoding.tencoding),
4243
TStringUtils.hasImmutableInternalByteArray(tstring),
4344
encoding);
4445
}
@@ -58,6 +59,20 @@ public ImmutableRubyString getFrozenStringLiteral(InternalByteArray byteArray, b
5859
}
5960
}
6061

62+
@TruffleBoundary
63+
public ImmutableRubyString getFrozenStringLiteral(byte[] bytes, RubyEncoding encoding) {
64+
// Ensure all ImmutableRubyString have a TruffleString from the TStringCache
65+
var cachedTString = tstringCache.getTString(bytes, encoding);
66+
var tstringWithEncoding = new TStringWithEncoding(cachedTString, encoding);
67+
68+
final ImmutableRubyString string = values.get(tstringWithEncoding);
69+
if (string != null) {
70+
return string;
71+
} else {
72+
return values.addInCacheIfAbsent(tstringWithEncoding, new ImmutableRubyString(cachedTString, encoding));
73+
}
74+
}
75+
6176
public static ImmutableRubyString createStringAndCacheLater(TruffleString name,
6277
RubyEncoding encoding) {
6378
final ImmutableRubyString string = new ImmutableRubyString(name, encoding);

src/main/java/org/truffleruby/parser/YARPTranslator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3152,13 +3152,13 @@ public RubyNode visitStringNode(Nodes.StringNode node) {
31523152
encoding = sourceEncoding;
31533153
}
31543154

3155-
final TruffleString tstring = TStringUtils.fromByteArray(node.unescaped, encoding);
3155+
byte[] bytes = node.unescaped;
31563156

31573157
if (!node.isFrozen()) {
3158-
final TruffleString cachedTString = language.tstringCache.getTString(tstring, encoding);
3158+
final TruffleString cachedTString = language.tstringCache.getTString(bytes, encoding);
31593159
rubyNode = new StringLiteralNode(cachedTString, encoding);
31603160
} else {
3161-
final ImmutableRubyString frozenString = language.getFrozenStringLiteral(tstring, encoding);
3161+
ImmutableRubyString frozenString = language.frozenStringLiterals.getFrozenStringLiteral(bytes, encoding);
31623162
rubyNode = new FrozenStringLiteralNode(frozenString, FrozenStrings.EXPRESSION);
31633163
}
31643164

0 commit comments

Comments
 (0)