Skip to content

Commit 167d579

Browse files
committed
Add PyUnicode_Split
1 parent 4f0b7a2 commit 167d579

File tree

3 files changed

+45
-7
lines changed

3 files changed

+45
-7
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,3 +670,8 @@ UPCALL_ID(PyUnicode_Contains)
670670
int PyUnicode_Contains(PyObject *str, PyObject *substr) {
671671
return UPCALL_CEXT_I(_jls_PyUnicode_Contains, native_to_java(str), native_to_java(substr));
672672
}
673+
674+
UPCALL_ID(PyUnicode_Split)
675+
PyObject* PyUnicode_Split(PyObject *s, PyObject *sep, Py_ssize_t maxsplit) {
676+
return UPCALL_CEXT_O(_jls_PyUnicode_Split, native_to_java(s), native_to_java(sep), maxsplit);
677+
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,4 +744,17 @@ def compile_module(self, name):
744744
cmpfunc=unhandled_error_compare
745745
)
746746

747+
test_PyUnicode_Split = CPyExtFunction(
748+
lambda args: args[0].split(args[1], args[2]),
749+
lambda: (
750+
("foo.bar.baz", ".", 0),
751+
("foo.bar.baz", ".", 1),
752+
("foo.bar.baz", 7, 0),
753+
),
754+
resultspec="O",
755+
argspec='OOi',
756+
arguments=["PyObject* string", "PyObject* sep", "Py_ssize_t maxsplit"],
757+
cmpfunc=unhandled_error_compare
758+
)
759+
747760

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

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,13 @@
4545
import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP;
4646
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETITEM__;
4747

48+
import java.nio.ByteBuffer;
49+
import java.nio.CharBuffer;
50+
import java.nio.charset.CharsetDecoder;
51+
import java.nio.charset.CodingErrorAction;
52+
import java.nio.charset.StandardCharsets;
4853
import java.util.List;
54+
4955
import com.oracle.graal.python.builtins.Builtin;
5056
import com.oracle.graal.python.builtins.CoreFunctions;
5157
import com.oracle.graal.python.builtins.Python3Core;
@@ -66,6 +72,7 @@
6672
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
6773
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetNativeNullNode;
6874
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
75+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToNewRefNode;
6976
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
7077
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.GetByteArrayNode;
7178
import com.oracle.graal.python.builtins.objects.ints.PInt;
@@ -110,11 +117,6 @@
110117
import com.oracle.truffle.api.frame.VirtualFrame;
111118
import com.oracle.truffle.api.interop.InteropException;
112119
import com.oracle.truffle.api.profiles.ConditionProfile;
113-
import java.nio.ByteBuffer;
114-
import java.nio.CharBuffer;
115-
import java.nio.charset.CharsetDecoder;
116-
import java.nio.charset.CodingErrorAction;
117-
import java.nio.charset.StandardCharsets;
118120

119121
@CoreFunctions(extendsModule = PythonCextBuiltins.PYTHON_CEXT)
120122
@GenerateNodeFactory
@@ -731,7 +733,7 @@ int doGeneric(Object type, long lindex,
731733
abstract static class PyUnicodeNewNode extends PythonBuiltinNode {
732734
@Specialization
733735
Object doGeneric(Object ptr, int elementSize, int isAscii,
734-
@Cached CExtNodes.ToNewRefNode toNewRefNode) {
736+
@Cached ToNewRefNode toNewRefNode) {
735737
return toNewRefNode.execute(factory().createString(new NativeCharSequence(ptr, elementSize, isAscii != 0)));
736738
}
737739
}
@@ -766,6 +768,24 @@ int contains(VirtualFrame frame, Object haystack, Object needle,
766768
}
767769
}
768770

771+
@Builtin(name = "PyUnicode_Split", minNumOfPositionalArgs = 4, declaresExplicitSelf = true)
772+
@GenerateNodeFactory
773+
abstract static class PyUnicodeSplit extends PythonQuaternaryBuiltinNode {
774+
@Specialization
775+
Object split(VirtualFrame frame, Object module, Object string, Object sep, Object maxsplit,
776+
@Cached StringBuiltins.SplitNode splitNode,
777+
@Cached ToNewRefNode toSulongNode,
778+
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
779+
@Cached GetNativeNullNode getNativeNullNode) {
780+
try {
781+
return toSulongNode.execute(splitNode.execute(frame, string, sep, maxsplit));
782+
} catch (PException e) {
783+
transformExceptionToNativeNode.execute(frame, e);
784+
return getNativeNullNode.execute(module);
785+
}
786+
}
787+
}
788+
769789
@Builtin(name = "_PyUnicode_AsUTF8String", minNumOfPositionalArgs = 3)
770790
@GenerateNodeFactory
771791
abstract static class _PyUnicode_AsUTF8String extends NativeEncoderNode {
@@ -813,7 +833,7 @@ abstract static class PyUnicode_Decode extends NativeBuiltin {
813833
@Specialization
814834
Object doDecode(VirtualFrame frame, Object module, PMemoryView mv, String encoding, String errors,
815835
@Cached CodecsModuleBuiltins.DecodeNode decodeNode,
816-
@Cached CExtNodes.ToNewRefNode toSulongNode,
836+
@Cached ToNewRefNode toSulongNode,
817837
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
818838
@Cached GetNativeNullNode getNativeNullNode) {
819839
try {

0 commit comments

Comments
 (0)