Author: Ronan Lamy <[email protected]>
Branch: py3.5
Changeset: r93424:cb9a68d84f56
Date: 2017-12-14 22:09 +0000
http://bitbucket.org/pypy/pypy/changeset/cb9a68d84f56/
Log: Use CPython's C implementation for PyUnicode_FromWideChar (fixes
size==-1 case)
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -550,7 +550,7 @@
'PyArg_ParseTuple', 'PyArg_UnpackTuple', 'PyArg_ParseTupleAndKeywords',
'PyArg_VaParse', 'PyArg_VaParseTupleAndKeywords', '_PyArg_NoKeywords',
'PyUnicode_FromFormat', 'PyUnicode_FromFormatV',
'PyUnicode_AsWideCharString',
- 'PyUnicode_GetSize', 'PyUnicode_GetLength',
+ 'PyUnicode_GetSize', 'PyUnicode_GetLength', 'PyUnicode_FromWideChar',
'PyModule_AddObject', 'PyModule_AddIntConstant',
'PyModule_AddStringConstant',
'PyModule_GetDef', 'PyModuleDef_Init', 'PyModule_GetState',
'Py_BuildValue', 'Py_VaBuildValue', 'PyTuple_Pack',
diff --git a/pypy/module/cpyext/include/unicodeobject.h
b/pypy/module/cpyext/include/unicodeobject.h
--- a/pypy/module/cpyext/include/unicodeobject.h
+++ b/pypy/module/cpyext/include/unicodeobject.h
@@ -20,6 +20,14 @@
/* #define HAVE_WCHAR_H */
/* #define HAVE_USABLE_WCHAR_T */
+#ifdef HAVE_WCHAR_H
+/* Work around a cosmetic bug in BSDI 4.x wchar.h; thanks to Thomas Wouters */
+# ifdef _HAVE_BSDI
+# include <time.h>
+# endif
+# include <wchar.h>
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -270,6 +278,16 @@
#ifdef HAVE_WCHAR_H
+/* Create a Unicode Object from the wchar_t buffer w of the given
+ size.
+
+ The buffer is copied into the new object. */
+
+PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar(
+ const wchar_t *w, /* wchar_t buffer */
+ Py_ssize_t size /* size of buffer */
+ );
+
/* Convert the Unicode object to a wide character string. The output string
always ends with a nul character. If size is not NULL, write the number of
wide characters (excluding the null character) into *size.
diff --git a/pypy/module/cpyext/src/unicodeobject.c
b/pypy/module/cpyext/src/unicodeobject.c
--- a/pypy/module/cpyext/src/unicodeobject.c
+++ b/pypy/module/cpyext/src/unicodeobject.c
@@ -54,6 +54,29 @@
plus 1 for the sign. 53/22 is an upper bound for log10(256). */
#define MAX_LONG_LONG_CHARS (2 + (SIZEOF_LONG_LONG*53-1) / 22)
+#ifdef HAVE_WCHAR_H
+
+PyObject *
+PyUnicode_FromWideChar(const wchar_t *w, Py_ssize_t size)
+{
+ /*
+ if (w == NULL) {
+ if (size == 0)
+ _Py_RETURN_UNICODE_EMPTY();
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ */
+
+ if (size == -1) {
+ size = wcslen(w);
+ }
+
+ return PyUnicode_FromUnicode(w, size);
+}
+
+#endif /* HAVE_WCHAR_H */
+
PyObject *
PyUnicode_FromFormatV(const char *format, va_list vargs)
{
diff --git a/pypy/module/cpyext/unicodeobject.py
b/pypy/module/cpyext/unicodeobject.py
--- a/pypy/module/cpyext/unicodeobject.py
+++ b/pypy/module/cpyext/unicodeobject.py
@@ -475,13 +475,6 @@
else:
return new_empty_unicode(space, length)
-@cpython_api([CONST_WSTRING, Py_ssize_t], PyObject, result_is_ll=True)
-def PyUnicode_FromWideChar(space, wchar_p, length):
- """Create a Unicode object from the wchar_t buffer w of the given size.
- Return NULL on failure."""
- # PyPy supposes Py_UNICODE == wchar_t
- return PyUnicode_FromUnicode(space, wchar_p, length)
-
@cpython_api([PyObject, CONST_STRING], PyObject)
def _PyUnicode_AsDefaultEncodedString(space, w_unicode, errors):
return PyUnicode_AsEncodedString(space, w_unicode,
lltype.nullptr(rffi.CCHARP.TO), errors)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit