Skip to content

Commit 827e455

Browse files
committed
[GR-23278] make test_bytes pass
PullRequest: graalpython/1297
2 parents fb00eb7 + 9ef2ebc commit 827e455

File tree

9 files changed

+369
-216
lines changed

9 files changed

+369
-216
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bytes.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_format
55
*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_from_bytearray
66
*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_literal
7+
*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_repr_str
78
*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_return_self
89
*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_rsplit_bytearray
910
*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_split_bytearray
@@ -27,6 +28,7 @@
2728
*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_isupper
2829
*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_ljust
2930
*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_lower
31+
*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_replace
3032
*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_replace_overflow
3133
*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_rfind
3234
*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_rindex
@@ -47,6 +49,7 @@
4749
*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassTest.test_join
4850
*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassTest.test_pickle
4951
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_alloc
52+
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_append
5053
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_basics
5154
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_bytearray_api
5255
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_center
@@ -59,6 +62,7 @@
5962
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_constructor_type_errors
6063
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_constructor_value_errors
6164
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_contains
65+
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_copied
6266
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_copy
6367
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_count
6468
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_decode
@@ -75,6 +79,7 @@
7579
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_find
7680
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_find_etc_raise_correct_error_messages
7781
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_free_after_iterating
82+
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_buffer
7883
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_index
7984
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_int
8085
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_iterable
@@ -86,17 +91,20 @@
8691
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_getitem_error
8792
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_getslice
8893
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_hex
94+
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_hex_separator_basics
8995
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_hex_separator_five_bytes
9096
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_hex_separator_six_bytes
9197
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_iconcat
9298
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_imod
9399
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_index
94100
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_init_alloc
101+
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_insert
95102
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_integer_arguments_out_of_byte_range
96103
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_irepeat
97104
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_irepeat_1char
98105
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_iterator_length_hint
99106
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_iterator_pickling
107+
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_iterator_pickling2
100108
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_join
101109
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_ljust
102110
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_maketrans
@@ -113,10 +121,12 @@
113121
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_pickling
114122
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_pop
115123
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_regexps
124+
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_remove
116125
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_repeat
117126
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_repeat_1char
118127
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_replace
119128
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_replace_int_error
129+
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_resize_forbidden
120130
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_reverse
121131
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_reversed
122132
*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_rfind
@@ -159,6 +169,7 @@
159169
*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_isupper
160170
*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_ljust
161171
*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_lower
172+
*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_replace
162173
*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_replace_overflow
163174
*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_rfind
164175
*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_rindex
@@ -179,6 +190,7 @@
179190
*graalpython.lib-python.3.test.test_bytes.BytesSubclassTest.test_pickle
180191
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_basics
181192
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_buffer_is_readonly
193+
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_bytes_blocking
182194
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_center
183195
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_compare
184196
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_compare_to_str
@@ -190,6 +202,7 @@
190202
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_contains
191203
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_copy
192204
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_count
205+
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_custom
193206
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_decode
194207
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_empty_sequence
195208
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_encoding
@@ -198,6 +211,7 @@
198211
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_find
199212
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_find_etc_raise_correct_error_messages
200213
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_free_after_iterating
214+
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_buffer
201215
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_format
202216
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_index
203217
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_int
@@ -210,6 +224,7 @@
210224
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_getitem_error
211225
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_getslice
212226
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_hex
227+
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_hex_separator_basics
213228
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_hex_separator_five_bytes
214229
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_hex_separator_six_bytes
215230
*graalpython.lib-python.3.test.test_bytes.BytesTest.test_imod

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__SLOTS__;
7676
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__WEAKREF__;
7777
import static com.oracle.graal.python.nodes.SpecialMethodNames.DECODE;
78+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__BYTES__;
7879
import static com.oracle.graal.python.nodes.SpecialMethodNames.__COMPLEX__;
7980
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
8081
import static com.oracle.graal.python.nodes.SpecialMethodNames.__FLOAT__;
@@ -288,16 +289,45 @@ public PBytes byteDone(VirtualFrame frame, Object cls, PNone source, PNone encod
288289
return factory().createBytes(cls, PythonUtils.EMPTY_BYTE_ARRAY);
289290
}
290291

