Skip to content

Commit aa82894

Browse files
committed
add PySequence_Index, PySequence_Count, PySequence_DelSlice, PySequence_SetSlice
1 parent f1aa9d2 commit aa82894

File tree

9 files changed

+1131
-934
lines changed

9 files changed

+1131
-934
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2029,10 +2029,18 @@ PyAPI_FUNC(PyObject*) PySequence_Concat(PyObject* a, PyObject* b) {
20292029
PyAPI_FUNC(int) PySequence_Contains(PyObject* a, PyObject* b) {
20302030
return GraalPySequence_Contains(a, b);
20312031
}
2032+
#undef PySequence_Count
2033+
PyAPI_FUNC(Py_ssize_t) PySequence_Count(PyObject* a, PyObject* b) {
2034+
return GraalPySequence_Count(a, b);
2035+
}
20322036
#undef PySequence_DelItem
20332037
PyAPI_FUNC(int) PySequence_DelItem(PyObject* a, Py_ssize_t b) {
20342038
return GraalPySequence_DelItem(a, b);
20352039
}
2040+
#undef PySequence_DelSlice
2041+
PyAPI_FUNC(int) PySequence_DelSlice(PyObject* a, Py_ssize_t b, Py_ssize_t c) {
2042+
return GraalPySequence_DelSlice(a, b, c);
2043+
}
20362044
#undef PySequence_GetItem
20372045
PyAPI_FUNC(PyObject*) PySequence_GetItem(PyObject* a, Py_ssize_t b) {
20382046
return GraalPySequence_GetItem(a, b);
@@ -2049,6 +2057,10 @@ PyAPI_FUNC(PyObject*) PySequence_InPlaceConcat(PyObject* a, PyObject* b) {
20492057
PyAPI_FUNC(PyObject*) PySequence_InPlaceRepeat(PyObject* a, Py_ssize_t b) {
20502058
return GraalPySequence_InPlaceRepeat(a, b);
20512059
}
2060+
#undef PySequence_Index
2061+
PyAPI_FUNC(Py_ssize_t) PySequence_Index(PyObject* a, PyObject* b) {
2062+
return GraalPySequence_Index(a, b);
2063+
}
20522064
#undef PySequence_Length
20532065
PyAPI_FUNC(Py_ssize_t) PySequence_Length(PyObject* a) {
20542066
return GraalPySequence_Length(a);
@@ -2065,6 +2077,10 @@ PyAPI_FUNC(PyObject*) PySequence_Repeat(PyObject* a, Py_ssize_t b) {
20652077
PyAPI_FUNC(int) PySequence_SetItem(PyObject* a, Py_ssize_t b, PyObject* c) {
20662078
return GraalPySequence_SetItem(a, b, c);
20672079
}
2080+
#undef PySequence_SetSlice
2081+
PyAPI_FUNC(int) PySequence_SetSlice(PyObject* a, Py_ssize_t b, Py_ssize_t c, PyObject* d) {
2082+
return GraalPySequence_SetSlice(a, b, c, d);
2083+
}
20682084
#undef PySequence_Size
20692085
PyAPI_FUNC(Py_ssize_t) PySequence_Size(PyObject* a) {
20702086
return GraalPySequence_Size(a);

graalpython/com.oracle.graal.python.cext/src/capi.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,15 +245,19 @@ typedef struct {
245245
BUILTIN(PySequence_Check, int, PyObject*) \
246246
BUILTIN(PySequence_Concat, PyObject*, PyObject*, PyObject*) \
247247
BUILTIN(PySequence_Contains, int, PyObject*, PyObject*) \
248+
BUILTIN(PySequence_Count, Py_ssize_t, PyObject*, PyObject*) \
248249
BUILTIN(PySequence_DelItem, int, PyObject*, Py_ssize_t) \
250+
BUILTIN(PySequence_DelSlice, int, PyObject*, Py_ssize_t, Py_ssize_t) \
249251
BUILTIN(PySequence_GetItem, PyObject*, PyObject*, Py_ssize_t) \
250252
BUILTIN(PySequence_GetSlice, PyObject*, PyObject*, Py_ssize_t, Py_ssize_t) \
251253
BUILTIN(PySequence_InPlaceConcat, PyObject*, PyObject*, PyObject*) \
252254
BUILTIN(PySequence_InPlaceRepeat, PyObject*, PyObject*, Py_ssize_t) \
255+
BUILTIN(PySequence_Index, Py_ssize_t, PyObject*, PyObject*) \
253256
BUILTIN(PySequence_Length, Py_ssize_t, PyObject*) \
254257
BUILTIN(PySequence_List, PyObject*, PyObject*) \
255258
BUILTIN(PySequence_Repeat, PyObject*, PyObject*, Py_ssize_t) \
256259
BUILTIN(PySequence_SetItem, int, PyObject*, Py_ssize_t, PyObject*) \
260+
BUILTIN(PySequence_SetSlice, int, PyObject*, Py_ssize_t, Py_ssize_t, PyObject*) \
257261
BUILTIN(PySequence_Size, Py_ssize_t, PyObject*) \
258262
BUILTIN(PySequence_Tuple, PyObject*, PyObject*) \
259263
BUILTIN(PySet_Add, int, PyObject*, PyObject*) \

graalpython/com.oracle.graal.python.jni/src/capi_forwards.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3530,14 +3530,16 @@ PyAPI_FUNC(int) PySequence_Contains(PyObject* a, PyObject* b) {
35303530
return result;
35313531
}
35323532
PyAPI_FUNC(Py_ssize_t) PySequence_Count(PyObject* a, PyObject* b) {
3533-
unimplemented("PySequence_Count"); exit(-1);
3533+
Py_ssize_t result = (Py_ssize_t) GraalPySequence_Count(a, b);
3534+
return result;
35343535
}
35353536
PyAPI_FUNC(int) PySequence_DelItem(PyObject* a, Py_ssize_t b) {
35363537
int result = (int) GraalPySequence_DelItem(a, b);
35373538
return result;
35383539
}
35393540
PyAPI_FUNC(int) PySequence_DelSlice(PyObject* a, Py_ssize_t b, Py_ssize_t c) {
3540-
unimplemented("PySequence_DelSlice"); exit(-1);
3541+
int result = (int) GraalPySequence_DelSlice(a, b, c);
3542+
return result;
35413543
}
35423544
PyObject* (*__target__PySequence_Fast)(PyObject*, const char*) = NULL;
35433545
PyAPI_FUNC(PyObject*) PySequence_Fast(PyObject* a, const char* b) {
@@ -3564,7 +3566,8 @@ PyAPI_FUNC(PyObject*) PySequence_InPlaceRepeat(PyObject* a, Py_ssize_t b) {
35643566
return result;
35653567
}
35663568
PyAPI_FUNC(Py_ssize_t) PySequence_Index(PyObject* a, PyObject* b) {
3567-
unimplemented("PySequence_Index"); exit(-1);
3569+
Py_ssize_t result = (Py_ssize_t) GraalPySequence_Index(a, b);
3570+
return result;
35683571
}
35693572
PyAPI_FUNC(Py_ssize_t) PySequence_Length(PyObject* a) {
35703573
Py_ssize_t result = (Py_ssize_t) GraalPySequence_Length(a);
@@ -3583,7 +3586,8 @@ PyAPI_FUNC(int) PySequence_SetItem(PyObject* a, Py_ssize_t b, PyObject* c) {
35833586
return result;
35843587
}
35853588
PyAPI_FUNC(int) PySequence_SetSlice(PyObject* a, Py_ssize_t b, Py_ssize_t c, PyObject* d) {
3586-
unimplemented("PySequence_SetSlice"); exit(-1);
3589+
int result = (int) GraalPySequence_SetSlice(a, b, c, d);
3590+
return result;
35873591
}
35883592
PyAPI_FUNC(Py_ssize_t) PySequence_Size(PyObject* a) {
35893593
Py_ssize_t result = (Py_ssize_t) GraalPySequence_Size(a);

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

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import com.oracle.graal.python.builtins.modules.BuiltinFunctions.OctNode;
8080
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode;
8181
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
82+
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiQuaternaryBuiltinNode;
8283
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode;
8384
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
8485
import com.oracle.graal.python.builtins.modules.cext.PythonCextErrBuiltins.PyErr_Restore;
@@ -112,12 +113,15 @@
112113
import com.oracle.graal.python.lib.PyObjectLookupAttr;
113114
import com.oracle.graal.python.lib.PyObjectSizeNode;
114115
import com.oracle.graal.python.lib.PySequenceCheckNode;
116+
import com.oracle.graal.python.lib.PySequenceContainsNode;
117+
import com.oracle.graal.python.lib.PySequenceIterSearchNode;
115118
import com.oracle.graal.python.lib.PySliceNew;
116119
import com.oracle.graal.python.nodes.ErrorMessages;
117120
import com.oracle.graal.python.nodes.attributes.WriteAttributeToDynamicObjectNode;
118121
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
119122
import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode;
120123
import com.oracle.graal.python.nodes.call.CallNode;
124+
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
121125
import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode;
122126
import com.oracle.graal.python.nodes.expression.BinaryArithmetic;
123127
import com.oracle.graal.python.nodes.expression.BinaryArithmetic.MulNode;
@@ -536,8 +540,8 @@ abstract static class PySequence_Contains extends CApiBinaryBuiltinNode {
536540

537541
@Specialization
538542
static int contains(Object haystack, Object needle,
539-
@Cached ContainsNode containsNode) {
540-
return PInt.intValue((boolean) containsNode.executeObject(null, needle, haystack));
543+
@Cached PySequenceContainsNode containsNode) {
544+
return PInt.intValue(containsNode.execute(haystack, needle));
541545
}
542546
}
543547

@@ -703,6 +707,48 @@ Object doNative(Object obj,
703707
}
704708
}
705709

710+
@CApiBuiltin(ret = Int, args = {PyObject, Py_ssize_t, Py_ssize_t, PyObject}, call = Direct)
711+
abstract static class PySequence_SetSlice extends CApiQuaternaryBuiltinNode {
712+
@Specialization
713+
static int setSlice(Object sequence, Object iLow, Object iHigh, Object s,
714+
@Cached("create(SetItem)") LookupAndCallTernaryNode setItemNode,
715+
@Cached PySliceNew sliceNode) {
716+
setItemNode.execute(null, sequence, sliceNode.execute(iLow, iHigh, PNone.NONE), s);
717+
return 0;
718+
}
719+
}
720+
721+
@CApiBuiltin(ret = Int, args = {PyObject, Py_ssize_t, Py_ssize_t}, call = Direct)
722+
abstract static class PySequence_DelSlice extends CApiTernaryBuiltinNode {
723+
@Specialization
724+
static int setSlice(Object sequence, Object iLow, Object iHigh,
725+
@Cached("create(DelItem)") LookupAndCallBinaryNode delItemNode,
726+
@Cached PySliceNew sliceNode) {
727+
delItemNode.executeObject(null, sequence, sliceNode.execute(iLow, iHigh, PNone.NONE));
728+
return 0;
729+
}
730+
}
731+
732+
@CApiBuiltin(ret = Py_ssize_t, args = {PyObject, PyObject}, call = Direct)
733+
abstract static class PySequence_Count extends CApiBinaryBuiltinNode {
734+
735+
@Specialization
736+
static int contains(Object haystack, Object needle,
737+
@Cached PySequenceIterSearchNode searchNode) {
738+
return searchNode.execute(haystack, needle, PySequenceIterSearchNode.PY_ITERSEARCH_COUNT);
739+
}
740+
}
741+
742+
@CApiBuiltin(ret = Py_ssize_t, args = {PyObject, PyObject}, call = Direct)
743+
abstract static class PySequence_Index extends CApiBinaryBuiltinNode {
744+
745+
@Specialization
746+
static int contains(Object haystack, Object needle,
747+
@Cached PySequenceIterSearchNode searchNode) {
748+
return searchNode.execute(haystack, needle, PySequenceIterSearchNode.PY_ITERSEARCH_INDEX);
749+
}
750+
}
751+
706752
/////// PyObject ///////
707753

708754
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Direct)

0 commit comments

Comments
 (0)