Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r91889:b58d747dcf74 Date: 2017-07-16 13:44 +0200 http://bitbucket.org/pypy/pypy/changeset/b58d747dcf74/
Log: hg merge default diff --git a/lib-python/2.7/test/test_os.py b/lib-python/2.7/test/test_os.py --- a/lib-python/2.7/test/test_os.py +++ b/lib-python/2.7/test/test_os.py @@ -580,6 +580,7 @@ "getentropy() does not use a file descriptor") class URandomFDTests(unittest.TestCase): @unittest.skipUnless(resource, "test requires the resource module") + @test_support.impl_detail(pypy=False) # on Linux, may use getrandom() def test_urandom_failure(self): # Check urandom() failing when it is not able to open /dev/random. # We spawn a new process to make the test more robust (if getrlimit() diff --git a/pypy/interpreter/test/test_generator.py b/pypy/interpreter/test/test_generator.py --- a/pypy/interpreter/test/test_generator.py +++ b/pypy/interpreter/test/test_generator.py @@ -531,6 +531,13 @@ assert next(gen) is 1 assert next(gen) is 2 + def test_multiple_invalid_sends(self): + def mygen(): + yield 42 + g = mygen() + raises(TypeError, g.send, 2) + raises(TypeError, g.send, 2) + def test_should_not_inline(space): from pypy.interpreter.generator import should_not_inline diff --git a/pypy/module/cpyext/methodobject.py b/pypy/module/cpyext/methodobject.py --- a/pypy/module/cpyext/methodobject.py +++ b/pypy/module/cpyext/methodobject.py @@ -10,7 +10,7 @@ from pypy.module.cpyext.api import ( CONST_STRING, METH_CLASS, METH_COEXIST, METH_KEYWORDS, METH_NOARGS, METH_O, METH_STATIC, METH_VARARGS, PyObject, bootstrap_function, - build_type_checkers, cpython_api, generic_cpy_call, + build_type_checkers, cpython_api, generic_cpy_call, CANNOT_FAIL, PyTypeObjectPtr, slot_function, cts) from pypy.module.cpyext.pyobject import ( Py_DecRef, from_ref, make_ref, as_pyobj, make_typedescr) @@ -106,8 +106,14 @@ self.space, u"built-in method '%s' of '%s' object" % (self.name.decode('utf-8'), self.w_objclass.getname(self.space))) -PyCFunction_Check, PyCFunction_CheckExact = build_type_checkers( - "CFunction", W_PyCFunctionObject) +@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL) +def PyCFunction_Check(space, w_obj): + from pypy.interpreter.function import BuiltinFunction + if w_obj is None: + return False + if isinstance(w_obj, W_PyCFunctionObject): + return True + return isinstance(w_obj, BuiltinFunction) class W_PyCClassMethodObject(W_PyCFunctionObject): w_self = None diff --git a/pypy/module/cpyext/object.py b/pypy/module/cpyext/object.py --- a/pypy/module/cpyext/object.py +++ b/pypy/module/cpyext/object.py @@ -442,15 +442,19 @@ Py_PRINT_RAW = 1 # No string quotes etc. @cpython_api([PyObject, FILEP, rffi.INT_real], rffi.INT_real, error=-1) -def PyObject_Print(space, w_obj, fp, flags): +def PyObject_Print(space, pyobj, fp, flags): """Print an object o, on file fp. Returns -1 on error. The flags argument is used to enable certain printing options. The only option currently supported is Py_PRINT_RAW; if given, the str() of the object is written instead of the repr().""" - if rffi.cast(lltype.Signed, flags) & Py_PRINT_RAW: - w_str = space.str(w_obj) + if not pyobj: + w_str = space.newtext("<nil>") else: - w_str = space.repr(w_obj) + w_obj = from_ref(space, pyobj) + if rffi.cast(lltype.Signed, flags) & Py_PRINT_RAW: + w_str = space.str(w_obj) + else: + w_str = space.repr(w_obj) count = space.len_w(w_str) data = space.text_w(w_str) 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 @@ -455,7 +455,7 @@ ('tp_iter', '__iter__'), ]: if name == tp_name: - slot_fn = w_type.getdictvalue(space, attr) + slot_fn = w_type.lookup(attr) if slot_fn is None: return @@ -470,7 +470,7 @@ ('tp_as_mapping.c_mp_length', '__len__'), ]: if name == tp_name: - slot_fn = w_type.getdictvalue(space, attr) + slot_fn = w_type.lookup(attr) if slot_fn is None: return @slot_function([PyObject], lltype.Signed, error=-1) @@ -497,7 +497,7 @@ ('tp_as_mapping.c_mp_subscript', '__getitem__'), ]: if name == tp_name: - slot_fn = w_type.getdictvalue(space, attr) + slot_fn = w_type.lookup(attr) if slot_fn is None: return @@ -514,7 +514,7 @@ ('tp_as_sequence.c_sq_inplace_repeat', '__imul__'), ]: if name == tp_name: - slot_fn = w_type.getdictvalue(space, attr) + slot_fn = w_type.lookup(attr) if slot_fn is None: return @@ -528,7 +528,7 @@ for tp_name, attr in [('tp_as_number.c_nb_power', '__pow__'), ]: if name == tp_name: - slot_fn = w_type.getdictvalue(space, attr) + slot_fn = w_type.lookup(attr) if slot_fn is None: return @@ -541,10 +541,10 @@ for tp_name, attr in [('tp_as_mapping.c_mp_ass_subscript', '__setitem__'), ]: if name == tp_name: - slot_ass = w_type.getdictvalue(space, attr) + slot_ass = w_type.lookup(attr) if slot_ass is None: return - slot_del = w_type.getdictvalue(space, '__delitem__') + slot_del = w_type.lookup('__delitem__') if slot_del is None: return @@ -562,10 +562,10 @@ for tp_name, attr in [('tp_as_sequence.c_sq_ass_item', '__setitem__'), ]: if name == tp_name: - slot_ass = w_type.getdictvalue(space, attr) + slot_ass = w_type.lookup(attr) if slot_ass is None: return - slot_del = w_type.getdictvalue(space, '__delitem__') + slot_del = w_type.lookup('__delitem__') if slot_del is None: return @@ -582,8 +582,8 @@ if handled: pass elif name == 'tp_setattro': - setattr_fn = w_type.getdictvalue(space, '__setattr__') - delattr_fn = w_type.getdictvalue(space, '__delattr__') + setattr_fn = w_type.lookup('__setattr__') + delattr_fn = w_type.lookup('__delattr__') if setattr_fn is None: return @@ -598,7 +598,7 @@ return 0 slot_func = slot_tp_setattro elif name == 'tp_getattro': - getattr_fn = w_type.getdictvalue(space, '__getattribute__') + getattr_fn = w_type.lookup('__getattribute__') if getattr_fn is None: return @@ -609,7 +609,7 @@ slot_func = slot_tp_getattro elif name == 'tp_call': - call_fn = w_type.getdictvalue(space, '__call__') + call_fn = w_type.lookup('__call__') if call_fn is None: return @@ -622,7 +622,7 @@ slot_func = slot_tp_call elif name == 'tp_iternext': - iternext_fn = w_type.getdictvalue(space, '__next__') + iternext_fn = w_type.lookup('__next__') if iternext_fn is None: return @@ -638,7 +638,7 @@ slot_func = slot_tp_iternext elif name == 'tp_init': - init_fn = w_type.getdictvalue(space, '__init__') + init_fn = w_type.lookup('__init__') if init_fn is None: return @@ -651,7 +651,7 @@ return 0 slot_func = slot_tp_init elif name == 'tp_new': - new_fn = w_type.getdictvalue(space, '__new__') + new_fn = w_type.lookup('__new__') if new_fn is None: return @@ -663,7 +663,7 @@ return space.call_args(space.get(new_fn, w_self), args) slot_func = slot_tp_new elif name == 'tp_as_buffer.c_bf_getbuffer': - buff_fn = w_type.getdictvalue(space, '__buffer__') + buff_fn = w_type.lookup('__buffer__') if buff_fn is not None: buff_w = slot_from___buffer__(space, typedef, buff_fn) elif typedef.buffer: @@ -672,7 +672,7 @@ return slot_func = buff_w elif name == 'tp_descr_get': - get_fn = w_type.getdictvalue(space, '__get__') + get_fn = w_type.lookup('__get__') if get_fn is None: return @@ -684,8 +684,8 @@ return space.call_function(get_fn, w_self, w_obj, w_value) slot_func = slot_tp_descr_get elif name == 'tp_descr_set': - set_fn = w_type.getdictvalue(space, '__set__') - delete_fn = w_type.getdictvalue(space, '__delete__') + set_fn = w_type.lookup('__set__') + delete_fn = w_type.lookup('__delete__') if set_fn is None and delete_fn is None: return diff --git a/pypy/module/cpyext/test/test_boolobject.py b/pypy/module/cpyext/test/test_boolobject.py --- a/pypy/module/cpyext/test/test_boolobject.py +++ b/pypy/module/cpyext/test/test_boolobject.py @@ -26,3 +26,20 @@ ]) assert module.get_true() == True assert module.get_false() == False + + def test_toint(self): + module = self.import_extension('foo', [ + ("to_int", "METH_O", + ''' + if (args->ob_type->tp_as_number && args->ob_type->tp_as_number->nb_int) { + return args->ob_type->tp_as_number->nb_int(args); + } + else { + PyErr_SetString(PyExc_TypeError,"cannot convert bool to int"); + return NULL; + } + '''), ]) + assert module.to_int(False) == 0 + assert module.to_int(True) == 1 + + diff --git a/pypy/module/cpyext/test/test_methodobject.py b/pypy/module/cpyext/test/test_methodobject.py --- a/pypy/module/cpyext/test/test_methodobject.py +++ b/pypy/module/cpyext/test/test_methodobject.py @@ -77,6 +77,31 @@ assert mod.isSameFunction(mod.getarg_O) raises(SystemError, mod.isSameFunction, 1) + def test_check(self): + mod = self.import_extension('foo', [ + ('check', 'METH_O', + ''' + return PyLong_FromLong(PyCFunction_Check(args)); + '''), + ]) + from math import degrees + assert mod.check(degrees) == 1 + assert mod.check(list) == 0 + assert mod.check(sorted) == 1 + def func(): + pass + class A(object): + def meth(self): + pass + @staticmethod + def stat(): + pass + assert mod.check(func) == 0 + assert mod.check(A) == 0 + assert mod.check(A.meth) == 0 + assert mod.check(A.stat) == 0 + + class TestPyCMethodObject(BaseApiTest): def test_repr(self, space, api): """ 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 @@ -288,13 +288,20 @@ if (fp == NULL) Py_RETURN_NONE; ret = PyObject_Print(obj, fp, Py_PRINT_RAW); + if (ret < 0) { + fclose(fp); + return NULL; + } + ret = PyObject_Print(NULL, fp, Py_PRINT_RAW); + if (ret < 0) { + fclose(fp); + return NULL; + } fclose(fp); - if (ret < 0) - return NULL; Py_RETURN_TRUE; """)]) assert module.dump(self.tmpname, None) - assert open(self.tmpname).read() == 'None' + assert open(self.tmpname).read() == 'None<nil>' def test_issue1970(self): module = self.import_extension('foo', [ diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py --- a/rpython/memory/gctransform/framework.py +++ b/rpython/memory/gctransform/framework.py @@ -639,7 +639,10 @@ addresses_of_static_ptrs = ( self.layoutbuilder.addresses_of_static_ptrs_in_nongc + self.layoutbuilder.addresses_of_static_ptrs) - log.info("found %s static roots" % (len(addresses_of_static_ptrs), )) + if len(addresses_of_static_ptrs) == 1: + log.info("found 1 static root") + else: + log.info("found %s static roots" % (len(addresses_of_static_ptrs), )) ll_static_roots_inside = lltype.malloc(lltype.Array(llmemory.Address), len(addresses_of_static_ptrs), immortal=True) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit