[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