291-
@Specialization(guards = "!isNone(source)")
292+
@Specialization(guards = "hasByteAttr(frame, source, lib)", limit = "3")
293+
public PBytes hasBytesAttr(VirtualFrame frame, Object cls, Object source, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors,
294+
@Cached ConditionProfile errorProfile,
295+
@Cached BytesNodes.ToBytesNode toBytesNode,
296+
@Cached ConditionProfile isBytes,
297+
@Cached IsBuiltinClassProfile isClassProfile,
298+
@SuppressWarnings("unused") @CachedLibrary("source") PythonObjectLibrary lib) {
299+
Object b = lib.lookupAttribute(source, frame, __BYTES__);
300+
assert b != PNone.NO_VALUE;
301+
Object bytes = lib.lookupAndCallRegularMethod(source, frame, __BYTES__);
302+
if (errorProfile.profile(!(bytes instanceof PBytesLike))) {
303+
throw raise(TypeError, ErrorMessages.RETURNED_NONBYTES, "__bytes__", b);
304+
}
305+
306+
if (isBytes.profile(bytes instanceof PBytes && isClassProfile.profileIsAnyBuiltinClass(cls))) {
307+
return (PBytes) bytes;
308+
}
309+
return factory().createBytes(cls, toBytesNode.execute(frame, bytes));
310+
}
311+
312+
@Specialization(guards = {"!isNone(source)", "!canUseByteAttr(frame, source, lib, encoding, errors)"}, limit = "3")
292313
public PBytes doInit(VirtualFrame frame, Object cls, Object source, Object encoding, Object errors,
293-
@Cached BytesNodes.BytesInitNode toBytesNode) {
314+
@Cached BytesNodes.BytesInitNode toBytesNode,
315+
@SuppressWarnings("unused") @CachedLibrary("source") PythonObjectLibrary lib) {
294316
return factory().createBytes(cls, new ByteSequenceStorage(toBytesNode.execute(frame, source, encoding, errors)));
295317
}
296318

297319
@Specialization(guards = "isNone(source)")
298320
public PBytes sourceNone(Object cls, Object source, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors) {
299321
throw raise(TypeError, ErrorMessages.CANNOT_CONVERT_P_OBJ_TO_S, source, cls);
300322
}
323+
324+
protected static boolean canUseByteAttr(VirtualFrame frame, Object object, PythonObjectLibrary lib, Object encoding, Object errors) {
325+
return PGuards.isNoValue(encoding) && PGuards.isNoValue(errors) && hasByteAttr(frame, object, lib);
326+
}
327+
328+
protected static boolean hasByteAttr(VirtualFrame frame, Object object, PythonObjectLibrary lib) {
329+
return lib.lookupAttribute(object, frame, __BYTES__) != PNone.NO_VALUE;
330+
}
301331
}
302332

303333
@Builtin(name = BYTEARRAY, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PByteArray)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,39 +1704,13 @@ public Object asciiString(Object obj,
17041704
@Cached CastToJavaStringNode castToJavaStringNode) {
17051705
try {
17061706
String str = castToJavaStringNode.execute(obj);
1707-
return doAsciiString(str);
1707+
return BytesUtils.doAsciiString(str);
17081708
} catch (CannotCastException e) {
17091709
CompilerDirectives.transferToInterpreterAndInvalidate();
17101710
throw new IllegalStateException("should not be reached");
17111711
}
17121712
}
17131713

1714-
@TruffleBoundary
1715-
private static Object doAsciiString(String str) {
1716-
byte[] bytes = BytesUtils.unicodeEscape(str);
1717-
boolean hasSingleQuote = false;
1718-
boolean hasDoubleQuote = false;
1719-
for (int i = 0; i < bytes.length; i++) {
1720-
char c = (char) bytes[i];
1721-
hasSingleQuote |= c == '\'';
1722-
hasDoubleQuote |= c == '"';
1723-
}
1724-
boolean useDoubleQuotes = hasSingleQuote && !hasDoubleQuote;
1725-
char quote = useDoubleQuotes ? '"' : '\'';
1726-
StringBuilder sb = new StringBuilder(bytes.length + 2);
1727-
sb.append(quote);
1728-
for (int i = 0; i < bytes.length; i++) {
1729-
char c = (char) bytes[i];
1730-
if (c == '\'' && !useDoubleQuotes) {
1731-
sb.append("\\'");
1732-
} else {
1733-
sb.append(c);
1734-
}
1735-
}
1736-
sb.append(quote);
1737-
return sb.toString();
1738-
}
1739-
17401714
@Specialization(guards = "!isString(obj)")
17411715
public Object asciiGeneric(VirtualFrame frame, Object obj,
17421716
@Cached ReprNode reprNode) {

0 commit comments

Comments
 (0)