Skip to content

Commit 069c1f3

Browse files
committed
Improve Truffle::Ropes.debug_get_structure_creation
1 parent 53209a9 commit 069c1f3

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,13 @@ protected static String getStructure(Rope rope) {
116116
}
117117

118118
private static String getStructure(LeafRope rope) {
119-
return "\"" + rope.toString() + "\"";
119+
return escape(rope);
120120
}
121121

122122
private static String getStructure(ConcatRope rope) {
123123
final ConcatState state = rope.getState();
124124
return state.isFlattened()
125-
? "(\"flat concat rope\"; " + rope.toString() + ")"
125+
? "(\"flat concat rope\"; " + escape(rope) + ")"
126126
: "(" + getStructure(state.left) + " + " + getStructure(state.right) + ")";
127127
}
128128

@@ -137,6 +137,33 @@ private static String getStructure(RepeatingRope rope) {
137137
return "(" + getStructure(rope.getChild()) + "*" + rope.getTimes() + ")";
138138
}
139139

140+
private static String escape(Rope rope) {
141+
final StringBuilder builder = new StringBuilder();
142+
builder.append('"');
143+
144+
for (int i = 0; i < rope.byteLength(); i++) {
145+
final byte character = rope.get(i);
146+
switch (character) {
147+
case '\\':
148+
builder.append("\\");
149+
break;
150+
case '"':
151+
builder.append("\\\"");
152+
break;
153+
default:
154+
if (character >= 32 && character <= 126) {
155+
builder.append((char) character);
156+
} else {
157+
builder.append(StringUtils.format("\\x%02x", character));
158+
}
159+
break;
160+
}
161+
}
162+
163+
builder.append('"');
164+
return builder.toString();
165+
}
166+
140167
}
141168

142169
@CoreMethod(names = "bytes?", onSingleton = true, required = 1)

0 commit comments

Comments
 (0)