Author: Ronan Lamy <[email protected]>
Branch:
Changeset: r89647:c515efeff6d1
Date: 2017-01-17 21:18 +0000
http://bitbucket.org/pypy/pypy/changeset/c515efeff6d1/
Log: Use cparser in unicodeobject.py; add support for wchar_t
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
@@ -671,7 +671,7 @@
% (cpyname, ))
build_exported_objects()
-cts = CTypeSpace(headers=['sys/types.h', 'stdarg.h', 'stdio.h'])
+cts = CTypeSpace(headers=['sys/types.h', 'stdarg.h', 'stdio.h', 'stddef.h'])
cts.parse_header(parse_dir / 'cpyext_object.h')
Py_ssize_t = cts.gettype('Py_ssize_t')
diff --git a/pypy/module/cpyext/cparser.py b/pypy/module/cpyext/cparser.py
--- a/pypy/module/cpyext/cparser.py
+++ b/pypy/module/cpyext/cparser.py
@@ -664,6 +664,7 @@
add_inttypes()
CNAME_TO_LLTYPE['int'] = rffi.INT_real
+CNAME_TO_LLTYPE['wchar_t'] = lltype.UniChar
def cname_to_lltype(name):
return CNAME_TO_LLTYPE[name]
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
@@ -5,29 +5,7 @@
extern "C" {
#endif
-
-typedef unsigned int Py_UCS4;
-#ifdef HAVE_USABLE_WCHAR_T
-#define PY_UNICODE_TYPE wchar_t
-#elif Py_UNICODE_SIZE == 4
-#define PY_UNICODE_TYPE Py_UCS4
-#else
-#define PY_UNICODE_TYPE unsigned short
-#endif
-typedef PY_UNICODE_TYPE Py_UNICODE;
-
-#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UNICODE) 0xFFFD)
-
-typedef struct {
- PyObject_HEAD
- Py_UNICODE *str;
- Py_ssize_t length;
- long hash; /* Hash value; -1 if not set */
- PyObject *defenc; /* (Default) Encoded version as Python
- string, or NULL; this is used for
- implementing the buffer protocol */
-} PyUnicodeObject;
-
+#include <cpyext_unicodeobject.h>
#ifdef __cplusplus
}
diff --git a/pypy/module/cpyext/parse/cpyext_unicodeobject.h
b/pypy/module/cpyext/parse/cpyext_unicodeobject.h
new file mode 100644
--- /dev/null
+++ b/pypy/module/cpyext/parse/cpyext_unicodeobject.h
@@ -0,0 +1,16 @@
+typedef unsigned int Py_UCS4;
+/* On PyPy, Py_UNICODE is always wchar_t */
+#define PY_UNICODE_TYPE wchar_t
+typedef PY_UNICODE_TYPE Py_UNICODE;
+
+#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UNICODE) 0xFFFD)
+
+typedef struct {
+ PyObject_HEAD
+ Py_UNICODE *str;
+ Py_ssize_t length;
+ long hash; /* Hash value; -1 if not set */
+ PyObject *defenc; /* (Default) Encoded version as Python
+ string, or NULL; this is used for
+ implementing the buffer protocol */
+} PyUnicodeObject;
diff --git a/pypy/module/cpyext/test/test_cparser.py
b/pypy/module/cpyext/test/test_cparser.py
--- a/pypy/module/cpyext/test/test_cparser.py
+++ b/pypy/module/cpyext/test/test_cparser.py
@@ -190,6 +190,17 @@
assert FUNC.RESULT == cts.gettype('func_t')
assert FUNC.ARGS == (cts.gettype('TestFloatObject *'),)
+def test_wchar_t():
+ cdef = """
+ typedef struct { wchar_t* x; } test;
+ """
+ cts = parse_source(cdef, headers=['stddef.h'])
+ obj = lltype.malloc(cts.gettype('test'), flavor='raw')
+ obj.c_x = cts.cast('wchar_t*', 0)
+ obj.c_x = lltype.nullptr(rffi.CWCHARP.TO)
+ lltype.free(obj, flavor='raw')
+
+
def test_translate_cast():
cdef = "typedef ssize_t Py_ssize_t;"
cts = parse_source(cdef)
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
@@ -3,12 +3,12 @@
from pypy.module.unicodedata import unicodedb
from pypy.module.cpyext.api import (
CANNOT_FAIL, Py_ssize_t, build_type_checkers, cpython_api,
- bootstrap_function, PyObjectFields, cpython_struct, CONST_STRING,
- CONST_WSTRING, slot_function)
+ bootstrap_function, CONST_STRING,
+ CONST_WSTRING, slot_function, cts, parse_dir)
from pypy.module.cpyext.pyerrors import PyErr_BadArgument
from pypy.module.cpyext.pyobject import (
PyObject, PyObjectP, Py_DecRef, make_ref, from_ref, track_reference,
- make_typedescr, get_typedescr, as_pyobj)
+ make_typedescr, get_typedescr)
from pypy.module.cpyext.bytesobject import PyString_Check
from pypy.module.sys.interp_encoding import setdefaultencoding
from pypy.module._codecs.interp_codecs import CodecState
@@ -19,12 +19,9 @@
## See comment in bytesobject.py.
-PyUnicodeObjectStruct = lltype.ForwardReference()
-PyUnicodeObject = lltype.Ptr(PyUnicodeObjectStruct)
-PyUnicodeObjectFields = (PyObjectFields +
- (("str", rffi.CWCHARP), ("length", Py_ssize_t),
- ("hash", rffi.LONG), ("defenc", PyObject)))
-cpython_struct("PyUnicodeObject", PyUnicodeObjectFields, PyUnicodeObjectStruct)
+cts.parse_header(parse_dir / 'cpyext_unicodeobject.h')
+PyUnicodeObject = cts.gettype('PyUnicodeObject*')
+Py_UNICODE = cts.gettype('Py_UNICODE')
@bootstrap_function
def init_unicodeobject(space):
@@ -41,7 +38,6 @@
PyUnicode_Check, PyUnicode_CheckExact = build_type_checkers("Unicode",
"w_unicode")
-Py_UNICODE = lltype.UniChar
def new_empty_unicode(space, length):
"""
@@ -202,7 +198,7 @@
def PyUnicode_GET_DATA_SIZE(space, w_obj):
"""Return the size of the object's internal buffer in bytes. o has to be a
PyUnicodeObject (not checked)."""
- return rffi.sizeof(lltype.UniChar) * PyUnicode_GET_SIZE(space, w_obj)
+ return rffi.sizeof(Py_UNICODE) * PyUnicode_GET_SIZE(space, w_obj)
@cpython_api([rffi.VOIDP], Py_ssize_t, error=CANNOT_FAIL)
def PyUnicode_GET_SIZE(space, w_obj):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit