Author: Ronan Lamy <ronan.l...@gmail.com> Branch: py3.5 Changeset: r89652:bf8056bf0d0b Date: 2017-01-18 02:32 +0000 http://bitbucket.org/pypy/pypy/changeset/bf8056bf0d0b/
Log: hg merge default diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -662,6 +662,11 @@ def setup_builtin_modules(self): "NOT_RPYTHON: only for initializing the space." + if self.config.objspace.usemodules.cpyext: + # Special-case this to have state.install_dll() called early, which + # is required to initialise sys on Windows. + from pypy.module.cpyext.state import State + self.fromcache(State).build_api() self.getbuiltinmodule('sys') self.getbuiltinmodule('_imp') self.getbuiltinmodule('_frozen_importlib') diff --git a/pypy/module/cppyy/src/clingcwrapper.cxx b/pypy/module/cppyy/src/clingcwrapper.cxx --- a/pypy/module/cppyy/src/clingcwrapper.cxx +++ b/pypy/module/cppyy/src/clingcwrapper.cxx @@ -522,7 +522,7 @@ if ( FastCall( method, args, self, (void*)cppresult ) ) { cstr = cppstring_to_cstring( *cppresult ); *length = cppresult->size(); - cppresult->std::string::~string(); + cppresult->std::string::~basic_string(); } else *length = 0; free( (void*)cppresult ); @@ -712,7 +712,7 @@ msg << "failed offset calculation between " << cb->GetName() << " and " << cd->GetName(); // TODO: propagate this warning to caller w/o use of Python C-API // PyErr_Warn( PyExc_RuntimeWarning, const_cast<char*>( msg.str().c_str() ) ); - std::cerr << "Warning: " << msg << '\n'; + std::cerr << "Warning: " << msg.str() << '\n'; } // return -1 to signal caller NOT to apply offset diff --git a/pypy/module/cpyext/__init__.py b/pypy/module/cpyext/__init__.py --- a/pypy/module/cpyext/__init__.py +++ b/pypy/module/cpyext/__init__.py @@ -12,11 +12,6 @@ atexit_funcs = [] - def setup_after_space_initialization(self): - state = self.space.fromcache(State) - state.setup_rawrefcount() - state.build_api() - def startup(self, space): space.fromcache(State).startup(space) method = pypy.module.cpyext.typeobject.get_new_method_def(space) 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 @@ -674,7 +674,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 @@ -1,3 +1,4 @@ +import sys from collections import OrderedDict from cffi import api, model from cffi.commontypes import COMMON_TYPES, resolve_common_type @@ -664,6 +665,9 @@ add_inttypes() CNAME_TO_LLTYPE['int'] = rffi.INT_real +CNAME_TO_LLTYPE['wchar_t'] = lltype.UniChar +if 'ssize_t' not in CNAME_TO_LLTYPE: # on Windows + CNAME_TO_LLTYPE['ssize_t'] = CNAME_TO_LLTYPE['long'] def cname_to_lltype(name): return CNAME_TO_LLTYPE[name] @@ -772,8 +776,13 @@ for hdr in x.headers: if hdr not in all_headers: all_headers.append(hdr) + if sys.platform == 'win32': + compile_extra = ['-Dssize_t=long'] + else: + compile_extra = [] return ExternalCompilationInfo( - post_include_bits=all_sources, includes=all_headers) + post_include_bits=all_sources, includes=all_headers, + compile_extra=compile_extra) def configure_types(self): for name, (obj, quals) in self.ctx._declarations.iteritems(): diff --git a/pypy/module/cpyext/include/Python.h b/pypy/module/cpyext/include/Python.h --- a/pypy/module/cpyext/include/Python.h +++ b/pypy/module/cpyext/include/Python.h @@ -57,13 +57,6 @@ #endif #include <stdlib.h> -#ifndef _WIN32 -typedef intptr_t Py_ssize_t; -#else -typedef long Py_ssize_t; -#endif -#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) -#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) #define Py_USING_UNICODE diff --git a/pypy/module/cpyext/include/object.h b/pypy/module/cpyext/include/object.h --- a/pypy/module/cpyext/include/object.h +++ b/pypy/module/cpyext/include/object.h @@ -7,10 +7,20 @@ extern "C" { #endif +/* Hack: MSVC doesn't support ssize_t */ +#ifdef _WIN32 +#define ssize_t long +#endif +#include <cpyext_object.h> +#ifdef _WIN32 +#undef ssize_t +#endif + +#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) +#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) + #define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None -#include <cpyext_object.h> - /* CPython has this for backwards compatibility with really old extensions, and now we have it for compatibility with CPython. @@ -78,7 +88,6 @@ #define Py_GT 4 #define Py_GE 5 - /* Py3k buffer interface, adapted for PyPy */ /* Flags for getting buffers */ #define PyBUF_SIMPLE 0 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,26 +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 *buffer; - Py_ssize_t length; - char *utf8buffer; -} PyUnicodeObject; - +#include <cpyext_unicodeobject.h> PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV(const char *format, va_list vargs); PyAPI_FUNC(PyObject *) PyUnicode_FromFormat(const char *format, ...); 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,13 @@ +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 *buffer; + Py_ssize_t length; + char *utf8buffer; +} PyUnicodeObject; diff --git a/pypy/module/cpyext/state.py b/pypy/module/cpyext/state.py --- a/pypy/module/cpyext/state.py +++ b/pypy/module/cpyext/state.py @@ -83,6 +83,7 @@ This function is called when at object space creation, and drives the compilation of the cpyext library """ + self.setup_rawrefcount() from pypy.module.cpyext import api if not self.space.config.translating: self.api_lib = str(api.build_bridge(self.space)) 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,8 +3,8 @@ 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, Py_CLEANUP_SUPPORTED, slot_function) + bootstrap_function, CONST_STRING, + CONST_WSTRING, Py_CLEANUP_SUPPORTED, 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, @@ -18,12 +18,9 @@ ## See comment in bytesobject.py. -PyUnicodeObjectStruct = lltype.ForwardReference() -PyUnicodeObject = lltype.Ptr(PyUnicodeObjectStruct) -PyUnicodeObjectFields = (PyObjectFields + - (("buffer", rffi.CWCHARP), ("length", Py_ssize_t), - ("utf8buffer", rffi.CCHARP))) -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): @@ -40,7 +37,6 @@ PyUnicode_Check, PyUnicode_CheckExact = build_type_checkers("Unicode", "w_unicode") -Py_UNICODE = lltype.UniChar def new_empty_unicode(space, length): """ @@ -195,7 +191,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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit