Skip to content

Commit 45c784c

Browse files
committed
Avoid and remove EncodingManager.charsetForEncoding()
* That does not handle binary source encoding, even if all bytes are US-ASCII.
1 parent 5adb6ec commit 45c784c

File tree

4 files changed

+15
-28
lines changed

4 files changed

+15
-28
lines changed

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.graalvm.nativeimage.ProcessProperties;
2727
import org.jcodings.Encoding;
2828
import org.jcodings.EncodingDB;
29-
import org.jcodings.specific.ASCIIEncoding;
3029
import org.truffleruby.RubyContext;
3130
import org.truffleruby.RubyLanguage;
3231
import org.truffleruby.annotations.SuppressFBWarnings;
@@ -293,14 +292,6 @@ public synchronized RubyEncoding replicateEncoding(RubyEncoding encoding, String
293292
return defineDynamicEncoding(encoding.jcoding, nameBytes);
294293
}
295294

296-
@TruffleBoundary
297-
public static Charset charsetForEncoding(Encoding encoding) {
298-
if (encoding == ASCIIEncoding.INSTANCE) {
299-
throw new UnsupportedOperationException("Cannot return a Charset for the BINARY Ruby Encoding");
300-
}
301-
return encoding.getCharset();
302-
}
303-
304295
public RubyEncoding getLocaleEncoding() {
305296
return localeEncoding;
306297
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ public static boolean isSingleByteOptimizable(AbstractTruffleString truffleStrin
130130
return truffleString.getByteCodeRangeUncached(encoding.tencoding) == ASCII || encoding.isSingleByte;
131131
}
132132

133+
public static String toJavaStringOrThrow(byte[] bytes, RubyEncoding encoding) {
134+
return toJavaStringOrThrow(fromByteArray(bytes, encoding), encoding);
135+
}
136+
133137
public static String toJavaStringOrThrow(AbstractTruffleString tstring, RubyEncoding encoding) {
134138
CompilerAsserts.neverPartOfCompilation("uncached");
135139
if (encoding == Encodings.BINARY && !StringGuards.is7BitUncached(tstring, encoding)) {

src/main/java/org/truffleruby/language/loader/FeatureLoader.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,13 @@
2323
import com.oracle.truffle.api.interop.UnknownIdentifierException;
2424
import com.oracle.truffle.api.interop.UnsupportedMessageException;
2525
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
26-
import org.jcodings.Encoding;
2726
import org.truffleruby.RubyContext;
2827
import org.truffleruby.RubyLanguage;
2928
import org.truffleruby.collections.ConcurrentOperations;
3029
import org.truffleruby.core.array.ArrayOperations;
3130
import org.truffleruby.core.array.ArrayUtils;
3231
import org.truffleruby.core.array.RubyArray;
33-
import org.truffleruby.core.encoding.EncodingManager;
32+
import org.truffleruby.core.encoding.TStringUtils;
3433
import org.truffleruby.core.module.RubyModule;
3534
import org.truffleruby.core.string.RubyString;
3635
import org.truffleruby.core.string.StringOperations;
@@ -222,8 +221,8 @@ private String initializeWorkingDirectory() {
222221
context,
223222
InteropLibrary.getUncached(),
224223
0);
225-
final Encoding localeEncoding = context.getEncodingManager().getLocaleEncoding().jcoding;
226-
return new String(bytes, EncodingManager.charsetForEncoding(localeEncoding));
224+
var localeEncoding = context.getEncodingManager().getLocaleEncoding();
225+
return TStringUtils.toJavaStringOrThrow(bytes, localeEncoding);
227226
} finally {
228227
rubyThread.getIoBuffer(context).free(null, rubyThread, buffer, InlinedConditionProfile.getUncached());
229228
}

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

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.truffleruby.core.cast.StringToSymbolNodeGen;
2121
import org.truffleruby.core.cast.ToSNode;
2222
import org.truffleruby.core.cast.ToSNodeGen;
23-
import org.truffleruby.core.encoding.EncodingManager;
2423
import org.truffleruby.core.encoding.Encodings;
2524
import org.truffleruby.core.encoding.RubyEncoding;
2625
import org.truffleruby.core.encoding.TStringUtils;
@@ -193,7 +192,7 @@ public RubyNode visitBreakNode(Nodes.BreakNode node) {
193192
}
194193

195194
public RubyNode visitCallNode(Nodes.CallNode node) {
196-
var methodName = new String(node.name, EncodingManager.charsetForEncoding(sourceEncoding.jcoding));
195+
var methodName = TStringUtils.toJavaStringOrThrow(node.name, sourceEncoding);
197196
var receiver = node.receiver == null ? new SelfNode() : node.receiver.accept(this);
198197
var arguments = node.arguments.arguments;
199198

@@ -757,10 +756,9 @@ public RubyNode visitStringConcatNode(Nodes.StringConcatNode node) {
757756
}
758757

759758
public RubyNode visitStringNode(Nodes.StringNode node) {
760-
final RubyEncoding encoding = sourceEncoding;
761-
final TruffleString tstring = TStringUtils.fromByteArray(node.unescaped, encoding);
762-
final TruffleString cachedTString = language.tstringCache.getTString(tstring, encoding);
763-
final RubyNode rubyNode = new StringLiteralNode(cachedTString, encoding);
759+
final TruffleString tstring = TStringUtils.fromByteArray(node.unescaped, sourceEncoding);
760+
final TruffleString cachedTString = language.tstringCache.getTString(tstring, sourceEncoding);
761+
final RubyNode rubyNode = new StringLiteralNode(cachedTString, sourceEncoding);
764762

765763
assignNodePositionInSource(node, rubyNode);
766764

@@ -772,7 +770,8 @@ public RubyNode visitSuperNode(Nodes.SuperNode node) {
772770
}
773771

774772
public RubyNode visitSymbolNode(Nodes.SymbolNode node) {
775-
final RubySymbol symbol = language.getSymbol(toString(node));
773+
var tstring = TStringUtils.fromByteArray(node.unescaped, sourceEncoding);
774+
final RubySymbol symbol = language.getSymbol(tstring, sourceEncoding);
776775
final RubyNode rubyNode = new ObjectLiteralNode(symbol);
777776

778777
assignNodePositionInSource(node, rubyNode);
@@ -874,17 +873,11 @@ protected RubyContextSourceNode createCallNode(RubyNode receiver, String method,
874873
}
875874

876875
private String toString(Nodes.Location location) {
877-
return new String(sourceBytes, location.startOffset, location.length,
878-
EncodingManager.charsetForEncoding(sourceEncoding.jcoding));
876+
return TStringUtils.toJavaStringOrThrow(TruffleString.fromByteArrayUncached(sourceBytes, location.startOffset, location.length, sourceEncoding.tencoding, false), sourceEncoding);
879877
}
880878

881879
private String toString(Nodes.Node node) {
882-
return new String(sourceBytes, node.startOffset, node.length,
883-
EncodingManager.charsetForEncoding(sourceEncoding.jcoding));
884-
}
885-
886-
private String toString(Nodes.SymbolNode node) {
887-
return new String(node.unescaped, EncodingManager.charsetForEncoding(sourceEncoding.jcoding));
880+
return TStringUtils.toJavaStringOrThrow(TruffleString.fromByteArrayUncached(sourceBytes, node.startOffset, node.length, sourceEncoding.tencoding, false), sourceEncoding);
888881
}
889882

890883
private SourceSection getSourceSection(Nodes.Node yarpNode) {

0 commit comments

Comments
 (0)