Skip to content

Commit a27b05f

Browse files
committed
[GR-23189] Fixes in preparation for memoryview
PullRequest: graalpython/1322
2 parents f5515e6 + 42c3dfe commit a27b05f

File tree

23 files changed

+335
-418
lines changed

23 files changed

+335
-418
lines changed

graalpython/com.oracle.graal.python.cext/src/object.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,21 @@ Py_ssize_t PyObject_Size(PyObject *o) {
141141

142142
UPCALL_ID(PyObject_Str);
143143
PyObject* PyObject_Str(PyObject* o) {
144+
if (o == NULL)
145+
return PyUnicode_FromString("<NULL>");
144146
return UPCALL_CEXT_O(_jls_PyObject_Str, native_to_java(o));
145147
}
146148

147149
PyObject* PyObject_ASCII(PyObject* o) {
150+
if (o == NULL)
151+
return PyUnicode_FromString("<NULL>");
148152
return UPCALL_O(PY_BUILTIN, polyglot_from_string("ascii", SRC_CS), native_to_java(o));
149153
}
150154

151155
UPCALL_ID(PyObject_Repr);
152156
PyObject* PyObject_Repr(PyObject* o) {
157+
if (o == NULL)
158+
return PyUnicode_FromString("<NULL>");
153159
return UPCALL_CEXT_O(_jls_PyObject_Repr, native_to_java(o));
154160
}
155161

graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ArgumentClinicProcessor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
*/
4141
package com.oracle.graal.python.processor;
4242

43+
import static com.oracle.graal.python.processor.ConverterFactory.CLINIC_PACKAGE;
44+
4345
import java.io.IOException;
4446
import java.time.LocalDateTime;
4547
import java.util.ArrayList;
@@ -77,8 +79,6 @@
7779
import com.oracle.graal.python.processor.ArgumentClinicModel.BuiltinClinicData;
7880
import com.oracle.graal.python.processor.CodeWriter.Block;
7981

80-
import static com.oracle.graal.python.processor.ConverterFactory.CLINIC_PACKAGE;
81-
8282
public class ArgumentClinicProcessor extends AbstractProcessor {
8383
private static final boolean LOGGING = false;
8484
private static final String BuiltinAnnotationClass = "com.oracle.graal.python.builtins.Builtin";
@@ -148,12 +148,14 @@ private void writeCode(HashMap<TypeElement, Set<BuiltinClinicData>> enclosingTyp
148148
private void writeImports(CodeWriter w, Entry<TypeElement, Set<BuiltinClinicData>> enclosingType) throws IOException {
149149
log("Writing imports...");
150150
TreeSet<String> imports = new TreeSet<>();
151-
imports.add("com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode");
152151
imports.add(CLINIC_PACKAGE + ".ArgumentClinicProvider");
153-
imports.add(CLINIC_PACKAGE + ".ArgumentCastNode");
154152
for (BuiltinClinicData builtin : enclosingType.getValue()) {
155153
for (ArgumentClinicData arg : builtin.arguments) {
156154
imports.addAll(arg.imports);
155+
if (arg.castNodeFactory != null) {
156+
imports.add("com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode");
157+
imports.add(CLINIC_PACKAGE + ".ArgumentCastNode");
158+
}
157159
}
158160
}
159161
for (String pkg : imports) {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b16encode
55
*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32decode_casefold
66
*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32decode_error
7+
*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b64encode
78
*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b85_padding
89
*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b85decode_errors
910
*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_decode_nonascii_str
1011
*graalpython.lib-python.3.test.test_base64.LegacyBase64TestCase.test_decode
1112
*graalpython.lib-python.3.test.test_base64.LegacyBase64TestCase.test_decodestring_warns
1213
*graalpython.lib-python.3.test.test_base64.LegacyBase64TestCase.test_encode
1314
*graalpython.lib-python.3.test.test_base64.LegacyBase64TestCase.test_encodestring_warns
15+
*graalpython.lib-python.3.test.test_base64.TestMain.test_decode
1416
*graalpython.lib-python.3.test.test_base64.TestMain.test_encode_decode
17+
*graalpython.lib-python.3.test.test_base64.TestMain.test_encode_file

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_b2a_base64_newline
2+
*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_base64valid
23
*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_exceptions
34
*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_hex
45
*graalpython.lib-python.3.test.test_binascii.BinASCIITest.test_b2a_base64_newline
@@ -10,5 +11,6 @@
1011
*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_exceptions
1112
*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_hex
1213
*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_b2a_base64_newline
14+
*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_base64valid
1315
*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_exceptions
1416
*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_hex

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

Lines changed: 28 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -47,33 +47,29 @@
4747
import java.util.List;
4848
import java.util.zip.CRC32;
4949

50+
import com.oracle.graal.python.annotations.ArgumentClinic;
5051
import com.oracle.graal.python.builtins.Builtin;
5152
import com.oracle.graal.python.builtins.CoreFunctions;
5253
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5354
import com.oracle.graal.python.builtins.PythonBuiltins;
5455
import com.oracle.graal.python.builtins.objects.PNone;
5556
import com.oracle.graal.python.builtins.objects.array.PArray;
56-
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
5757
import com.oracle.graal.python.builtins.objects.bytes.BytesUtils;
5858
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
59-
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
6059
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
61-
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ToByteArrayNodeGen;
62-
import com.oracle.graal.python.builtins.objects.ints.PInt;
63-
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
6460
import com.oracle.graal.python.builtins.objects.module.PythonModule;
6561
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
6662
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
6763
import com.oracle.graal.python.nodes.ErrorMessages;
6864
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
6965
import com.oracle.graal.python.nodes.call.CallNode;
70-
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
7166
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7267
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
68+
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode;
7369
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
70+
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
7471
import com.oracle.graal.python.nodes.statement.RaiseNode;
7572
import com.oracle.graal.python.nodes.statement.RaiseNodeGen;
76-
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
7773
import com.oracle.graal.python.runtime.PythonCore;
7874
import com.oracle.graal.python.runtime.exception.PException;
7975
import com.oracle.truffle.api.CompilerDirectives;
@@ -84,11 +80,8 @@
8480
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
8581
import com.oracle.truffle.api.dsl.NodeFactory;
8682
import com.oracle.truffle.api.dsl.Specialization;
87-
import com.oracle.truffle.api.dsl.TypeSystemReference;
88-
import com.oracle.truffle.api.frame.VirtualFrame;
8983
import com.oracle.truffle.api.interop.UnsupportedMessageException;
9084
import com.oracle.truffle.api.library.CachedLibrary;
91-
import com.oracle.truffle.api.profiles.ConditionProfile;
9285
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
9386

9487
@CoreFunctions(defineModule = "binascii")
@@ -119,10 +112,14 @@ PBytes doString(String data) {
119112
return factory().createBytes(b64decode(data));
120113
}
121114

122-
@Specialization
123-
PBytes doBytesLike(VirtualFrame frame, PBytesLike data,
124-
@Cached("create()") BytesNodes.ToBytesNode toBytesNode) {
125-
return factory().createBytes(b64decode(toBytesNode.execute(frame, data)));
115+
@Specialization(guards = "bufferLib.isBuffer(data)", limit = "3")
116+
PBytes doBuffer(Object data,
117+
@CachedLibrary("data") PythonObjectLibrary bufferLib) {
118+
try {
119+
return factory().createBytes(b64decode(bufferLib.getBufferBytes(data)));
120+
} catch (UnsupportedMessageException e) {
121+
throw raise(SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC);
122+
}
126123
}
127124

128125
@TruffleBoundary
@@ -241,123 +238,37 @@ private void raiseObject(Object exceptionObject, String message) {
241238
}
242239
}
243240

244-
@Builtin(name = "b2a_base64", minNumOfPositionalArgs = 1, parameterNames = {"data", "newline"})
245-
@TypeSystemReference(PythonArithmeticTypes.class)
241+
@Builtin(name = "b2a_base64", minNumOfPositionalArgs = 1, numOfPositionalOnlyArgs = 1, parameterNames = {"data"}, keywordOnlyNames = {"newline"})
242+
@ArgumentClinic(name = "newline", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "1", useDefaultForNone = true)
246243
@GenerateNodeFactory
247-
abstract static class B2aBase64Node extends PythonBinaryBuiltinNode {
248-
249-
@Child private SequenceStorageNodes.ToByteArrayNode toByteArray;
250-
@Child private B2aBase64Node recursiveNode;
251-
252-
private SequenceStorageNodes.ToByteArrayNode getToByteArrayNode() {
253-
if (toByteArray == null) {
254-
CompilerDirectives.transferToInterpreterAndInvalidate();
255-
toByteArray = insert(ToByteArrayNodeGen.create());
256-
}
257-
return toByteArray;
258-
}
259-
260-
private B2aBase64Node getRecursiveNode() {
261-
if (recursiveNode == null) {
262-
CompilerDirectives.transferToInterpreterAndInvalidate();
263-
recursiveNode = insert(BinasciiModuleBuiltinsFactory.B2aBase64NodeFactory.create());
264-
}
265-
return recursiveNode;
266-
}
267-
244+
abstract static class B2aBase64Node extends PythonBinaryClinicBuiltinNode {
268245
@TruffleBoundary
269-
private PBytes b2a(byte[] data, boolean newline) {
246+
private static byte[] b2a(byte[] data, int newline) {
270247
String encode = Base64.encode(data);
271-
if (newline) {
272-
return factory().createBytes((encode + "\n").getBytes());
248+
if (newline != 0) {
249+
return (encode + "\n").getBytes();
273250
}
274-
return factory().createBytes((encode).getBytes());
275-
}
276-
277-
@Specialization(guards = "isNoValue(newline)")
278-
PBytes b2aBytesLike(PBytesLike data, @SuppressWarnings("unused") PNone newline) {
279-
return b2aBytesLike(data, 1);
280-
}
281-
282-
@Specialization
283-
PBytes b2aBytesLike(PBytesLike data, long newline) {
284-
return b2a(getToByteArrayNode().execute(data.getSequenceStorage()), newline != 0);
285-
}
286-
287-
@Specialization
288-
PBytes b2aBytesLike(PBytesLike data, PInt newline) {
289-
return b2a(getToByteArrayNode().execute(data.getSequenceStorage()), !newline.isZero());
251+
return encode.getBytes();
290252
}
291253

292-
@Specialization(limit = "1")
293-
PBytes b2aBytesLike(VirtualFrame frame, PBytesLike data, Object newline,
294-
@CachedLibrary("newline") PythonObjectLibrary lib) {
295-
return (PBytes) getRecursiveNode().execute(frame, data, asPInt(newline, lib));
296-
}
297-
298-
@Specialization(guards = "isNoValue(newline)")
299-
PBytes b2aArray(VirtualFrame frame, PArray data, @SuppressWarnings("unused") PNone newline,
300-
@CachedLibrary(limit = "1") PythonObjectLibrary lib) {
301-
return b2aArray(frame, data, 1, lib);
302-
}
303-
304-
@Specialization
305-
PBytes b2aArray(PArray data, long newline) {
306-
return b2a(getToByteArrayNode().execute(data.getSequenceStorage()), newline != 0);
307-
}
308-
309-
@Specialization
310-
PBytes b2aArray(PArray data, PInt newline) {
311-
return b2a(getToByteArrayNode().execute(data.getSequenceStorage()), !newline.isZero());
312-
}
313-
314-
@Specialization(limit = "1")
315-
PBytes b2aArray(VirtualFrame frame, PArray data, Object newline,
316-
@CachedLibrary("newline") PythonObjectLibrary lib) {
317-
return (PBytes) getRecursiveNode().execute(frame, data, asPInt(newline, lib));
318-
}
319-
320-
@Specialization(guards = "isNoValue(newline)")
321-
PBytes b2aMmeory(VirtualFrame frame, PMemoryView data, @SuppressWarnings("unused") PNone newline,
322-
@Cached("create(TOBYTES)") LookupAndCallUnaryNode toBytesNode,
323-
@Cached("createBinaryProfile()") ConditionProfile isBytesProfile) {
324-
return b2aMemory(frame, data, 1, toBytesNode, isBytesProfile);
325-
}
326-
327-
@Specialization
328-
PBytes b2aMemory(VirtualFrame frame, PMemoryView data, long newline,
329-
@Cached("create(TOBYTES)") LookupAndCallUnaryNode toBytesNode,
330-
@Cached("createBinaryProfile()") ConditionProfile isBytesProfile) {
331-
Object bytesObj = toBytesNode.executeObject(frame, data);
332-
if (isBytesProfile.profile(bytesObj instanceof PBytes)) {
333-
return b2aBytesLike((PBytes) bytesObj, newline);
254+
@Specialization(guards = "bufferLib.isBuffer(data)", limit = "3")
255+
PBytes b2aBuffer(Object data, int newline,
256+
@CachedLibrary("data") PythonObjectLibrary bufferLib) {
257+
try {
258+
return factory().createBytes(b2a(bufferLib.getBufferBytes(data), newline));
259+
} catch (UnsupportedMessageException e) {
260+
throw raise(SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC);
334261
}
335-
throw raise(SystemError, ErrorMessages.COULD_NOT_GET_BYTES_OF_MEMORYVIEW);
336-
}
337-
338-
@Specialization
339-
PBytes b2aMmeory(VirtualFrame frame, PMemoryView data, PInt newline,
340-
@Cached("create(TOBYTES)") LookupAndCallUnaryNode toBytesNode,
341-
@Cached("createBinaryProfile()") ConditionProfile isBytesProfile) {
342-
return b2aMemory(frame, data, newline.isZero() ? 0 : 1, toBytesNode, isBytesProfile);
343-
}
344-
345-
@Specialization(limit = "1")
346-
PBytes b2aMmeory(VirtualFrame frame, PMemoryView data, Object newline,
347-
@CachedLibrary("newline") PythonObjectLibrary lib) {
348-
return (PBytes) getRecursiveNode().execute(frame, data, asPInt(newline, lib));
349262
}
350263

351264
@Fallback
352265
PBytes b2sGeneral(Object data, @SuppressWarnings("unused") Object newline) {
353266
throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, data);
354267
}
355268

356-
private Object asPInt(Object obj, PythonObjectLibrary lib) {
357-
if (lib.canBePInt(obj)) {
358-
return lib.asPInt(obj);
359-
}
360-
throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.INTEGER_REQUIRED_GOT, obj);
269+
@Override
270+
protected ArgumentClinicProvider getArgumentClinic() {
271+
return BinasciiModuleBuiltinsClinicProviders.B2aBase64NodeClinicProviderGen.INSTANCE;
361272
}
362273
}
363274

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ public PBytes hasBytesAttr(VirtualFrame frame, Object cls, Object source, @Suppr
304304
if (isBytes.profile(bytes instanceof PBytes && isClassProfile.profileIsAnyBuiltinClass(cls))) {
305305
return (PBytes) bytes;
306306
}
307-
return factory().createBytes(cls, toBytesNode.execute(frame, bytes));
307+
return factory().createBytes(cls, toBytesNode.execute(bytes));
308308
}
309309

310310
@Specialization(guards = {"!isNone(source)", "!canUseByteAttr(source, lookupBytes, lib, encoding, errors)"}, limit = "3")
@@ -900,7 +900,7 @@ Object floatFromString(VirtualFrame frame, Object cls, String arg) {
900900
}
901901

902902
private double convertBytesToDouble(VirtualFrame frame, PBytesLike arg) {
903-
return convertStringToDouble(frame, PythonUtils.newString(getByteArray(frame, arg)), arg);
903+
return convertStringToDouble(frame, PythonUtils.newString(getByteArray(arg)), arg);
904904
}
905905

906906
private double convertStringToDouble(VirtualFrame frame, String src, Object origObj) {
@@ -1027,12 +1027,12 @@ protected static boolean isSubtypeOfFloat(VirtualFrame frame, IsSubtypeNode isSu
10271027
return isSubtypeNode.execute(frame, cls, PythonBuiltinClassType.PFloat);
10281028
}
10291029

1030-
private byte[] getByteArray(VirtualFrame frame, PBytesLike pByteArray) {
1030+
private byte[] getByteArray(PBytesLike pByteArray) {
10311031
if (toByteArrayNode == null) {
10321032
CompilerDirectives.transferToInterpreterAndInvalidate();
10331033
toByteArrayNode = insert(BytesNodes.ToBytesNode.create());
10341034
}
1035-
return toByteArrayNode.execute(frame, pByteArray);
1035+
return toByteArrayNode.execute(pByteArray);
10361036
}
10371037
}
10381038

@@ -1366,7 +1366,7 @@ Object createIntError(VirtualFrame frame, Object cls, String number, Object base
13661366
@Specialization
13671367
Object parseBytesError(VirtualFrame frame, Object cls, PBytesLike arg, int base) {
13681368
checkBase(base);
1369-
return stringToInt(frame, cls, toString(frame, arg), base, arg);
1369+
return stringToInt(frame, cls, toString(arg), base, arg);
13701370
}
13711371

13721372
@Specialization(guards = "isNoValue(base)")
@@ -1518,12 +1518,12 @@ private Object callTrunc(VirtualFrame frame, Object obj) {
15181518
return callTruncNode.executeObject(frame, obj);
15191519
}
15201520

1521-
private String toString(VirtualFrame frame, PBytesLike pByteArray) {
1521+
private String toString(PBytesLike pByteArray) {
15221522
if (toByteArrayNode == null) {
15231523
CompilerDirectives.transferToInterpreterAndInvalidate();
15241524
toByteArrayNode = insert(BytesNodes.ToBytesNode.create());
15251525
}
1526-
return toString(toByteArrayNode.execute(frame, pByteArray));
1526+
return toString(toByteArrayNode.execute(pByteArray));
15271527
}
15281528

15291529
@TruffleBoundary

0 commit comments

Comments
 (0)