Author: Antonio Cuni <anto.c...@gmail.com> Branch: faster-rstruct-2 Changeset: r91336:5dbafd0b241b Date: 2017-05-18 17:26 +0200 http://bitbucket.org/pypy/pypy/changeset/5dbafd0b241b/
Log: hg merge default diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py --- a/pypy/config/pypyoption.py +++ b/pypy/config/pypyoption.py @@ -42,8 +42,9 @@ from rpython.jit.backend import detect_cpu try: if detect_cpu.autodetect().startswith('x86'): - working_modules.add('_vmprof') - working_modules.add('faulthandler') + if not sys.platform.startswith('openbsd'): + working_modules.add('_vmprof') + working_modules.add('faulthandler') except detect_cpu.ProcessorAutodetectError: pass 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 @@ -677,7 +677,7 @@ register_global(cpyname, 'PyTypeObject*', pypyexpr, header=pypy_decl) for cpyname in '''PyMethodObject PyListObject PyLongObject - PyClassObject'''.split(): + PyClassObject PyBaseExceptionObject'''.split(): FORWARD_DECLS.append('typedef struct { PyObject_HEAD } %s' % (cpyname, )) build_exported_objects() diff --git a/pypy/module/cpyext/dictobject.py b/pypy/module/cpyext/dictobject.py --- a/pypy/module/cpyext/dictobject.py +++ b/pypy/module/cpyext/dictobject.py @@ -257,7 +257,8 @@ if w_dict is None: return 0 - + if not space.isinstance_w(w_dict, space.w_dict): + return 0 pos = ppos[0] py_obj = as_pyobj(space, w_dict) py_dict = rffi.cast(PyDictObject, py_obj) @@ -268,6 +269,9 @@ py_dict.c__tmpkeys = create_ref(space, w_keys) Py_IncRef(space, py_dict.c__tmpkeys) else: + if not py_dict.c__tmpkeys: + # pos should have been 0, cannot fail so return 0 + return 0; w_keys = from_ref(space, py_dict.c__tmpkeys) ppos[0] += 1 if pos >= space.len_w(w_keys): diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py --- a/pypy/module/cpyext/slotdefs.py +++ b/pypy/module/cpyext/slotdefs.py @@ -14,7 +14,7 @@ ssizessizeargfunc, ssizeobjargproc, iternextfunc, initproc, richcmpfunc, cmpfunc, hashfunc, descrgetfunc, descrsetfunc, objobjproc, objobjargproc, readbufferproc, getbufferproc, releasebufferproc, ssizessizeobjargproc) -from pypy.module.cpyext.pyobject import make_ref, decref, as_pyobj +from pypy.module.cpyext.pyobject import make_ref, decref, as_pyobj, from_ref from pypy.module.cpyext.pyerrors import PyErr_Occurred from pypy.module.cpyext.memoryobject import fill_Py_buffer from pypy.module.cpyext.state import State @@ -264,7 +264,7 @@ check_num_args(space, w_args, 1) args_w = space.fixedview(w_args) index = space.int_w(space.index(args_w[0])) - null = lltype.nullptr(PyObject.TO) + null = rffi.cast(PyObject, 0) res = generic_cpy_call(space, func_target, w_self, index, null) if rffi.cast(lltype.Signed, res) == -1: space.fromcache(State).check_and_raise_exception(always=True) @@ -293,7 +293,8 @@ func_target = rffi.cast(objobjargproc, func) check_num_args(space, w_args, 1) w_key, = space.fixedview(w_args) - res = generic_cpy_call(space, func_target, w_self, w_key, None) + null = rffi.cast(PyObject, 0) + res = generic_cpy_call(space, func_target, w_self, w_key, null) if rffi.cast(lltype.Signed, res) == -1: space.fromcache(State).check_and_raise_exception(always=True) return space.w_None @@ -611,6 +612,8 @@ handled = True for tp_name, attr in [('tp_hash', '__hash__'), + ('tp_as_sequence.c_sq_length', '__len__'), + ('tp_as_mapping.c_mp_length', '__len__'), ]: if name == tp_name: slot_fn = w_type.getdictvalue(space, attr) @@ -636,7 +639,8 @@ ('tp_as_number.c_nb_xor', '__xor__'), ('tp_as_number.c_nb_or', '__or__'), ('tp_as_sequence.c_sq_concat', '__add__'), - ('tp_as_sequence.c_sq_inplace_concat', '__iadd__') + ('tp_as_sequence.c_sq_inplace_concat', '__iadd__'), + ('tp_as_mapping.c_mp_subscript', '__getitem__'), ]: if name == tp_name: slot_fn = w_type.getdictvalue(space, attr) @@ -650,7 +654,7 @@ handled = True # binary-with-Py_ssize_t-type - for tp_name, attr in [('tp_as_sequence.c_sq_item', '__getitem'), + for tp_name, attr in [('tp_as_sequence.c_sq_item', '__getitem__'), ('tp_as_sequence.c_sq_repeat', '__mul__'), ('tp_as_sequence.c_sq_repeat', '__mul__'), ('tp_as_sequence.c_sq_inplace_repeat', '__imul__'), @@ -679,7 +683,48 @@ def slot_func(space, w_self, w_arg1, w_arg2): return space.call_function(slot_fn, w_self, w_arg1, w_arg2) handled = True + # ternary-with-void returning-Py_size_t-type + for tp_name, attr in [('tp_as_mapping.c_mp_ass_subscript', '__setitem__'), + ]: + if name == tp_name: + slot_ass = w_type.getdictvalue(space, attr) + if slot_ass is None: + return + slot_del = w_type.getdictvalue(space, '__delitem__') + if slot_del is None: + return + @slot_function([PyObject, PyObject, PyObject], rffi.INT_real, error=-1) + @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name)) + def slot_func(space, w_self, w_arg1, arg2): + if arg2: + w_arg2 = from_ref(space, rffi.cast(PyObject, arg2)) + space.call_function(slot_ass, w_self, w_arg1, w_arg2) + else: + space.call_function(slot_del, w_self, w_arg1) + return 0 + handled = True + # ternary-Py_size_t-void returning-Py_size_t-type + for tp_name, attr in [('tp_as_sequence.c_sq_ass_item', '__setitem__'), + ]: + if name == tp_name: + slot_ass = w_type.getdictvalue(space, attr) + if slot_ass is None: + return + slot_del = w_type.getdictvalue(space, '__delitem__') + if slot_del is None: + return + + @slot_function([PyObject, lltype.Signed, PyObject], rffi.INT_real, error=-1) + @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name)) + def slot_func(space, w_self, arg1, arg2): + if arg2: + w_arg2 = from_ref(space, rffi.cast(PyObject, arg2)) + space.call_function(slot_ass, w_self, space.newint(arg1), w_arg2) + else: + space.call_function(slot_del, w_self, space.newint(arg1)) + return 0 + handled = True if handled: pass elif name == 'tp_setattro': diff --git a/pypy/module/cpyext/test/test_dictobject.py b/pypy/module/cpyext/test/test_dictobject.py --- a/pypy/module/cpyext/test/test_dictobject.py +++ b/pypy/module/cpyext/test/test_dictobject.py @@ -255,4 +255,60 @@ ]) d = module.get_type_dict(1) assert d['real'].__get__(1, 1) == 1 - + def test_advanced(self): + module = self.import_extension('foo', [ + ("dict_len", "METH_O", + ''' + int ret = args->ob_type->tp_as_mapping->mp_length(args); + return PyLong_FromLong(ret); + '''), + ("dict_setitem", "METH_VARARGS", + ''' + int ret; + PyObject * dict = PyTuple_GetItem(args, 0); + if (PyTuple_Size(args) < 3 || !dict || + !dict->ob_type->tp_as_mapping || + !dict->ob_type->tp_as_mapping->mp_ass_subscript) + return PyLong_FromLong(-1); + ret = dict->ob_type->tp_as_mapping->mp_ass_subscript( + dict, PyTuple_GetItem(args, 1), + PyTuple_GetItem(args, 2)); + return PyLong_FromLong(ret); + '''), + ("dict_delitem", "METH_VARARGS", + ''' + int ret; + PyObject * dict = PyTuple_GetItem(args, 0); + if (PyTuple_Size(args) < 2 || !dict || + !dict->ob_type->tp_as_mapping || + !dict->ob_type->tp_as_mapping->mp_ass_subscript) + return PyLong_FromLong(-1); + ret = dict->ob_type->tp_as_mapping->mp_ass_subscript( + dict, PyTuple_GetItem(args, 1), NULL); + return PyLong_FromLong(ret); + '''), + ("dict_next", "METH_VARARGS", + ''' + PyObject *key, *value; + PyObject *arg = NULL; + Py_ssize_t pos = 0; + int ret = 0; + if ((PyArg_ParseTuple(args, "|O", &arg))) { + if (arg && PyDict_Check(arg)) { + while (PyDict_Next(arg, &pos, &key, &value)) + ret ++; + /* test no crash if pos is not reset to 0*/ + while (PyDict_Next(arg, &pos, &key, &value)) + ret ++; + } + } + return PyLong_FromLong(ret); + '''), + ]) + d = {'a': 1, 'b':2} + assert module.dict_len(d) == 2 + assert module.dict_setitem(d, 'a', 'c') == 0 + assert d['a'] == 'c' + assert module.dict_delitem(d, 'a') == 0 + r = module.dict_next({'a': 1, 'b': 2}) + assert r == 2 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 @@ -520,7 +520,7 @@ if sys.platform == 'win32': make_conversion_functions('MBCS', 'mbcs') -@cpython_api([rffi.CCHARP, Py_ssize_t, rffi.CCHARP, rffi.INTP], PyObject) +@cpython_api([rffi.CCHARP, Py_ssize_t, CONST_STRING, rffi.INTP], PyObject) def PyUnicode_DecodeUTF16(space, s, size, llerrors, pbyteorder): """Decode length bytes from a UTF-16 encoded buffer string and return the corresponding Unicode object. errors (if non-NULL) defines the error diff --git a/pypy/module/test_lib_pypy/README.txt b/pypy/module/test_lib_pypy/README.txt new file mode 100644 --- /dev/null +++ b/pypy/module/test_lib_pypy/README.txt @@ -0,0 +1,4 @@ +This directory contains app-level tests are supposed to be run *after* +translation. So you run them by saying: + +pypy pytest.py <testfile.py> diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py --- a/rpython/rlib/rposix.py +++ b/rpython/rlib/rposix.py @@ -239,7 +239,7 @@ 'signal.h', 'sys/utsname.h', _ptyh] if sys.platform.startswith('linux'): includes.append('sys/sysmacros.h') - if sys.platform.startswith('freebsd'): + if sys.platform.startswith('freebsd') or sys.platform.startswith('openbsd'): includes.append('sys/ttycom.h') libraries = ['util'] eci = ExternalCompilationInfo( diff --git a/rpython/rlib/rvmprof/src/shared/machine.c b/rpython/rlib/rvmprof/src/shared/machine.c --- a/rpython/rlib/rvmprof/src/shared/machine.c +++ b/rpython/rlib/rvmprof/src/shared/machine.c @@ -4,6 +4,7 @@ #include <stdio.h> #ifdef VMPROF_UNIX +#include <string.h> #include <unistd.h> #include <fcntl.h> #endif _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit