Skip to content

Commit cf9fe77

Browse files
committed
moved some PyBytes/Float/List/Long/Number buildins into their particular PyCextXXXBuiltins files
1 parent 99f785a commit cf9fe77

14 files changed

+895
-843
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java

Lines changed: 1 addition & 820 deletions
Large diffs are not rendered by default.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBytesBuiltins.java

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -54,27 +54,47 @@
5454
import com.oracle.graal.python.builtins.PythonBuiltins;
5555
import com.oracle.graal.python.builtins.modules.BuiltinConstructors.BytesNode;
5656
import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode;
57+
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.NativeBuiltin;
5758
import com.oracle.graal.python.builtins.objects.PNone;
5859
import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltins;
60+
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
5961
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
62+
import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards;
63+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
64+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
6065
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetNativeNullNode;
6166
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
6267
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
68+
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
69+
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.GetByteArrayNode;
70+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
6371
import com.oracle.graal.python.builtins.objects.str.StringBuiltins.EncodeNode;
6472
import com.oracle.graal.python.builtins.objects.str.StringBuiltins.ModNode;
73+
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
6574
import com.oracle.graal.python.lib.PyObjectLookupAttr;
6675
import com.oracle.graal.python.lib.PyObjectSizeNode;
76+
import com.oracle.graal.python.nodes.ErrorMessages;
6777
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
6878
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6979
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
7080
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
7181
import com.oracle.graal.python.nodes.object.GetClassNode;
82+
import com.oracle.graal.python.nodes.util.CastToByteNode;
7283
import com.oracle.graal.python.runtime.exception.PException;
84+
import com.oracle.graal.python.runtime.exception.PythonErrorType;
85+
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
86+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
87+
import com.oracle.graal.python.util.OverflowException;
7388
import com.oracle.truffle.api.dsl.Cached;
89+
import com.oracle.truffle.api.dsl.Cached.Exclusive;
90+
import com.oracle.truffle.api.dsl.Cached.Shared;
7491
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
92+
import com.oracle.truffle.api.dsl.ImportStatic;
7593
import com.oracle.truffle.api.dsl.NodeFactory;
7694
import com.oracle.truffle.api.dsl.Specialization;
7795
import com.oracle.truffle.api.frame.VirtualFrame;
96+
import com.oracle.truffle.api.interop.InteropException;
97+
import java.util.Arrays;
7898

7999
@CoreFunctions(defineModule = PythonCextBytesBuiltins.PYTHON_CEXT_BYTES)
80100
@GenerateNodeFactory
@@ -91,7 +111,7 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
91111
public void initialize(Python3Core core) {
92112
super.initialize(core);
93113
}
94-
114+
95115
@Builtin(name = "PyBytes_Size", minNumOfPositionalArgs = 1)
96116
@GenerateNodeFactory
97117
public abstract static class PyBytesSizeNode extends PythonUnaryBuiltinNode {
@@ -287,4 +307,75 @@ protected boolean isAcceptedSubtype(VirtualFrame frame, Object obj, GetClassNode
287307
(!isSubtypeNode.execute(frame, klass, PythonBuiltinClassType.PString) && lookupAttrNode.execute(frame, obj, __ITER__) != PNone.NO_VALUE);
288308
}
289309
}
310+
311+
@Builtin(name = "PyBytes_FromStringAndSize", minNumOfPositionalArgs = 3, declaresExplicitSelf = true)
312+
@GenerateNodeFactory
313+
@ImportStatic(CApiGuards.class)
314+
abstract static class PyBytes_FromStringAndSize extends NativeBuiltin {
315+
// n.b.: the specializations for PIBytesLike are quite common on
316+
// managed, when the PySequenceArrayWrapper that we used never went
317+
// native, and during the upcall to here it was simply unwrapped again
318+
// with the ToJava (rather than mapped from a native pointer back into a
319+
// PythonNativeObject)
320+
321+
@Specialization
322+
Object doGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object module, PythonNativeWrapper object, long size,
323+
@Cached AsPythonObjectNode asPythonObjectNode,
324+
@Exclusive @Cached BytesNodes.ToBytesNode getByteArrayNode,
325+
@Shared("toSulongNode") @Cached CExtNodes.ToSulongNode toSulongNode) {
326+
byte[] ary = getByteArrayNode.execute(frame, asPythonObjectNode.execute(object));
327+
PBytes result;
328+
if (size >= 0 && size < ary.length) {
329+
// cast to int is guaranteed because of 'size < ary.length'
330+
result = factory().createBytes(Arrays.copyOf(ary, (int) size));
331+
} else {
332+
result = factory().createBytes(ary);
333+
}
334+
return toSulongNode.execute(result);
335+
}
336+
337+
@Specialization(guards = "!isNativeWrapper(nativePointer)")
338+
Object doNativePointer(VirtualFrame frame, Object module, Object nativePointer, long size,
339+
@Exclusive @Cached GetNativeNullNode getNativeNullNode,
340+
@Exclusive @Cached GetByteArrayNode getByteArrayNode,
341+
@Shared("toSulongNode") @Cached CExtNodes.ToSulongNode toSulongNode) {
342+
try {
343+
return toSulongNode.execute(factory().createBytes(getByteArrayNode.execute(nativePointer, size)));
344+
} catch (InteropException e) {
345+
return raiseNative(frame, getNativeNullNode.execute(module), PythonErrorType.TypeError, "%m", e);
346+
} catch (OverflowException e) {
347+
return raiseNative(frame, getNativeNullNode.execute(module), PythonErrorType.SystemError, "negative size passed");
348+
}
349+
}
350+
}
351+
352+
@Builtin(name = "_PyBytes_Resize", minNumOfPositionalArgs = 2)
353+
@GenerateNodeFactory
354+
public abstract static class PyBytes_Resize extends PythonBinaryBuiltinNode {
355+
356+
@Specialization
357+
int resize(VirtualFrame frame, PBytes self, long newSizeL,
358+
@Cached SequenceStorageNodes.LenNode lenNode,
359+
@Cached SequenceStorageNodes.GetItemNode getItemNode,
360+
@Cached PyNumberAsSizeNode asSizeNode,
361+
@Cached CastToByteNode castToByteNode) {
362+
363+
SequenceStorage storage = self.getSequenceStorage();
364+
int newSize = asSizeNode.executeExact(frame, newSizeL);
365+
int len = lenNode.execute(storage);
366+
byte[] smaller = new byte[newSize];
367+
for (int i = 0; i < newSize && i < len; i++) {
368+
smaller[i] = castToByteNode.execute(frame, getItemNode.execute(frame, storage, i));
369+
}
370+
self.setSequenceStorage(new ByteSequenceStorage(smaller));
371+
return 0;
372+
}
373+
374+
@Specialization(guards = "!isBytes(self)")
375+
int add(VirtualFrame frame, Object self, @SuppressWarnings("unused") Object o,
376+
@Cached PRaiseNativeNode raiseNativeNode) {
377+
return raiseNativeNode.raiseInt(frame, -1, SystemError, ErrorMessages.EXPECTED_S_NOT_P, "a set object", self);
378+
}
379+
380+
}
290381
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextComplexBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDictBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFloatBuiltins.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -48,9 +48,14 @@
4848
import com.oracle.graal.python.builtins.Python3Core;
4949
import com.oracle.graal.python.builtins.PythonBuiltins;
5050
import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode;
51+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
5152
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
53+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
54+
import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper;
55+
import com.oracle.graal.python.lib.PyFloatAsDoubleNode;
5256
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5357
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
58+
import com.oracle.graal.python.runtime.exception.PException;
5459
import com.oracle.truffle.api.dsl.Cached;
5560
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
5661
import com.oracle.truffle.api.dsl.NodeFactory;
@@ -72,7 +77,7 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
7277
public void initialize(Python3Core core) {
7378
super.initialize(core);
7479
}
75-
80+
7681
///////////// float /////////////
7782

