[pypy-commit] pypy cpyext-avoid-roundtrip: (antocuni, ronan, arigo)

arigo pypy.commits at gmail.com
Tue Oct 10 13:57:15 EDT 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: cpyext-avoid-roundtrip
Changeset: r92710:fa425a186e38
Date: 2017-10-10 19:56 +0200
http://bitbucket.org/pypy/pypy/changeset/fa425a186e38/

Log:	(antocuni, ronan, arigo)

	Fix and improve the test, and fix the code

diff --git a/pypy/module/cpyext/sequence.py b/pypy/module/cpyext/sequence.py
--- a/pypy/module/cpyext/sequence.py
+++ b/pypy/module/cpyext/sequence.py
@@ -104,6 +104,11 @@
         cpy_strategy = space.fromcache(CPyListStrategy)
         if w_obj.strategy is cpy_strategy:
             return w_obj.get_raw_items() # asserts it's a cpyext strategy
+    elif isinstance(w_obj, tupleobject.W_TupleObject):
+        from pypy.module.cpyext.tupleobject import PyTupleObject
+        py_obj = as_pyobj(space, w_obj)
+        py_tuple = rffi.cast(PyTupleObject, py_obj)
+        return rffi.cast(PyObjectP, py_tuple.c_ob_item)
     raise oefmt(space.w_TypeError,
                 "PySequence_Fast_ITEMS called but object is not the result of "
                 "PySequence_Fast")
diff --git a/pypy/module/cpyext/test/test_sequence.py b/pypy/module/cpyext/test/test_sequence.py
--- a/pypy/module/cpyext/test/test_sequence.py
+++ b/pypy/module/cpyext/test/test_sequence.py
@@ -274,12 +274,13 @@
                 PyTypeObject * common_type;
                 PyObject *foo, **objects;
                 PyObject * seq = PyTuple_GetItem(args, 0);
-                /* XXX assert it is a tuple */
                 if (seq == NULL)
                     Py_RETURN_NONE;
                 foo = PySequence_Fast(seq, "some string");
                 objects = PySequence_Fast_ITEMS(foo);
-                size = PySequence_Fast_GET_SIZE(seq);
+                if (objects == NULL)
+                    return NULL;
+                size = PySequence_Fast_GET_SIZE(foo);
                 common_type = size > 0 ? Py_TYPE(objects[0]) : NULL;
                 for (i = 1; i < size; ++i) {
                     if (Py_TYPE(objects[i]) != common_type) {
@@ -288,12 +289,20 @@
                     }
                 }
                 Py_DECREF(foo);
+                if (common_type == NULL)
+                    return PyBool_FromLong(0);
                 Py_DECREF(common_type);
                 return PyBool_FromLong(1);
              """)])
         s = [1, 2, 3, 4]
         assert module.test_fast_sequence(s[0:-1])
         assert module.test_fast_sequence(s[::-1])
+        s = (1, 2, 3, 4)
+        assert module.test_fast_sequence(s[0:-1])
+        assert module.test_fast_sequence(s[::-1])
+        s = "1234"
+        assert module.test_fast_sequence(s[0:-1])
+        assert module.test_fast_sequence(s[::-1])
 
     def test_fast_keyerror(self):
         module = self.import_extension('foo', [


More information about the pypy-commit mailing list