Author: Matti Picus <matti.pi...@gmail.com> Branch: PyTuple_Type-subclass Changeset: r85352:ea8fefb608c9 Date: 2016-06-23 17:30 +0300 http://bitbucket.org/pypy/pypy/changeset/ea8fefb608c9/
Log: merge default into branch diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst --- a/pypy/doc/whatsnew-head.rst +++ b/pypy/doc/whatsnew-head.rst @@ -42,3 +42,9 @@ Allow rw access to the char* returned from PyString_AS_STRING, also refactor PyStringObject to look like cpython's and allow subclassing PyString_Type and PyUnicode_Type + +.. branch: save_socket_errno + +Bug fix: if ``socket.socket()`` failed, the ``socket.error`` did not show +the errno of the failing system call, but instead some random previous +errno. 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 @@ -800,6 +800,21 @@ pypy_debug_catch_fatal_exception() assert False +def _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto, tid): + from rpython.rlib import rgil + # see "Handling of the GIL" above + assert cpyext_glob_tid_ptr[0] == 0 + if pygilstate_release: + from pypy.module.cpyext import pystate + unlock = (gilstate == pystate.PyGILState_UNLOCKED) + else: + unlock = gil_release or _gil_auto + if unlock: + rgil.release() + else: + cpyext_glob_tid_ptr[0] = tid + + def make_wrapper_second_level(space, argtypesw, restype, result_kind, error_value, gil): from rpython.rlib import rgil @@ -827,6 +842,7 @@ def wrapper_second_level(callable, pname, *args): from pypy.module.cpyext.pyobject import make_ref, from_ref, is_pyobj from pypy.module.cpyext.pyobject import as_pyobj + from pypy.module.cpyext import pystate # we hope that malloc removal removes the newtuple() that is # inserted exactly here by the varargs specializer @@ -839,7 +855,6 @@ rgil.acquire() assert cpyext_glob_tid_ptr[0] == 0 elif pygilstate_ensure: - from pypy.module.cpyext import pystate if cpyext_glob_tid_ptr[0] == tid: cpyext_glob_tid_ptr[0] = 0 args += (pystate.PyGILState_LOCKED,) @@ -850,6 +865,10 @@ if cpyext_glob_tid_ptr[0] != tid: no_gil_error(pname) cpyext_glob_tid_ptr[0] = 0 + if pygilstate_release: + gilstate = rffi.cast(lltype.Signed, args[-1]) + else: + gilstate = pystate.PyGILState_IGNORE rffi.stackcounter.stacks_counter += 1 llop.gc_stack_bottom(lltype.Void) # marker for trackgcroot.py @@ -919,24 +938,13 @@ except Exception as e: unexpected_exception(pname, e, tb) + _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto, tid) return fatal_value assert lltype.typeOf(retval) == restype rffi.stackcounter.stacks_counter -= 1 - # see "Handling of the GIL" above - assert cpyext_glob_tid_ptr[0] == 0 - if pygilstate_release: - from pypy.module.cpyext import pystate - arg = rffi.cast(lltype.Signed, args[-1]) - unlock = (arg == pystate.PyGILState_UNLOCKED) - else: - unlock = gil_release or _gil_auto - if unlock: - rgil.release() - else: - cpyext_glob_tid_ptr[0] = tid - + _restore_gil_state(pygilstate_release, gilstate, gil_release, _gil_auto, tid) return retval wrapper_second_level._dont_inline_ = True diff --git a/pypy/module/cpyext/pystate.py b/pypy/module/cpyext/pystate.py --- a/pypy/module/cpyext/pystate.py +++ b/pypy/module/cpyext/pystate.py @@ -207,6 +207,7 @@ PyGILState_STATE = rffi.INT PyGILState_LOCKED = 0 PyGILState_UNLOCKED = 1 +PyGILState_IGNORE = 2 ExecutionContext.cpyext_gilstate_counter_noleave = 0 diff --git a/pypy/module/cpyext/test/conftest.py b/pypy/module/cpyext/test/conftest.py --- a/pypy/module/cpyext/test/conftest.py +++ b/pypy/module/cpyext/test/conftest.py @@ -1,4 +1,4 @@ -import py +import os import pytest def pytest_configure(config): @@ -21,3 +21,14 @@ def pytest_funcarg__api(request): return request.cls.api +if os.name == 'nt': + @pytest.yield_fixture(autouse=True, scope='session') + def prevent_dialog_box(): + """Do not open dreaded dialog box on segfault on Windows""" + import ctypes + SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN + old_err_mode = ctypes.windll.kernel32.GetErrorMode() + new_err_mode = old_err_mode | SEM_NOGPFAULTERRORBOX + ctypes.windll.kernel32.SetErrorMode(new_err_mode) + yield + ctypes.windll.kernel32.SetErrorMode(old_err_mode) diff --git a/pypy/module/cpyext/test/support.py b/pypy/module/cpyext/test/support.py new file mode 100644 --- /dev/null +++ b/pypy/module/cpyext/test/support.py @@ -0,0 +1,68 @@ +import os +import py +from sys import platform + +if os.name != 'nt': + so_ext = 'so' +else: + so_ext = 'dll' + +def c_compile(cfilenames, outputfilename, + compile_extra=None, link_extra=None, + include_dirs=None, libraries=None, library_dirs=None): + compile_extra = compile_extra or [] + link_extra = link_extra or [] + include_dirs = include_dirs or [] + libraries = libraries or [] + library_dirs = library_dirs or [] + if platform == 'win32': + link_extra = link_extra + ['/DEBUG'] # generate .pdb file + if platform == 'darwin': + # support Fink & Darwinports + for s in ('/sw/', '/opt/local/'): + if (s + 'include' not in include_dirs + and os.path.exists(s + 'include')): + include_dirs.append(s + 'include') + if s + 'lib' not in library_dirs and os.path.exists(s + 'lib'): + library_dirs.append(s + 'lib') + + outputfilename = py.path.local(outputfilename).new(ext=so_ext) + saved_environ = os.environ.copy() + try: + _build( + cfilenames, outputfilename, + compile_extra, link_extra, + include_dirs, libraries, library_dirs) + finally: + # workaround for a distutils bugs where some env vars can + # become longer and longer every time it is used + for key, value in saved_environ.items(): + if os.environ.get(key) != value: + os.environ[key] = value + return outputfilename + +def _build(cfilenames, outputfilename, compile_extra, link_extra, + include_dirs, libraries, library_dirs): + from distutils.ccompiler import new_compiler + from distutils import sysconfig + compiler = new_compiler(force=1) + sysconfig.customize_compiler(compiler) # XXX + objects = [] + for cfile in cfilenames: + cfile = py.path.local(cfile) + old = cfile.dirpath().chdir() + try: + res = compiler.compile([cfile.basename], + include_dirs=include_dirs, extra_preargs=compile_extra) + assert len(res) == 1 + cobjfile = py.path.local(res[0]) + assert cobjfile.check() + objects.append(str(cobjfile)) + finally: + old.chdir() + + compiler.link_shared_object( + objects, str(outputfilename), + libraries=libraries, + extra_preargs=link_extra, + library_dirs=library_dirs) diff --git a/pypy/module/cpyext/test/test_bytearrayobject.py b/pypy/module/cpyext/test/test_bytearrayobject.py --- a/pypy/module/cpyext/test/test_bytearrayobject.py +++ b/pypy/module/cpyext/test/test_bytearrayobject.py @@ -1,5 +1,6 @@ from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase + class AppTestStringObject(AppTestCpythonExtensionBase): def test_basic(self): module = self.import_extension('foo', [ @@ -31,7 +32,7 @@ if(s->ob_type->tp_basicsize != expected_size) { printf("tp_basicsize==%ld\\n", - (long)s->ob_type->tp_basicsize); + (long)s->ob_type->tp_basicsize); result = 0; } Py_DECREF(s); @@ -53,7 +54,6 @@ """ PyObject *s, *t; char* c; - Py_ssize_t len; s = PyByteArray_FromStringAndSize(NULL, 4); if (s == NULL) @@ -84,11 +84,10 @@ ("mutable", "METH_NOARGS", """ PyObject *base; - char * p_str; base = PyByteArray_FromStringAndSize("test", 10); if (PyByteArray_GET_SIZE(base) != 10) return PyLong_FromLong(-PyByteArray_GET_SIZE(base)); - memcpy(PyByteArray_AS_STRING(base), "works", 6); + memcpy(PyByteArray_AS_STRING(base), "works", 6); Py_INCREF(base); return base; """), @@ -115,6 +114,7 @@ assert s == 'test' def test_manipulations(self): + import sys module = self.import_extension('foo', [ ("bytearray_from_string", "METH_VARARGS", ''' @@ -141,9 +141,9 @@ ("concat", "METH_VARARGS", """ PyObject * ret, *right, *left; - PyObject *ba1, *ba2; + PyObject *ba1, *ba2; if (!PyArg_ParseTuple(args, "OO", &left, &right)) { - return PyString_FromString("parse failed"); + return PyString_FromString("parse failed"); } ba1 = PyByteArray_FromObject(left); ba2 = PyByteArray_FromObject(right); @@ -157,7 +157,9 @@ """)]) assert module.bytearray_from_string("huheduwe") == "huhe" assert module.str_from_bytearray(bytearray('abc')) == 'abc' - raises(ValueError, module.str_from_bytearray, 4.0) + if '__pypy__' in sys.builtin_module_names: + # CPython only makes an assert. + raises(ValueError, module.str_from_bytearray, 4.0) ret = module.concat('abc', 'def') assert ret == 'abcdef' assert not isinstance(ret, str) @@ -171,9 +173,9 @@ PyObject *obj, *ba; int newsize, oldsize, ret; if (!PyArg_ParseTuple(args, "Oi", &obj, &newsize)) { - return PyString_FromString("parse failed"); + return PyString_FromString("parse failed"); } - + ba = PyByteArray_FromObject(obj); if (ba == NULL) return NULL; @@ -187,7 +189,7 @@ { printf("ret, oldsize, newsize= %d, %d, %d\\n", ret, oldsize, newsize); return NULL; - } + } return ba; ''' )]) diff --git a/pypy/module/cpyext/test/test_bytesobject.py b/pypy/module/cpyext/test/test_bytesobject.py --- a/pypy/module/cpyext/test/test_bytesobject.py +++ b/pypy/module/cpyext/test/test_bytesobject.py @@ -29,7 +29,7 @@ size_t expected_size; result = PyString_Size(s); - + #ifdef PYPY_VERSION expected_size = 48; #elif defined Py_DEBUG @@ -39,7 +39,7 @@ #endif if(s->ob_type->tp_basicsize != expected_size) { - printf("tp_basicsize==%zd\\n", s->ob_type->tp_basicsize); + printf("tp_basicsize==%zd\\n", s->ob_type->tp_basicsize); result = 0; } Py_DECREF(s); @@ -48,7 +48,7 @@ ("test_Size_exception", "METH_NOARGS", """ PyObject* f = PyFloat_FromDouble(1.0); - Py_ssize_t size = PyString_Size(f); + PyString_Size(f); Py_DECREF(f); return NULL; @@ -71,7 +71,6 @@ """ PyObject *s, *t; char* c; - Py_ssize_t len; s = PyString_FromStringAndSize(NULL, 4); if (s == NULL) @@ -99,7 +98,6 @@ PyObject *base; PyTypeObject * type; PyStringObject *obj; - char * p_str; base = PyString_FromString("test"); if (PyString_GET_SIZE(base) != 4) return PyLong_FromLong(-PyString_GET_SIZE(base)); @@ -117,7 +115,6 @@ ('alloc_rw', "METH_NOARGS", ''' PyObject *obj = _PyObject_NewVar(&PyString_Type, 10); - char * buf = PyString_AS_STRING(obj); memcpy(PyString_AS_STRING(obj), "works", 6); return (PyObject*)obj; '''), @@ -320,17 +317,17 @@ ''' PyObject* obj = (PyTuple_GetItem(args, 0)); long hash = ((PyStringObject*)obj)->ob_shash; - return PyLong_FromLong(hash); + return PyLong_FromLong(hash); ''' ), ("test_sstate", "METH_NOARGS", ''' PyObject *s = PyString_FromString("xyz"); - int sstate = ((PyStringObject*)s)->ob_sstate; - /*printf("sstate now %d\\n", sstate);*/ + /*int sstate = ((PyStringObject*)s)->ob_sstate; + printf("sstate now %d\\n", sstate);*/ PyString_InternInPlace(&s); - sstate = ((PyStringObject*)s)->ob_sstate; - /*printf("sstate now %d\\n", sstate);*/ + /*sstate = ((PyStringObject*)s)->ob_sstate; + printf("sstate now %d\\n", sstate);*/ Py_DECREF(s); return PyBool_FromLong(1); '''), @@ -349,7 +346,7 @@ char * data; int len; PyType_Ready(&PyStringArrType_Type); - + data = PyString_AS_STRING(args); len = PyString_GET_SIZE(args); if (data == NULL || len < 1) @@ -373,7 +370,6 @@ const char *dptr, *ip; int len; PyObject *new; - PyObject *ret; ip = dptr = PyString_AS_STRING(self); len = PyString_GET_SIZE(self); @@ -394,7 +390,6 @@ const char *dptr, *ip; int len; PyObject *new; - PyObject *ret; ip = dptr = PyString_AS_STRING(self); len = PyString_GET_SIZE(self); @@ -415,7 +410,6 @@ PyTypeObject *type = &PyStringArrType_Type; PyObject *obj; void *destptr; - int type_num; int itemsize = n; obj = type->tp_alloc(type, itemsize); if (obj == NULL) { diff --git a/pypy/module/cpyext/test/test_cpyext.py b/pypy/module/cpyext/test/test_cpyext.py --- a/pypy/module/cpyext/test/test_cpyext.py +++ b/pypy/module/cpyext/test/test_cpyext.py @@ -7,8 +7,6 @@ from pypy import pypydir from pypy.interpreter import gateway from rpython.rtyper.lltypesystem import lltype, ll2ctypes -from rpython.translator.tool.cbuild import ExternalCompilationInfo -from rpython.translator import platform from rpython.translator.gensupp import uniquemodulename from rpython.tool.udir import udir from pypy.module.cpyext import api @@ -18,20 +16,7 @@ from rpython.tool import leakfinder from rpython.rlib import rawrefcount -def setup_module(module): - if os.name == 'nt': - # Do not open dreaded dialog box on segfault - import ctypes - SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN - old_err_mode = ctypes.windll.kernel32.GetErrorMode() - new_err_mode = old_err_mode | SEM_NOGPFAULTERRORBOX - ctypes.windll.kernel32.SetErrorMode(new_err_mode) - module.old_err_mode = old_err_mode - -def teardown_module(module): - if os.name == 'nt': - import ctypes - ctypes.windll.kernel32.SetErrorMode(module.old_err_mode) +from .support import c_compile @api.cpython_api([], api.PyObject) def PyPy_Crash1(space): @@ -46,7 +31,30 @@ assert 'PyModule_Check' in api.FUNCTIONS assert api.FUNCTIONS['PyModule_Check'].argtypes == [api.PyObject] -def compile_extension_module(space, modname, include_dirs=[], **kwds): +def convert_sources_to_files(sources, dirname): + files = [] + for i, source in enumerate(sources): + filename = dirname / ('source_%d.c' % i) + with filename.open('w') as f: + f.write(str(source)) + files.append(filename) + return files + +def create_so(modname, include_dirs, source_strings=None, source_files=None, + compile_extra=None, link_extra=None, libraries=None): + dirname = (udir/uniquemodulename('module')).ensure(dir=1) + if source_strings: + assert not source_files + files = convert_sources_to_files(source_strings, dirname) + source_files = files + soname = c_compile(source_files, outputfilename=str(dirname/modname), + compile_extra=compile_extra, link_extra=link_extra, + include_dirs=include_dirs, + libraries=libraries) + return soname + +def compile_extension_module(space, modname, include_dirs=[], + source_files=None, source_strings=None): """ Build an extension module and return the filename of the resulting native code file. @@ -60,38 +68,36 @@ state = space.fromcache(State) api_library = state.api_lib if sys.platform == 'win32': - kwds["libraries"] = [api_library] + libraries = [api_library] # '%s' undefined; assuming extern returning int - kwds["compile_extra"] = ["/we4013"] + compile_extra = ["/we4013"] # prevent linking with PythonXX.lib w_maj, w_min = space.fixedview(space.sys.get('version_info'), 5)[:2] - kwds["link_extra"] = ["/NODEFAULTLIB:Python%d%d.lib" % + link_extra = ["/NODEFAULTLIB:Python%d%d.lib" % (space.int_w(w_maj), space.int_w(w_min))] - elif sys.platform == 'darwin': - kwds["link_files"] = [str(api_library + '.dylib')] else: - kwds["link_files"] = [str(api_library + '.so')] + libraries = [] if sys.platform.startswith('linux'): - kwds["compile_extra"]=["-Werror", "-g", "-O0"] - kwds["link_extra"]=["-g"] + compile_extra = ["-Werror", "-g", "-O0", "-fPIC"] + link_extra = ["-g"] + else: + compile_extra = link_extra = None modname = modname.split('.')[-1] - eci = ExternalCompilationInfo( - include_dirs=api.include_dirs + include_dirs, - **kwds - ) - eci = eci.convert_sources_to_files() - dirname = (udir/uniquemodulename('module')).ensure(dir=1) - soname = platform.platform.compile( - [], eci, - outputfilename=str(dirname/modname), - standalone=False) + soname = create_so(modname, + include_dirs=api.include_dirs + include_dirs, + source_files=source_files, + source_strings=source_strings, + compile_extra=compile_extra, + link_extra=link_extra, + libraries=libraries) from pypy.module.imp.importing import get_so_extension pydname = soname.new(purebasename=modname, ext=get_so_extension(space)) soname.rename(pydname) return str(pydname) -def compile_extension_module_applevel(space, modname, include_dirs=[], **kwds): +def compile_extension_module_applevel(space, modname, include_dirs=[], + source_files=None, source_strings=None): """ Build an extension module and return the filename of the resulting native code file. @@ -103,24 +109,23 @@ build the module (so specify your source with one of those). """ if sys.platform == 'win32': - kwds["compile_extra"] = ["/we4013"] - kwds["link_extra"] = ["/LIBPATH:" + os.path.join(sys.exec_prefix, 'libs')] + compile_extra = ["/we4013"] + link_extra = ["/LIBPATH:" + os.path.join(sys.exec_prefix, 'libs')] elif sys.platform == 'darwin': + compile_extra = link_extra = None pass elif sys.platform.startswith('linux'): - kwds["compile_extra"]=["-O0", "-g","-Werror=implicit-function-declaration"] + compile_extra = [ + "-O0", "-g", "-Werror=implicit-function-declaration", "-fPIC"] + link_extra = None modname = modname.split('.')[-1] - eci = ExternalCompilationInfo( - include_dirs = [space.include_dir] + include_dirs, - **kwds - ) - eci = eci.convert_sources_to_files() - dirname = (udir/uniquemodulename('module')).ensure(dir=1) - soname = platform.platform.compile( - [], eci, - outputfilename=str(dirname/modname), - standalone=False) + soname = create_so(modname, + include_dirs=[space.include_dir] + include_dirs, + source_files=source_files, + source_strings=source_strings, + compile_extra=compile_extra, + link_extra=link_extra) return str(soname) def freeze_refcnts(self): @@ -285,8 +290,8 @@ separate_module_sources = [] pydname = self.compile_extension_module( space, name, - separate_module_files=separate_module_files, - separate_module_sources=separate_module_sources) + source_files=separate_module_files, + source_strings=separate_module_sources) return space.wrap(pydname) @gateway.unwrap_spec(name=str, init='str_or_None', body=str, @@ -315,6 +320,11 @@ /* fix for cpython 2.7 Python.h if running tests with -A since pypy compiles with -fvisibility-hidden */ #undef PyMODINIT_FUNC + #ifdef __GNUC__ + # define RPY_EXPORTED extern __attribute__((visibility("default"))) + #else + # define RPY_EXPORTED extern __declspec(dllexport) + #endif #define PyMODINIT_FUNC RPY_EXPORTED void %(body)s @@ -326,16 +336,16 @@ """ % dict(name=name, init=init, body=body, PY_SSIZE_T_CLEAN='#define PY_SSIZE_T_CLEAN' if PY_SSIZE_T_CLEAN else '') - kwds = dict(separate_module_sources=[code]) + kwds = dict(source_strings=[code]) else: assert not PY_SSIZE_T_CLEAN if filename is None: filename = name filename = py.path.local(pypydir) / 'module' \ / 'cpyext'/ 'test' / (filename + ".c") - kwds = dict(separate_module_files=[filename]) - kwds['include_dirs'] = include_dirs - mod = self.compile_extension_module(space, name, **kwds) + kwds = dict(source_files=[filename]) + mod = self.compile_extension_module(space, name, + include_dirs=include_dirs, **kwds) if load_it: if self.runappdirect: @@ -975,7 +985,7 @@ ('bar', 'METH_NOARGS', ''' /* reuse a name that is #defined in structmember.h */ - int RO; + int RO = 0; (void)RO; Py_RETURN_NONE; ''' ), diff --git a/pypy/module/cpyext/test/test_datetime.py b/pypy/module/cpyext/test/test_datetime.py --- a/pypy/module/cpyext/test/test_datetime.py +++ b/pypy/module/cpyext/test/test_datetime.py @@ -142,7 +142,7 @@ 2000, 6, 6, 6, 6, 6, 6, Py_None, PyDateTimeAPI->DateTimeType); """), - ]) + ], prologue='#include "datetime.h"\n') import datetime assert module.new_date() == datetime.date(2000, 6, 6) assert module.new_time() == datetime.time(6, 6, 6, 6) @@ -241,6 +241,9 @@ PyObject* obj = PyDelta_FromDSU(6, 6, 6); PyDateTime_Delta* delta = (PyDateTime_Delta*)obj; +#if defined(PYPY_VERSION) || PY_VERSION_HEX >= 0x03030000 + // These macros are only defined in CPython 3.x and PyPy. + // See: http://bugs.python.org/issue13727 PyDateTime_DELTA_GET_DAYS(obj); PyDateTime_DELTA_GET_DAYS(delta); @@ -249,10 +252,10 @@ PyDateTime_DELTA_GET_MICROSECONDS(obj); PyDateTime_DELTA_GET_MICROSECONDS(delta); - +#endif return obj; """), - ]) + ], prologue='#include "datetime.h"\n') import datetime assert module.test_date_macros() == datetime.date(2000, 6, 6) assert module.test_datetime_macros() == datetime.datetime( diff --git a/pypy/module/cpyext/test/test_frameobject.py b/pypy/module/cpyext/test/test_frameobject.py --- a/pypy/module/cpyext/test/test_frameobject.py +++ b/pypy/module/cpyext/test/test_frameobject.py @@ -13,7 +13,7 @@ PyObject *empty_string = PyString_FromString(""); PyObject *empty_tuple = PyTuple_New(0); PyCodeObject *py_code; - PyFrameObject *py_frame; + PyFrameObject *py_frame = NULL; py_code = PyCode_New( 0, /*int argcount,*/ @@ -75,7 +75,7 @@ """ int check; PyObject *type, *value, *tb; - PyObject *ret = PyRun_String("XXX", Py_eval_input, + PyObject *ret = PyRun_String("XXX", Py_eval_input, Py_None, Py_None); if (ret) { Py_DECREF(ret); diff --git a/pypy/module/cpyext/test/test_getargs.py b/pypy/module/cpyext/test/test_getargs.py --- a/pypy/module/cpyext/test/test_getargs.py +++ b/pypy/module/cpyext/test/test_getargs.py @@ -149,7 +149,6 @@ pybuffer = self.import_parser( ''' Py_buffer buf1, buf2, buf3; - PyObject *result; if (!PyArg_ParseTuple(args, "s*s*s*", &buf1, &buf2, &buf3)) { return NULL; } diff --git a/pypy/module/cpyext/test/test_ndarrayobject.py b/pypy/module/cpyext/test/test_ndarrayobject.py --- a/pypy/module/cpyext/test/test_ndarrayobject.py +++ b/pypy/module/cpyext/test/test_ndarrayobject.py @@ -5,7 +5,7 @@ from rpython.rtyper.lltypesystem import rffi, lltype from pypy.module.micronumpy.ndarray import W_NDimArray from pypy.module.micronumpy.descriptor import get_dtype_cache -import pypy.module.micronumpy.constants as NPY +import pypy.module.micronumpy.constants as NPY def scalar(space): dtype = get_dtype_cache(space).w_float64dtype @@ -237,7 +237,7 @@ except: skip('numpy not importable') else: - numpy_incl = os.path.abspath(os.path.dirname(__file__) + + numpy_incl = os.path.abspath(os.path.dirname(__file__) + '/../include/_numpypy') assert os.path.exists(numpy_incl) cls.w_numpy_include = cls.space.wrap([numpy_incl]) @@ -273,7 +273,7 @@ { /* Should have failed */ Py_DECREF(obj1); - return NULL; + return NULL; } return obj1; ''' @@ -300,14 +300,14 @@ ), ("test_DescrFromType", "METH_O", """ - Signed typenum = PyInt_AsLong(args); + long typenum = PyInt_AsLong(args); return PyArray_DescrFromType(typenum); """ ), - ], include_dirs=self.numpy_include, + ], include_dirs=self.numpy_include, prologue=''' #ifdef PYPY_VERSION - #include <pypy_numpy.h> + #include <pypy_numpy.h> #endif #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include <numpy/arrayobject.h> @@ -315,7 +315,7 @@ #define PyArray_FromObject _PyArray_FromObject #define PyArray_FromAny _PyArray_FromAny #endif - ''', + ''', more_init = ''' #ifndef PYPY_VERSION import_array(); @@ -349,14 +349,14 @@ Py_INCREF(obj); return obj; '''), - ], include_dirs=self.numpy_include, + ], include_dirs=self.numpy_include, prologue=''' #ifdef PYPY_VERSION - #include <pypy_numpy.h> + #include <pypy_numpy.h> #endif #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include <numpy/arrayobject.h> - ''', + ''', more_init = ''' #ifndef PYPY_VERSION import_array(); @@ -403,14 +403,14 @@ void *array_data[] = {NULL, NULL}; return PyUFunc_FromFuncAndDataAndSignature(funcs, array_data, types, 1, 1, 1, PyUFunc_None, - "float_3x3", - "a ufunc that tests a more complicated signature", + "float_3x3", + "a ufunc that tests a more complicated signature", 0, "(m,m)->(m,m)"); """), - ], include_dirs=self.numpy_include, + ], include_dirs=self.numpy_include, prologue=''' #ifdef PYPY_VERSION - #include <pypy_numpy.h> + #include <pypy_numpy.h> #endif #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include <numpy/arrayobject.h> @@ -480,7 +480,7 @@ res += +10; *((float *)args[1]) = res; }; - + ''', more_init = ''' #ifndef PYPY_VERSION import_array(); diff --git a/pypy/module/cpyext/test/test_object.py b/pypy/module/cpyext/test/test_object.py --- a/pypy/module/cpyext/test/test_object.py +++ b/pypy/module/cpyext/test/test_object.py @@ -127,12 +127,12 @@ test_compare(1, 2) test_compare(2, 2) test_compare('2', '1') - + w_i = space.wrap(1) assert api.PyObject_RichCompareBool(w_i, w_i, 123456) == -1 assert api.PyErr_Occurred() is space.w_SystemError api.PyErr_Clear() - + def test_IsInstance(self, space, api): assert api.PyObject_IsInstance(space.wrap(1), space.w_int) == 1 assert api.PyObject_IsInstance(space.wrap(1), space.w_float) == 0 @@ -165,7 +165,7 @@ return File""") w_f = space.call_function(w_File) assert api.PyObject_AsFileDescriptor(w_f) == 42 - + def test_hash(self, space, api): assert api.PyObject_Hash(space.wrap(72)) == 72 assert api.PyObject_Hash(space.wrap(-1)) == -1 @@ -250,7 +250,7 @@ if (copy != orig) PyObject_Free(copy); PyObject_Free(orig); - return ret; + return ret; """)]) x = module.realloctest() assert x == 'hello world\x00' @@ -425,7 +425,6 @@ """ Py_buffer buf; PyObject *str = PyString_FromString("hello, world."); - PyObject *result; if (PyBuffer_FillInfo(&buf, str, PyString_AsString(str), 13, 1, PyBUF_WRITABLE)) { diff --git a/pypy/module/cpyext/test/test_tupleobject.py b/pypy/module/cpyext/test/test_tupleobject.py --- a/pypy/module/cpyext/test/test_tupleobject.py +++ b/pypy/module/cpyext/test/test_tupleobject.py @@ -130,7 +130,7 @@ module = self.import_extension('foo', [ ("run", "METH_NOARGS", """ - long prev, next; + long prev; PyObject *t = PyTuple_New(1); prev = Py_True->ob_refcnt; Py_INCREF(Py_True); diff --git a/pypy/module/cpyext/test/test_typeobject.py b/pypy/module/cpyext/test/test_typeobject.py --- a/pypy/module/cpyext/test/test_typeobject.py +++ b/pypy/module/cpyext/test/test_typeobject.py @@ -5,8 +5,6 @@ from pypy.module.cpyext.pyobject import make_ref, from_ref from pypy.module.cpyext.typeobject import PyTypeObjectPtr -import sys - class AppTestTypeObject(AppTestCpythonExtensionBase): def test_typeobject(self): import sys @@ -737,7 +735,6 @@ """ IntLikeObject *intObj; int intval; - PyObject *name; if (!PyArg_ParseTuple(args, "i", &intval)) return NULL; @@ -897,7 +894,7 @@ module.footype("X", (object,), {}) def test_app_subclass_of_c_type(self): - # on cpython, the size changes (6 bytes added) + import sys module = self.import_module(name='foo') size = module.size_of_instances(module.fooType) class f1(object): @@ -907,7 +904,11 @@ class bar(f1, f2): pass assert bar.__base__ is f2 - assert module.size_of_instances(bar) == size + # On cpython, the size changes. + if '__pypy__' in sys.builtin_module_names: + assert module.size_of_instances(bar) == size + else: + assert module.size_of_instances(bar) >= size def test_app_cant_subclass_two_types(self): module = self.import_module(name='foo') @@ -1058,7 +1059,6 @@ module = self.import_extension('foo', [ ("getMetaClass", "METH_NOARGS", ''' - PyObject *obj; FooType_Type.tp_flags = Py_TPFLAGS_DEFAULT; FooType_Type.tp_base = &PyType_Type; if (PyType_Ready(&FooType_Type) < 0) return NULL; diff --git a/pypy/module/cpyext/test/test_unicodeobject.py b/pypy/module/cpyext/test/test_unicodeobject.py --- a/pypy/module/cpyext/test/test_unicodeobject.py +++ b/pypy/module/cpyext/test/test_unicodeobject.py @@ -35,7 +35,7 @@ ("test_GetSize_exception", "METH_NOARGS", """ PyObject* f = PyFloat_FromDouble(1.0); - Py_ssize_t size = PyUnicode_GetSize(f); + PyUnicode_GetSize(f); Py_DECREF(f); return NULL; @@ -57,7 +57,6 @@ """ PyObject *s, *t; Py_UNICODE* c; - Py_ssize_t len; s = PyUnicode_FromUnicode(NULL, 4); if (s == NULL) @@ -84,7 +83,7 @@ ''' PyObject* obj = (PyTuple_GetItem(args, 0)); long hash = ((PyUnicodeObject*)obj)->hash; - return PyLong_FromLong(hash); + return PyLong_FromLong(hash); ''' ), ]) @@ -234,13 +233,13 @@ w_res = api.PyUnicode_AsUTF8String(w_u) assert space.type(w_res) is space.w_str assert space.unwrap(w_res) == 'sp\tm' - + def test_decode_utf8(self, space, api): u = rffi.str2charp(u'sp\x134m'.encode("utf-8")) w_u = api.PyUnicode_DecodeUTF8(u, 5, None) assert space.type(w_u) is space.w_unicode assert space.unwrap(w_u) == u'sp\x134m' - + w_u = api.PyUnicode_DecodeUTF8(u, 2, None) assert space.type(w_u) is space.w_unicode assert space.unwrap(w_u) == 'sp' @@ -405,7 +404,7 @@ ustr = "abcdef" w_ustr = space.wrap(ustr.decode("ascii")) result = api.PyUnicode_AsASCIIString(w_ustr) - + assert space.eq_w(space.wrap(ustr), result) w_ustr = space.wrap(u"abcd\xe9f") diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py @@ -478,7 +478,7 @@ self.intbound = info def _generate_guards_unkown(self, other, box, runtime_box, extra_guards, - optimizer): + state): other_intbound = None if isinstance(other, NotVirtualStateInfoInt): other_intbound = other.intbound @@ -490,7 +490,7 @@ self.intbound.contains(runtime_box.getint())): # this may generate a few more guards than needed, but they are # optimized away when emitting them - self.intbound.make_guards(box, extra_guards, optimizer) + self.intbound.make_guards(box, extra_guards, state.optimizer) return raise VirtualStatesCantMatch("intbounds don't match") diff --git a/rpython/rlib/_rsocket_rffi.py b/rpython/rlib/_rsocket_rffi.py --- a/rpython/rlib/_rsocket_rffi.py +++ b/rpython/rlib/_rsocket_rffi.py @@ -487,7 +487,9 @@ #hstrerror.argtypes = [c_int] #hstrerror.restype = c_char_p -socket = external('socket', [rffi.INT, rffi.INT, rffi.INT], socketfd_type) +socket = external('socket', [rffi.INT, rffi.INT, rffi.INT], socketfd_type, + save_err=SAVE_ERR) + if WIN32: socketclosename = 'closesocket' diff --git a/rpython/rlib/test/test_rsocket.py b/rpython/rlib/test/test_rsocket.py --- a/rpython/rlib/test/test_rsocket.py +++ b/rpython/rlib/test/test_rsocket.py @@ -589,3 +589,15 @@ return 0 fc = compile(f, [], thread=True) assert fc() == 0 + +def test_socket_saves_errno(tmpdir): + # ensure errno is set to a known value... + unconnected_sock = RSocket() + e = py.test.raises(CSocketError, unconnected_sock.recv, 1024) + # ...which is ENOTCONN + assert e.value.errno == errno.ENOTCONN + + e = py.test.raises(CSocketError, + RSocket, + family=AF_INET, type=SOCK_STREAM, proto=SOL_UDP) + assert e.value.errno in (errno.EPROTOTYPE, errno.EPROTONOSUPPORT) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit