Skip to content

Commit c355d18

Browse files
committed
commonalize many TruffleBoundary helpers for StringBuilder
1 parent 59499d9 commit c355d18

File tree

14 files changed

+139
-181
lines changed

14 files changed

+139
-181
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
8686
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
8787
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
88+
import com.oracle.graal.python.util.PythonUtils;
8889
import com.oracle.truffle.api.dsl.Cached;
8990
import com.oracle.truffle.api.dsl.Fallback;
9091
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -317,13 +318,13 @@ public static Object repr(PByteArray self,
317318
SequenceStorage store = self.getSequenceStorage();
318319
byte[] bytes = getBytes.execute(store);
319320
int len = lenNode.execute(store);
320-
StringBuilder sb = BytesUtils.newStringBuilder();
321+
StringBuilder sb = PythonUtils.newStringBuilder();
321322
String typeName = getNameNode.execute(lib.getLazyPythonClass(self));
322-
BytesUtils.sbAppend(sb, typeName);
323-
BytesUtils.sbAppend(sb, '(');
323+
PythonUtils.append(sb, typeName);
324+
PythonUtils.append(sb, '(');
324325
BytesUtils.reprLoop(sb, bytes, len);
325-
BytesUtils.sbAppend(sb, ')');
326-
return BytesUtils.sbToString(sb);
326+
PythonUtils.append(sb, ')');
327+
return PythonUtils.sbToString(sb);
327328
}
328329
}
329330

@@ -725,9 +726,9 @@ public int alloc(PByteArray byteArray,
725726

726727
protected static Object commonReduce(int proto, byte[] bytes, int len, Object clazz, Object dict,
727728
PythonObjectFactory factory) {
728-
StringBuilder sb = BytesUtils.newStringBuilder();
729+
StringBuilder sb = PythonUtils.newStringBuilder();
729730
BytesUtils.repr(sb, bytes, len);
730-
String str = BytesUtils.sbToString(sb);
731+
String str = PythonUtils.sbToString(sb);
731732
Object contents;
732733
if (proto < 3) {
733734
contents = factory.createTuple(new Object[]{str, "latin-1"});

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,9 @@ public static Object repr(PBytes self,
264264
SequenceStorage store = self.getSequenceStorage();
265265
byte[] bytes = getBytes.execute(store);
266266
int len = lenNode.execute(store);
267-
StringBuilder sb = BytesUtils.newStringBuilder();
267+
StringBuilder sb = PythonUtils.newStringBuilder();
268268
BytesUtils.reprLoop(sb, bytes, len);
269-
return BytesUtils.sbToString(sb);
269+
return PythonUtils.sbToString(sb);
270270
}
271271
}
272272

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesUtils.java

Lines changed: 21 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.oracle.graal.python.nodes.PRaiseNode;
4040
import com.oracle.graal.python.runtime.PythonCore;
4141
import com.oracle.graal.python.runtime.PythonParser.ParserErrorCallback;
42+
import com.oracle.graal.python.util.PythonUtils;
4243
import com.oracle.truffle.api.CompilerAsserts;
4344
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4445

@@ -340,31 +341,6 @@ public static byte[] fromStringAndEncoding(PythonCore core, String source, Strin
340341
}
341342
}
342343

343-
@TruffleBoundary
344-
public static StringBuilder newStringBuilder() {
345-
return new StringBuilder();
346-
}
347-
348-
@TruffleBoundary
349-
public static StringBuilder newStringBuilder(int capacity) {
350-
return new StringBuilder(capacity);
351-
}
352-
353-
@TruffleBoundary
354-
public static String sbToString(StringBuilder sb) {
355-
return sb.toString();
356-
}
357-
358-
@TruffleBoundary
359-
public static void sbAppend(StringBuilder sb, char c) {
360-
sb.append(c);
361-
}
362-
363-
@TruffleBoundary
364-
public static void sbAppend(StringBuilder sb, String s) {
365-
sb.append(s);
366-
}
367-
368344
@TruffleBoundary(allowInlining = true)
369345
public static Object doAsciiString(String str) {
370346
byte[] bytes = unicodeEscape(str);
@@ -377,18 +353,18 @@ public static Object doAsciiString(String str) {
377353
}
378354
boolean useDoubleQuotes = hasSingleQuote && !hasDoubleQuote;
379355
char quote = useDoubleQuotes ? '"' : '\'';
380-
StringBuilder sb = newStringBuilder(bytes.length + 2);
381-
sbAppend(sb, quote);
356+
StringBuilder sb = PythonUtils.newStringBuilder(bytes.length + 2);
357+
PythonUtils.append(sb, quote);
382358
for (int i = 0; i < bytes.length; i++) {
383359
char c = (char) bytes[i];
384360
if (c == '\'' && !useDoubleQuotes) {
385-
sbAppend(sb, "\\'");
361+
PythonUtils.append(sb, "\\'");
386362
} else {
387-
sbAppend(sb, c);
363+
PythonUtils.append(sb, c);
388364
}
389365
}
390-
sbAppend(sb, quote);
391-
return sbToString(sb);
366+
PythonUtils.append(sb, quote);
367+
return PythonUtils.sbToString(sb);
392368
}
393369

394370
@TruffleBoundary(allowInlining = true)
@@ -407,32 +383,32 @@ public static char figureOutQuote(byte[] bytes, int len) {
407383

408384
public static void reprLoop(StringBuilder sb, byte[] bytes, int len) {
409385
char quote = figureOutQuote(bytes, len);
410-
sbAppend(sb, 'b');
411-
sbAppend(sb, quote);
386+
PythonUtils.append(sb, 'b');
387+
PythonUtils.append(sb, quote);
412388
for (int i = 0; i < len; i++) {
413389
byteRepr(sb, bytes[i], quote == '\'');
414390
}
415-
sbAppend(sb, quote);
391+
PythonUtils.append(sb, quote);
416392
}
417393

418394
@TruffleBoundary
419395
private static void byteRepr(StringBuilder sb, byte b, boolean isSingleQuote) {
420396
if (b == '\t') {
421-
sbAppend(sb, "\\t");
397+
PythonUtils.append(sb, "\\t");
422398
} else if (b == '\n') {
423-
sbAppend(sb, "\\n");
399+
PythonUtils.append(sb, "\\n");
424400
} else if (b == '\r') {
425-
sbAppend(sb, "\\r");
401+
PythonUtils.append(sb, "\\r");
426402
} else if (b == '\'') {
427-
sbAppend(sb, isSingleQuote ? "\\'" : "\'");
403+
PythonUtils.append(sb, isSingleQuote ? "\\'" : "\'");
428404
} else if (b > 31 && b <= 126) {
429405
char chr = (char) b;
430406
if (chr == '\\') {
431-
sbAppend(sb, '\\');
407+
PythonUtils.append(sb, '\\');
432408
}
433-
sbAppend(sb, chr);
409+
PythonUtils.append(sb, chr);
434410
} else {
435-
sbAppend(sb, String.format("\\x%02x", b));
411+
PythonUtils.append(sb, String.format("\\x%02x", b));
436412
}
437413
}
438414

@@ -449,11 +425,11 @@ public static String bytesRepr(byte[] bytes, int length) {
449425
len = bytes.length;
450426
}
451427

452-
StringBuilder sb = newStringBuilder();
453-
sbAppend(sb, "b'");
428+
StringBuilder sb = PythonUtils.newStringBuilder();
429+
PythonUtils.append(sb, "b'");
454430
repr(sb, bytes, len);
455-
sbAppend(sb, "'");
456-
return sbToString(sb);
431+
PythonUtils.append(sb, "'");
432+
return PythonUtils.sbToString(sb);
457433
}
458434

459435
@TruffleBoundary(transferToInterpreterOnException = false)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/PEMap.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5050
import com.oracle.graal.python.util.BiFunction;
5151
import com.oracle.graal.python.util.PythonUtils;
52+
import com.oracle.truffle.api.CompilerAsserts;
5253
import com.oracle.truffle.api.CompilerDirectives;
5354
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
5455
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -801,6 +802,7 @@ private Object getValue(int index) {
801802

802803
@Override
803804
public String toString() {
805+
CompilerAsserts.neverPartOfCompilation();
804806
StringBuilder builder = new StringBuilder();
805807
builder.append(isSet ? "set(size=" : "map(size=").append(size()).append(", {");
806808
String sep = "";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictReprBuiltin.java

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.dict;
4242

43+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
44+
45+
import java.util.List;
46+
4347
import com.oracle.graal.python.builtins.Builtin;
4448
import com.oracle.graal.python.builtins.CoreFunctions;
4549
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
@@ -54,14 +58,14 @@
5458
import com.oracle.graal.python.builtins.objects.dict.PDictView.PDictValuesView;
5559
import com.oracle.graal.python.nodes.ErrorMessages;
5660
import com.oracle.graal.python.nodes.PRaiseNode;
57-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
5861
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode.LookupAndCallUnaryDynamicNode;
5962
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6063
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6164
import com.oracle.graal.python.nodes.util.CannotCastException;
6265
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
6366
import com.oracle.graal.python.runtime.exception.PException;
6467
import com.oracle.graal.python.runtime.exception.PythonErrorType;
68+
import com.oracle.graal.python.util.PythonUtils;
6569
import com.oracle.truffle.api.CompilerDirectives;
6670
import com.oracle.truffle.api.dsl.Cached;
6771
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -70,7 +74,6 @@
7074
import com.oracle.truffle.api.library.CachedLibrary;
7175
import com.oracle.truffle.api.profiles.BranchProfile;
7276
import com.oracle.truffle.api.profiles.ConditionProfile;
73-
import java.util.List;
7477

7578
@CoreFunctions(extendClasses = {PythonBuiltinClassType.PDictKeysView, PythonBuiltinClassType.PDictItemsView, PythonBuiltinClassType.PDictValuesView, PythonBuiltinClassType.PDict})
7679
public final class DictReprBuiltin extends PythonBuiltins {
@@ -129,7 +132,7 @@ protected String getReprString(Object obj, ReprState s, LookupAndCallUnaryDynami
129132

130133
protected static final void appendSeparator(ReprState s, ConditionProfile lengthCheck) {
131134
if (lengthCheck.profile(s.result.length() > s.initialLength)) {
132-
sbAppend(s.result, ", ");
135+
PythonUtils.append(s.result, ", ");
133136
}
134137
}
135138
}
@@ -147,7 +150,7 @@ public ReprState append(Object key, ReprState s,
147150
@Cached("createBinaryProfile()") ConditionProfile lengthCheck,
148151
@Cached BranchProfile nullBranch) {
149152
appendSeparator(s, lengthCheck);
150-
sbAppend(s.result, getReprString(key, null, reprNode, castStr, nullBranch, raiseNode));
153+
PythonUtils.append(s.result, getReprString(key, null, reprNode, castStr, nullBranch, raiseNode));
151154
return s;
152155
}
153156
}
@@ -166,7 +169,7 @@ public ReprState dict(Object key, ReprState s,
166169
@Cached BranchProfile nullBranch,
167170
@CachedLibrary(limit = "getLimit()") HashingStorageLibrary lib) {
168171
appendSeparator(s, lengthCheck);
169-
sbAppend(s.result, getReprString(lib.getItem(s.dictStorage, key), s, reprNode, castStr, nullBranch, raiseNode));
172+
PythonUtils.append(s.result, getReprString(lib.getItem(s.dictStorage, key), s, reprNode, castStr, nullBranch, raiseNode));
170173
return s;
171174
}
172175
}
@@ -187,11 +190,11 @@ public ReprState dict(Object key, ReprState s,
187190
@Cached BranchProfile valueNullBranch,
188191
@CachedLibrary(limit = "getLimit()") HashingStorageLibrary lib) {
189192
appendSeparator(s, lengthCheck);
190-
sbAppend(s.result, "(");
191-
sbAppend(s.result, getReprString(key, null, keyReprNode, castStr, keyNullBranch, raiseNode));
192-
sbAppend(s.result, ", ");
193-
sbAppend(s.result, getReprString(lib.getItem(s.dictStorage, key), s, valueReprNode, castStr, valueNullBranch, raiseNode));
194-
sbAppend(s.result, ")");
193+
PythonUtils.append(s.result, "(");
194+
PythonUtils.append(s.result, getReprString(key, null, keyReprNode, castStr, keyNullBranch, raiseNode));
195+
PythonUtils.append(s.result, ", ");
196+
PythonUtils.append(s.result, getReprString(lib.getItem(s.dictStorage, key), s, valueReprNode, castStr, valueNullBranch, raiseNode));
197+
PythonUtils.append(s.result, ")");
195198
return s;
196199
}
197200
}
@@ -214,9 +217,9 @@ public ReprState dict(Object key, ReprState s,
214217
String keyReprString = getReprString(key, null, keyReprNode, castStr, keyNullBranch, raiseNode);
215218
String valueReprString = getReprString(lib.getItem(s.dictStorage, key), s, valueReprNode, castStr, valueNullBranch, raiseNode);
216219
appendSeparator(s, lengthCheck);
217-
sbAppend(s.result, keyReprString);
218-
sbAppend(s.result, ": ");
219-
sbAppend(s.result, valueReprString);
220+
PythonUtils.append(s.result, keyReprString);
221+
PythonUtils.append(s.result, ": ");
222+
PythonUtils.append(s.result, valueReprString);
220223
return s;
221224
}
222225
}
@@ -226,11 +229,11 @@ public Object repr(PDict dict,
226229
@Cached("create(3)") ForEachDictRepr consumerNode,
227230
@Cached HashingCollectionNodes.GetDictStorageNode getDictStorage,
228231
@CachedLibrary(limit = "3") HashingStorageLibrary lib) {
229-
StringBuilder sb = new StringBuilder("{");
232+
StringBuilder sb = PythonUtils.newStringBuilder("{");
230233
HashingStorage dictStorage = getDictStorage.execute(dict);
231234
lib.forEach(dictStorage, consumerNode, new ReprState(dict, dictStorage, sb));
232-
sbAppend(sb, "}");
233-
return sb.toString();
235+
PythonUtils.append(sb, "}");
236+
return PythonUtils.sbToString(sb);
234237
}
235238

236239
@Specialization// use same limit as for EachRepr nodes library
@@ -258,17 +261,12 @@ public Object repr(PDictItemsView view,
258261
}
259262

260263
private static String viewRepr(PDictView view, String type, GetDictStorageNode getDictStorage, HashingStorageLibrary lib, AbstractForEachRepr consumerNode) {
261-
StringBuilder sb = new StringBuilder(type);
262-
sbAppend(sb, "([");
264+
StringBuilder sb = PythonUtils.newStringBuilder(type);
265+
PythonUtils.append(sb, "([");
263266
HashingStorage dictStorage = getDictStorage.execute(view.getWrappedDict());
264267
lib.forEach(dictStorage, consumerNode, new ReprState(view, dictStorage, sb));
265-
sbAppend(sb, "])");
266-
return sb.toString();
268+
PythonUtils.append(sb, "])");
269+
return PythonUtils.sbToString(sb);
267270
}
268271
}
269-
270-
@CompilerDirectives.TruffleBoundary
271-
private static StringBuilder sbAppend(StringBuilder sb, String s) {
272-
return sb.append(s);
273-
}
274272
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ public Object repr(VirtualFrame frame, PList self,
144144
@Cached("create(__REPR__)") LookupAndCallUnaryNode repr,
145145
@Cached SequenceStorageNodes.LenNode lenNode,
146146
@Cached SequenceStorageNodes.GetItemNode getItem) {
147-
StringBuilder result = new StringBuilder();
148-
sbAppend(result, "[");
147+
StringBuilder result = PythonUtils.newStringBuilder();
148+
PythonUtils.append(result, "[");
149149
SequenceStorage storage = self.getSequenceStorage();
150150
boolean initial = true;
151151
Object value;
@@ -164,24 +164,14 @@ public Object repr(VirtualFrame frame, PList self,
164164
if (initial) {
165165
initial = false;
166166
} else {
167-
sbAppend(result, ", ");
167+
PythonUtils.append(result, ", ");
168168
}
169-
sbAppend(result, (String) reprString);
169+
PythonUtils.append(result, (String) reprString);
170170
} else {
171171
raise(PythonErrorType.TypeError, ErrorMessages.RETURNED_NON_STRING, "__repr__", reprString);
172172
}
173173
}
174-
return toString(sbAppend(result, "]"));
175-
}
176-
177-
@TruffleBoundary(allowInlining = true)
178-
private static Object toString(StringBuilder sbAppend) {
179-
return sbAppend.toString();
180-
}
181-
182-
@TruffleBoundary(allowInlining = true)
183-
private static StringBuilder sbAppend(StringBuilder result, String s) {
184-
return result.append(s);
174+
return PythonUtils.sbToString(PythonUtils.append(result, "]"));
185175
}
186176
}
187177

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/PList.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.oracle.graal.python.runtime.sequence.PSequence;
3535
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
3636
import com.oracle.graal.python.util.OverflowException;
37+
import com.oracle.truffle.api.CompilerAsserts;
3738
import com.oracle.truffle.api.CompilerDirectives;
3839
import com.oracle.truffle.api.dsl.Cached;
3940
import com.oracle.truffle.api.interop.InteropLibrary;
@@ -75,6 +76,7 @@ public final void setSequenceStorage(SequenceStorage newStorage) {
7576

7677
@Override
7778
public final String toString() {
79+
CompilerAsserts.neverPartOfCompilation();
7880
StringBuilder buf = new StringBuilder("[");
7981

8082
for (int i = 0; i < store.length(); i++) {

0 commit comments

Comments
 (0)