Skip to content

Commit f73eb11

Browse files
committed
Add GraalPySlice_Start/Stop/Step
1 parent b629461 commit f73eb11

File tree

5 files changed

+143
-15
lines changed

5 files changed

+143
-15
lines changed

graalpython/com.oracle.graal.python.cext/include/sliceobject.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2018, 2024, Oracle and/or its affiliates.
1+
/* Copyright (c) 2018, 2025, Oracle and/or its affiliates.
22
* Copyright (C) 1996-2020 Python Software Foundation
33
*
44
* Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
@@ -31,6 +31,11 @@ typedef struct {
3131
} PySliceObject;
3232

3333
// functions introduced by GraalPy as replacements for direct access to the slice struct fields
34+
PyAPI_FUNC(PyObject*) GraalPySlice_Start(PyObject *slice);
35+
PyAPI_FUNC(PyObject*) GraalPySlice_Stop(PyObject *slice);
36+
PyAPI_FUNC(PyObject*) GraalPySlice_Step(PyObject *slice);
37+
38+
// Old versions of the above that return a borrowed reference. To be removed when we no longer have patches using them
3439
PyAPI_FUNC(PyObject*) PySlice_Start(PySliceObject *slice);
3540
PyAPI_FUNC(PyObject*) PySlice_Stop(PySliceObject *slice);
3641
PyAPI_FUNC(PyObject*) PySlice_Step(PySliceObject *slice);

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,8 +743,15 @@ private static Path resolvePath(Path path) {
743743
* These are functions that are introduced by GraalPy, mostly auxiliary functions that we added
744744
* to avoid direct fields accesses:
745745
*/
746-
private static final String[] ADDITIONAL = new String[]{"PyCMethod_GetClass", "PyDescrObject_GetName", "PyDescrObject_GetType", "PyInterpreterState_GetIDFromThreadState",
747-
"PyMethodDescrObject_GetMethod", "PyObject_GetDoc", "PyObject_SetDoc", "PySlice_Start", "PySlice_Step", "PySlice_Stop", "_PyFrame_SetLineNumber",
746+
private static final String[] ADDITIONAL = new String[]{
747+
/*
748+
* These PySlice builtins are deprecated and scheduled for removal once we no
749+
* longer support old versions of Cython that use them. Grep all patches before
750+
* removing
751+
*/
752+
"PySlice_Start", "PySlice_Step", "PySlice_Stop",
753+
"PyCMethod_GetClass", "PyDescrObject_GetName", "PyDescrObject_GetType", "PyInterpreterState_GetIDFromThreadState",
754+
"PyMethodDescrObject_GetMethod", "PyObject_GetDoc", "PyObject_SetDoc", "_PyFrame_SetLineNumber",
748755
"_PyCFunction_GetModule", "_PyCFunction_GetMethodDef", "PyCode_GetName",
749756
"_PyCFunction_SetModule", "_PyCFunction_SetMethodDef",
750757
"PyCode_GetFileName", "_PyArray_Resize", "_PyArray_Data",

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_slice.py

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
1+
# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
22
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
33
#
44
# The Universal Permissive License (UPL), Version 1.0
@@ -36,10 +36,19 @@
3636
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
39+
import sys
3940

4041
from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare
4142

4243

44+
def _reference_get_slice(attr):
45+
def inner(args):
46+
if isinstance(args[0], slice):
47+
return getattr(args[0], attr)
48+
raise TypeError
49+
return inner
50+
51+
4352
class TestPySlice(CPyExtTestCase):
4453

4554
def reference_get_indices(slize, length):
@@ -164,22 +173,68 @@ def reference_adjust(length, start, stop, step):
164173

165174
def reference_new_slice(args):
166175
return slice(args[0], args[1], args[2])
167-
176+
168177
test_PySlice_New = CPyExtFunction(
169178
reference_new_slice,
170179
lambda: (
171-
(1, 2, 3,),
172-
(1, 2, "a",),
173-
(1, 2, None,),
174-
(1, None, None,),
175-
(-1, -1, -1,),
180+
(1, 2, 3,),
181+
(1, 2, "a",),
182+
(1, 2, None,),
183+
(1, None, None,),
184+
(-1, -1, -1,),
176185
("a", "b", "c"),
177-
("a", "b", None),
178-
("a", None, None),
186+
("a", "b", None),
187+
("a", None, None),
179188
(None, None, None),
180189
),
181190
resultspec="O",
182191
argspec='OOO',
183192
arguments=["PyObject* start", "PyObject* stop", "PyObject* step"],
184193
cmpfunc=unhandled_error_compare
185194
)
195+
196+
if sys.implementation.name == 'graalpy':
197+
test_GraalPySlice_Start = CPyExtFunction(
198+
_reference_get_slice('start'),
199+
lambda: (
200+
(slice(1),),
201+
(slice(1, 2, 3),),
202+
(slice(None, 2, 3),),
203+
(slice("a"),),
204+
(tuple(),),
205+
),
206+
resultspec='O',
207+
argspec='O',
208+
arguments=["PyObject* slice"],
209+
cmpfunc=unhandled_error_compare,
210+
)
211+
212+
test_GraalPySlice_Stop = CPyExtFunction(
213+
_reference_get_slice('stop'),
214+
lambda: (
215+
(slice(1),),
216+
(slice(1, 2, 3),),
217+
(slice(None, 2, 3),),
218+
(slice("a"),),
219+
(tuple(),),
220+
),
221+
resultspec='O',
222+
argspec='O',
223+
arguments=["PyObject* slice"],
224+
cmpfunc=unhandled_error_compare,
225+
)
226+
227+
test_GraalPySlice_Step = CPyExtFunction(
228+
_reference_get_slice('step'),
229+
lambda: (
230+
(slice(1),),
231+
(slice(1, 2, 3),),
232+
(slice(None, 2, 3),),
233+
(slice("a"),),
234+
(tuple(),),
235+
),
236+
resultspec='O',
237+
argspec='O',
238+
arguments=["PyObject* slice"],
239+
cmpfunc=unhandled_error_compare,
240+
)

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

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,21 @@
4545
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
4646
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
4747

48+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4849
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
4950
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode;
5051
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode;
52+
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
5153
import com.oracle.graal.python.builtins.objects.PNone;
5254
import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis;
55+
import com.oracle.graal.python.builtins.objects.slice.PIntSlice;
56+
import com.oracle.graal.python.builtins.objects.slice.PObjectSlice;
5357
import com.oracle.graal.python.lib.PySliceNew;
58+
import com.oracle.graal.python.nodes.ErrorMessages;
59+
import com.oracle.graal.python.nodes.PRaiseNode;
5460
import com.oracle.truffle.api.dsl.Bind;
5561
import com.oracle.truffle.api.dsl.Cached;
62+
import com.oracle.truffle.api.dsl.Fallback;
5663
import com.oracle.truffle.api.dsl.Specialization;
5764
import com.oracle.truffle.api.nodes.Node;
5865

@@ -82,4 +89,61 @@ static Object run() {
8289
return PEllipsis.INSTANCE;
8390
}
8491
}
92+
93+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct)
94+
abstract static class GraalPySlice_Start extends CApiUnaryBuiltinNode {
95+
@Specialization
96+
static Object get(PIntSlice slice) {
97+
return slice.getStart();
98+
}
99+
100+
@Specialization
101+
static Object get(PObjectSlice slice) {
102+
return slice.getStart();
103+
}
104+
105+
@Fallback
106+
static Object error(Object slice,
107+
@Bind Node inliningTarget) {
108+
throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_S_NOT_P, "slice", slice);
109+
}
110+
}
111+
112+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct)
113+
abstract static class GraalPySlice_Stop extends CApiUnaryBuiltinNode {
114+
@Specialization
115+
static Object get(PIntSlice slice) {
116+
return slice.getStop();
117+
}
118+
119+
@Specialization
120+
static Object get(PObjectSlice slice) {
121+
return slice.getStop();
122+
}
123+
124+
@Fallback
125+
static Object error(Object slice,
126+
@Bind Node inliningTarget) {
127+
throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_S_NOT_P, "slice", slice);
128+
}
129+
}
130+
131+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct)
132+
abstract static class GraalPySlice_Step extends CApiUnaryBuiltinNode {
133+
@Specialization
134+
static Object get(PIntSlice slice) {
135+
return slice.getStep();
136+
}
137+
138+
@Specialization
139+
static Object get(PObjectSlice slice) {
140+
return slice.getStep();
141+
}
142+
143+
@Fallback
144+
static Object error(Object slice,
145+
@Bind Node inliningTarget) {
146+
throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_S_NOT_P, "slice", slice);
147+
}
148+
}
85149
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,9 +469,6 @@ public final class CApiFunction {
469469
@CApiBuiltin(name = "PySequence_Size", ret = Py_ssize_t, args = {PyObject}, call = CImpl)
470470
@CApiBuiltin(name = "PySequence_Repeat", ret = PyObject, args = {PyObject, Py_ssize_t}, call = CImpl)
471471
@CApiBuiltin(name = "PySlice_AdjustIndices", ret = Py_ssize_t, args = {Py_ssize_t, PY_SSIZE_T_PTR, PY_SSIZE_T_PTR, Py_ssize_t}, call = CImpl)
472-
@CApiBuiltin(name = "PySlice_Start", ret = PyObject, args = {PySliceObject}, call = CImpl)
473-
@CApiBuiltin(name = "PySlice_Step", ret = PyObject, args = {PySliceObject}, call = CImpl)
474-
@CApiBuiltin(name = "PySlice_Stop", ret = PyObject, args = {PySliceObject}, call = CImpl)
475472
@CApiBuiltin(name = "PySlice_Unpack", ret = Int, args = {PyObject, PY_SSIZE_T_PTR, PY_SSIZE_T_PTR, PY_SSIZE_T_PTR}, call = CImpl)
476473
@CApiBuiltin(name = "PyState_AddModule", ret = Int, args = {PyObject, PYMODULEDEF_PTR}, call = CImpl)
477474
@CApiBuiltin(name = "PyState_FindModule", ret = PyObjectBorrowed, args = {PYMODULEDEF_PTR}, call = CImpl)

0 commit comments

Comments
 (0)