7883
@Builtin(name = "PyFloat_FromDouble", minNumOfPositionalArgs = 1)
@@ -92,4 +97,33 @@ public Object fromDouble(VirtualFrame frame, Object obj,
9297
return raiseNativeNode.raiseInt(frame, -1, SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(frame, obj), obj);
9398
}
9499
}
100+
101+
@Builtin(name = "PyFloat_AsDouble", minNumOfPositionalArgs = 1)
102+
@GenerateNodeFactory
103+
abstract static class PyFloatAsDouble extends PythonUnaryBuiltinNode {
104+
105+
@Specialization(guards = "!object.isDouble()")
106+
static double doLongNativeWrapper(DynamicObjectNativeWrapper.PrimitiveNativeWrapper object) {
107+
return object.getLong();
108+
}
109+
110+
@Specialization(guards = "object.isDouble()")
111+
static double doDoubleNativeWrapper(DynamicObjectNativeWrapper.PrimitiveNativeWrapper object) {
112+
return object.getDouble();
113+
}
114+
115+
@Specialization
116+
static double doGenericErr(VirtualFrame frame, Object object,
117+
@Cached AsPythonObjectNode asPythonObjectNode,
118+
@Cached PyFloatAsDoubleNode asDoubleNode,
119+
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
120+
try {
121+
return asDoubleNode.execute(frame, asPythonObjectNode.execute(object));
122+
} catch (PException e) {
123+
transformExceptionToNativeNode.execute(frame, e);
124+
return -1.0;
125+
}
126+
}
127+
}
128+
95129
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextListBuiltins.java

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -54,15 +54,23 @@
5454
import com.oracle.graal.python.builtins.PythonBuiltins;
5555
import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode;
5656
import com.oracle.graal.python.builtins.objects.PNone;
57+
import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards;
58+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
59+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectStealingNode;
5760
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetNativeNullNode;
5861
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
5962
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
63+
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
64+
import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode;
6065
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
6166
import com.oracle.graal.python.builtins.objects.ints.PInt;
67+
import com.oracle.graal.python.builtins.objects.list.ListBuiltins;
6268
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListExtendNode;
6369
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListInsertNode;
6470
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListSortNode;
6571
import com.oracle.graal.python.builtins.objects.list.PList;
72+
import com.oracle.graal.python.nodes.ErrorMessages;
73+
import com.oracle.graal.python.nodes.PGuards;
6674
import com.oracle.graal.python.nodes.builtins.ListNodes.AppendNode;
6775
import com.oracle.graal.python.nodes.builtins.TupleNodes.ConstructTupleNode;
6876
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
@@ -78,6 +86,7 @@
7886
import com.oracle.graal.python.util.PythonUtils;
7987
import com.oracle.truffle.api.dsl.Cached;
8088
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
89+
import com.oracle.truffle.api.dsl.ImportStatic;
8190
import com.oracle.truffle.api.dsl.NodeFactory;
8291
import com.oracle.truffle.api.dsl.Specialization;
8392
import com.oracle.truffle.api.dsl.TypeSystemReference;
@@ -97,7 +106,7 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
97106

98107
@Override
99108
public void initialize(Python3Core core) {
100-
super.initialize(core);
109+
super.initialize(core);
101110
}
102111

103112
///////////// list /////////////
@@ -540,4 +549,51 @@ protected boolean isListSubtype(VirtualFrame frame, Object obj, GetClassNode get
540549
return isSubtypeNode.execute(frame, getClassNode.execute(obj), PythonBuiltinClassType.PList);
541550
}
542551
}
552+
553+
@Builtin(name = "PyList_SetItem", minNumOfPositionalArgs = 3)
554+
@GenerateNodeFactory
555+
@ImportStatic(CApiGuards.class)
556+
abstract static class PyListSetItem extends PythonTernaryBuiltinNode {
557+
@Specialization
558+
int doManaged(VirtualFrame frame, PythonNativeWrapper listWrapper, Object position, Object elementWrapper,
559+
@Cached AsPythonObjectNode listWrapperAsPythonObjectNode,
560+
@Cached AsPythonObjectStealingNode elementAsPythonObjectNode,
561+
@Cached("createSetItem()") SequenceStorageNodes.SetItemNode setItemNode,
562+
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
563+
try {
564+
Object delegate = listWrapperAsPythonObjectNode.execute(listWrapper);
565+
if (!PGuards.isList(delegate)) {
566+
throw raise(SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, delegate, delegate);
567+
}
568+
PList list = (PList) delegate;
569+
Object element = elementAsPythonObjectNode.execute(elementWrapper);
570+
setItemNode.execute(frame, list.getSequenceStorage(), position, element);
571+
return 0;
572+
} catch (PException e) {
573+
transformExceptionToNativeNode.execute(frame, e);
574+
return -1;
575+
}
576+
}
577+
578+
protected static SequenceStorageNodes.SetItemNode createSetItem() {
579+
return SequenceStorageNodes.SetItemNode.create(NormalizeIndexNode.forListAssign(), "invalid item for assignment");
580+
}
581+
}
582+
583+
@Builtin(name = "PyList_Reverse", minNumOfPositionalArgs = 1)
584+
@GenerateNodeFactory
585+
abstract static class PyListReverse extends PythonUnaryBuiltinNode {
586+
@Specialization
587+
int reverse(VirtualFrame frame, PList self,
588+
@Cached ListBuiltins.ListReverseNode reverseNode,
589+
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
590+
try {
591+
reverseNode.execute(frame, self);
592+
return 0;
593+
} catch (PException e) {
594+
transformExceptionToNativeNode.execute(frame, e);
595+
return -1;
596+
}
597+
}
598+
}
543599
}

0 commit comments

Comments
 (0)