Author: Matti Picus <[email protected]>
Branch:
Changeset: r94260:5014ee1237e8
Date: 2018-04-07 21:40 +0300
http://bitbucket.org/pypy/pypy/changeset/5014ee1237e8/
Log: test, fix for issue #2792 (resizing non-initialized PyTuple), also
add fast-path optimization
diff --git a/pypy/module/cpyext/test/test_tupleobject.py
b/pypy/module/cpyext/test/test_tupleobject.py
--- a/pypy/module/cpyext/test/test_tupleobject.py
+++ b/pypy/module/cpyext/test/test_tupleobject.py
@@ -67,6 +67,18 @@
assert space.int_w(space.getitem(w_tuple, space.wrap(i))) == 42 + i
decref(space, ar[0])
+ py_tuple = state.ccall("PyTuple_New", 1)
+ ar[0] = py_tuple
+ api._PyTuple_Resize(ar, 1)
+ assert api.PyTuple_Size(ar[0]) == 1
+ decref(space, ar[0])
+
+ py_tuple = state.ccall("PyTuple_New", 1)
+ ar[0] = py_tuple
+ api._PyTuple_Resize(ar, 5)
+ assert api.PyTuple_Size(ar[0]) == 5
+ decref(space, ar[0])
+
lltype.free(ar, flavor='raw')
def test_setitem(self, space, api):
diff --git a/pypy/module/cpyext/tupleobject.py
b/pypy/module/cpyext/tupleobject.py
--- a/pypy/module/cpyext/tupleobject.py
+++ b/pypy/module/cpyext/tupleobject.py
@@ -187,6 +187,8 @@
PyErr_BadInternalCall(space)
oldref = rffi.cast(PyTupleObject, ref)
oldsize = oldref.c_ob_size
+ if oldsize == newsize:
+ return 0
ptup = state.ccall("PyTuple_New", newsize)
if not ptup:
state.check_and_raise_exception(always=True)
@@ -199,8 +201,9 @@
to_cp = newsize
for i in range(to_cp):
ob = oldref.c_ob_item[i]
- incref(space, ob)
- newref.c_ob_item[i] = ob
+ if ob:
+ incref(space, ob)
+ newref.c_ob_item[i] = ob
except:
decref(space, p_ref[0])
p_ref[0] = lltype.nullptr(PyObject.TO)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit