Skip to content

Commit 9b1c709

Browse files
committed
[Truffle] Completed String#dump.
1 parent 82ebb84 commit 9b1c709

File tree

4 files changed

+37
-13
lines changed

4 files changed

+37
-13
lines changed

spec/truffle/tags/core/string/dump_tags.txt

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

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,8 @@ public static boolean isSingleByteOptimizable(RubyString string) {
1919
return StringSupport.isSingleByteOptimizable(string, string.getBytes().getEncoding());
2020
}
2121

22+
public static boolean isAsciiCompatible(RubyString string) {
23+
return string.getByteList().getEncoding().isAsciiCompatible();
24+
}
25+
2226
}

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

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,6 +1672,7 @@ public RubyString rstrip(RubyString string) {
16721672
}
16731673

16741674
@CoreMethod(names = "dump", taintFromSelf = true)
1675+
@ImportGuards(StringGuards.class)
16751676
public abstract static class DumpNode extends CoreMethodNode {
16761677

16771678
public DumpNode(RubyContext context, SourceSection sourceSection) {
@@ -1682,13 +1683,41 @@ public DumpNode(DumpNode prev) {
16821683
super(prev);
16831684
}
16841685

1685-
@Specialization
1686-
public RubyString rstrip(RubyString string) {
1687-
notDesignedForCompilation();
1686+
@Specialization(guards = "isAsciiCompatible")
1687+
public RubyString dumpAsciiCompatible(RubyString string) {
1688+
// Taken from org.jruby.RubyString#dump
1689+
1690+
ByteList outputBytes = dumpCommon(string);
1691+
1692+
final RubyString result = getContext().makeString(string.getLogicalClass(), outputBytes);
1693+
result.getByteList().setEncoding(string.getByteList().getEncoding());
1694+
result.setCodeRange(StringSupport.CR_7BIT);
1695+
1696+
return result;
1697+
}
1698+
1699+
@Specialization(guards = "!isAsciiCompatible")
1700+
public RubyString dump(RubyString string) {
1701+
// Taken from org.jruby.RubyString#dump
1702+
1703+
ByteList outputBytes = dumpCommon(string);
1704+
1705+
outputBytes.append(".force_encoding(\"".getBytes());
1706+
outputBytes.append(string.getByteList().getEncoding().getName());
1707+
outputBytes.append((byte) '"');
1708+
outputBytes.append((byte) ')');
16881709

1689-
return string.dump();
1710+
final RubyString result = getContext().makeString(string.getLogicalClass(), outputBytes);
1711+
result.getByteList().setEncoding(ASCIIEncoding.INSTANCE);
1712+
result.setCodeRange(StringSupport.CR_7BIT);
1713+
1714+
return result;
16901715
}
16911716

1717+
@TruffleBoundary
1718+
private ByteList dumpCommon(RubyString string) {
1719+
return StringSupport.dumpCommon(getContext().getRuntime(), string.getByteList());
1720+
}
16921721
}
16931722

16941723
@CoreMethod(names = "scan", required = 1, needsBlock = true, taintFromParameters = 0)

truffle/src/main/java/org/jruby/truffle/runtime/core/RubyString.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,6 @@ public int count(RubyString[] otherStrings) {
123123
return StringSupport.countCommon19(getBytes(), getContext().getRuntime(), table, tables, enc);
124124
}
125125

126-
public RubyString dump() {
127-
ByteList outputBytes = StringSupport.dumpCommon(getContext().getRuntime(), bytes);
128-
129-
final RubyString result = getContext().makeString(getLogicalClass(), outputBytes);
130-
131-
return result;
132-
}
133-
134126
@Override
135127
@TruffleBoundary
136128
public String toString() {

0 commit comments

Comments
 (0)