Skip to content

Commit a5374e5

Browse files
committed
[GR-67431] Add support for PyUnicode_FSDecoder
PullRequest: graalpython/3897
2 parents 411099e + a22c599 commit a5374e5

File tree

6 files changed

+54
-10
lines changed

6 files changed

+54
-10
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3719,7 +3719,6 @@ PyUnicode_FSConverter(PyObject* arg, void* addr)
37193719
}
37203720

37213721

3722-
#if 0 // GraalPy change
37233722
int
37243723
PyUnicode_FSDecoder(PyObject* arg, void* addr)
37253724
{
@@ -3729,6 +3728,7 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
37293728
return 1;
37303729
}
37313730

3731+
#if 0 // GraalPy change: 'findchar' not supported
37323732
PyObject *path = PyOS_FSPath(arg);
37333733
if (path == NULL) {
37343734
return 0;
@@ -3760,11 +3760,19 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
37603760
Py_DECREF(output);
37613761
return 0;
37623762
}
3763+
#else // GraalPy change: different implementation
3764+
PyObject *output = NULL;
3765+
output = GraalPyTruffleUnicode_FSDecoder(arg);
3766+
if (!output) {
3767+
return 0;
3768+
}
3769+
#endif // GraalPy change
37633770
*(PyObject**)addr = output;
37643771
return Py_CLEANUP_SUPPORTED;
37653772
}
37663773

37673774

3775+
#if 0 // GraalPy change
37683776
static int unicode_fill_utf8(PyObject *unicode);
37693777
#endif // GraalPy change
37703778

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,13 @@
4040
import locale
4141
import re
4242
import sys
43+
import os
4344
import unittest
4445

4546
from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare, GRAALPYTHON, CPyExtFunctionOutVars, \
4647
is_native_object
4748

49+
from test.support import os_helper
4850

4951
def _reference_fromobject(args):
5052
if isinstance(args[0], str):
@@ -1056,6 +1058,27 @@ class TestPyUnicode(CPyExtTestCase):
10561058
arguments=["const char* encoding", "const char* object", "Py_ssize_t length", "Py_ssize_t start", "Py_ssize_t end", "const char* reason"]
10571059
)
10581060

1061+
test_PyUnicode_FSDecoder = CPyExtFunction(
1062+
lambda args: str(args[0]),
1063+
lambda: (
1064+
(os.path.realpath(os_helper.TESTFN),),
1065+
),
1066+
code='''PyObject* wrap_PyUnicode_FSDecoder(PyObject* path) {
1067+
PyObject* res;
1068+
int ret = PyUnicode_FSDecoder(path, &res);
1069+
if (ret <= 0 && PyErr_Occurred()) {
1070+
return NULL;
1071+
}
1072+
return res;
1073+
}
1074+
''',
1075+
resultspec="O",
1076+
argspec='O',
1077+
arguments=["PyObject* path"],
1078+
callfunction="wrap_PyUnicode_FSDecoder",
1079+
cmpfunc=unhandled_error_compare
1080+
)
1081+
10591082

10601083
class TestUnicodeObject(unittest.TestCase):
10611084
def test_intern(self):

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.
1717
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_func_exec_on_worker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
1818
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_pickle_on_worker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
1919
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_unpickle_in_result_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
20-
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_gh105829_should_not_deadlock_if_wakeup_pipe_full @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
21-
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_shutdown_deadlock_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
22-
test.test_concurrent_futures.test_future.FutureTests.test_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
23-
test.test_concurrent_futures.test_future.FutureTests.test_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
20+
# Transiently times out GR-65714
21+
!test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_gh105829_should_not_deadlock_if_wakeup_pipe_full @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
22+
!test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_shutdown_deadlock_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
23+
!test.test_concurrent_futures.test_future.FutureTests.test_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
24+
!test.test_concurrent_futures.test_future.FutureTests.test_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
2425
test.test_concurrent_futures.test_future.FutureTests.test_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
2526
test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64
2627
test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_failed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_concurrent_futures.txt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.
1717
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_func_exec_on_worker @ linux-x86_64
1818
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_pickle_on_worker @ linux-x86_64
1919
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_unpickle_in_result_handler @ linux-x86_64
20-
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_gh105829_should_not_deadlock_if_wakeup_pipe_full @ linux-x86_64
21-
test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_shutdown_deadlock_pickle @ linux-x86_64
22-
test.test_concurrent_futures.test_future.FutureTests.test_cancel @ linux-x86_64
23-
test.test_concurrent_futures.test_future.FutureTests.test_cancelled @ linux-x86_64
20+
# Transiently times out GR-65714
21+
!test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_gh105829_should_not_deadlock_if_wakeup_pipe_full @ linux-x86_64
22+
!test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_shutdown_deadlock_pickle @ linux-x86_64
23+
!test.test_concurrent_futures.test_future.FutureTests.test_cancel @ linux-x86_64
24+
!test.test_concurrent_futures.test_future.FutureTests.test_cancelled @ linux-x86_64
2425
test.test_concurrent_futures.test_future.FutureTests.test_done @ linux-x86_64
2526
test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_cancelled @ linux-x86_64
2627
test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_failed @ linux-x86_64

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
import com.oracle.graal.python.lib.PySliceNew;
145145
import com.oracle.graal.python.lib.PyTupleGetItem;
146146
import com.oracle.graal.python.lib.PyUnicodeCheckExactNode;
147+
import com.oracle.graal.python.lib.PyUnicodeFSDecoderNode;
147148
import com.oracle.graal.python.lib.PyUnicodeFromEncodedObject;
148149
import com.oracle.graal.python.lib.RichCmpOp;
149150
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -880,6 +881,16 @@ static Object doManaged(Object ptr, long byteLength, int kind,
880881
}
881882
}
882883

884+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Ignored)
885+
abstract static class PyTruffleUnicode_FSDecoder extends CApiUnaryBuiltinNode {
886+
887+
@Specialization
888+
static Object fsDecoder(Object arg,
889+
@Cached PyUnicodeFSDecoderNode fsDecoderNode) {
890+
return fsDecoderNode.execute(null, arg);
891+
}
892+
}
893+
883894
@CApiBuiltin(ret = PyObjectTransfer, args = {Pointer, Py_ssize_t, Int}, call = Ignored)
884895
abstract static class PyTruffleUnicode_FromUTF extends CApiTernaryBuiltinNode {
885896

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -974,7 +974,7 @@ public final class CApiFunction {
974974
@CApiBuiltin(name = "PyUnicode_DecodeUTF7", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString}, call = NotImplemented)
975975
@CApiBuiltin(name = "PyUnicode_DecodeUTF7Stateful", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString, PY_SSIZE_T_PTR}, call = NotImplemented)
976976
@CApiBuiltin(name = "PyUnicode_DecodeUnicodeEscape", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString}, call = NotImplemented)
977-
@CApiBuiltin(name = "PyUnicode_FSDecoder", ret = Int, args = {PyObject, Pointer}, call = NotImplemented)
977+
@CApiBuiltin(name = "PyUnicode_FSDecoder", ret = Int, args = {PyObject, Pointer}, call = CImpl)
978978
@CApiBuiltin(name = "PyUnicode_Fill", ret = Py_ssize_t, args = {PyObject, Py_ssize_t, Py_ssize_t, PY_UCS4}, call = CImpl)
979979
@CApiBuiltin(name = "PyUnicode_GetDefaultEncoding", ret = ConstCharPtrAsTruffleString, args = {}, call = CImpl)
980980
@CApiBuiltin(name = "PyUnicode_IsIdentifier", ret = Int, args = {PyObject}, call = NotImplemented)

0 commit comments

Comments
 (0)