Skip to content

Commit bfc478e

Browse files
committed
Implement C API function 'PyUnicode_AsUnicodeEscapeString'.
1 parent 2a0a88d commit bfc478e

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
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
@@ -387,3 +387,8 @@ int PyUnicode_Compare(PyObject *left, PyObject *right) {
387387
int _PyUnicode_EqualToASCIIString( PyObject *left, const char *right) {
388388
return UPCALL_CEXT_I(_jls_PyUnicode_Compare, native_to_java(left), polyglot_from_string(right, SRC_CS)) == 0;
389389
}
390+
391+
UPCALL_ID(PyUnicode_AsUnicodeEscapeString);
392+
PyObject * PyUnicode_AsUnicodeEscapeString(PyObject *unicode) {
393+
return UPCALL_CEXT_O(_jls_PyUnicode_AsUnicodeEscapeString, native_to_java(unicode));
394+
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ def _reference_findchar(args):
7070
return string.rfind(char, start, end)
7171

7272

73+
def _reference_unicode_escape(args):
74+
import _codecs
75+
return _codecs.unicode_escape_encode(args[0])[0]
76+
77+
7378
class CustomString(str):
7479
pass
7580

@@ -464,3 +469,15 @@ def compile_module(self, name):
464469
arguments=["PyObject* str", "PyObject* seq"],
465470
cmpfunc=unhandled_error_compare
466471
)
472+
473+
test_PyUnicode_AsUnicodeEscapeString = CPyExtFunction(
474+
_reference_unicode_escape,
475+
lambda: (
476+
("abcd", ),
477+
("öüä", ),
478+
),
479+
resultspec="O",
480+
argspec='O',
481+
arguments=["PyObject* str"],
482+
cmpfunc=unhandled_error_compare
483+
)

graalpython/lib-graalpython/python_cext.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,15 @@ def PyUnicode_Compare(left, right):
661661
return -1
662662
else:
663663
return 1
664+
665+
_codecs_module = None
666+
667+
@may_raise
668+
def PyUnicode_AsUnicodeEscapeString(string):
669+
global _codecs_module
670+
if not _codecs_module:
671+
import _codecs as _codecs_module
672+
return _codecs_module.unicode_escape_encode(string)[0]
664673

665674

666675
##################### CAPSULE

0 commit comments

Comments
 (0)