Author: Mariano Anaya <[email protected]>
Branch: py3.6
Changeset: r91894:51ae4831bf9b
Date: 2017-07-16 14:20 +0200
http://bitbucket.org/pypy/pypy/changeset/51ae4831bf9b/

Log:    Merge branch py3.5

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/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -116,11 +116,16 @@
         #
         # Optimization only: after we've started a Coroutine without
         # CO_YIELD_INSIDE_TRY, then Coroutine._finalize_() will be a no-op
-        if (isinstance(self, Coroutine)
-                and frame.last_instr == -1
-                and not (self.pycode.co_flags & CO_YIELD_INSIDE_TRY)):
-            rgc.may_ignore_finalizer(self)
-        #
+        if frame.last_instr == -1:
+            if (isinstance(self, Coroutine) and
+                not (self.pycode.co_flags & CO_YIELD_INSIDE_TRY)):
+                rgc.may_ignore_finalizer(self)
+
+            if (not space.is_w(w_arg_or_err, space.w_None) and
+                not isinstance(w_arg_or_err, SApplicationException)):
+                raise oefmt(space.w_TypeError,
+                            "can't send non-None value to a just-started %s",
+                            self.KIND)
         self.running = True
         try:
             w_result = frame.execute_frame(self, w_arg_or_err)
@@ -168,12 +173,7 @@
             return frame.handle_generator_error(w_arg_or_err.operr)
 
         last_instr = jit.promote(frame.last_instr)
-        if last_instr == -1:
-            if not space.is_w(w_arg_or_err, space.w_None):
-                raise oefmt(space.w_TypeError,
-                            "can't send non-None value to a just-started %s",
-                            self.KIND)
-        else:
+        if last_instr != -1:
             frame.pushvalue(w_arg_or_err)
         return r_uint(last_instr + 1)
 
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/_vmprof/interp_vmprof.py 
b/pypy/module/_vmprof/interp_vmprof.py
--- a/pypy/module/_vmprof/interp_vmprof.py
+++ b/pypy/module/_vmprof/interp_vmprof.py
@@ -15,9 +15,9 @@
 
 
 class __extend__(PyFrame):
-    def execute_frame(self, w_inputvalue=None, operr=None):
+    def execute_frame(self, in_generator=None, w_arg_or_err=None):
         # indirection for the optional arguments
-        return my_execute_frame(self, w_inputvalue, operr)
+        return my_execute_frame(self, in_generator, w_arg_or_err)
 
 
 def _safe(s):
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/pypy/objspace/std/bytesobject.py b/pypy/objspace/std/bytesobject.py
--- a/pypy/objspace/std/bytesobject.py
+++ b/pypy/objspace/std/bytesobject.py
@@ -750,20 +750,12 @@
                     "cannot convert a (unicode) str object to bytes")
 
     # sequence of bytes
-    w_iter = space.iter(w_source)
-    length_hint = space.length_hint(w_source, 0)
-    builder = StringBuilder(length_hint)
-    while True:
-        try:
-            w_item = space.next(w_iter)
-        except OperationError as e:
-            if not e.match(space, space.w_StopIteration):
-                raise
-            break
-        value = space.byte_w(w_item)
-        builder.append(value)
-    return builder.build()
-
+    w_result = space.appexec([w_source], """(seq):
+        result = bytearray()
+        for i in seq:
+            result.append(i)
+        return result""")
+    return w_result.getdata()
 
 W_BytesObject.typedef = TypeDef(
     "bytes", None, None, "read",
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to