Author: Ronan Lamy <[email protected]>
Branch: cpyext-leakchecking
Changeset: r92050:ff315452ce6f
Date: 2017-08-03 17:53 +0100
http://bitbucket.org/pypy/pypy/changeset/ff315452ce6f/
Log: Don't incref the original object in PyMemoryView_FromObject()
diff --git a/pypy/module/cpyext/buffer.py b/pypy/module/cpyext/buffer.py
--- a/pypy/module/cpyext/buffer.py
+++ b/pypy/module/cpyext/buffer.py
@@ -93,6 +93,7 @@
lltype.free(pybuf, flavor='raw')
decref(self.space, self.pyobj)
self.pyobj = lltype.nullptr(PyObject.TO)
+ self.w_obj = None
else:
#do not call twice
return
diff --git a/pypy/module/cpyext/memoryobject.py
b/pypy/module/cpyext/memoryobject.py
--- a/pypy/module/cpyext/memoryobject.py
+++ b/pypy/module/cpyext/memoryobject.py
@@ -72,7 +72,7 @@
readonly=widen(view.c_readonly))
# Ensure view.c_buf is released upon object finalization
fq.register_finalizer(buf)
- # Allow subclassing W_MemeoryView
+ # Allow subclassing W_MemoryView
w_type = from_ref(space, rffi.cast(PyObject, obj.c_ob_type))
w_obj = space.allocate_instance(W_MemoryView, w_type)
w_obj.__init__(buf)
@@ -177,11 +177,9 @@
return (_IsCContiguous(view) or _IsFortranContiguous(view))
return 0
-@cpython_api([PyObject], PyObject, result_is_ll=True)
+@cpython_api([PyObject], PyObject)
def PyMemoryView_FromObject(space, w_obj):
- w_memview = space.call_method(space.builtin, "memoryview", w_obj)
- py_memview = make_ref(space, w_memview, w_obj)
- return py_memview
+ return space.call_method(space.builtin, "memoryview", w_obj)
@cpython_api([Py_bufferP], PyObject, result_is_ll=True)
def PyMemoryView_FromBuffer(space, view):
@@ -193,6 +191,7 @@
# copy view into obj.c_view, without creating a new view.c_obj
typedescr = get_typedescr(W_MemoryView.typedef)
py_obj = typedescr.allocate(space, space.w_memoryview)
+
py_mem = rffi.cast(PyMemoryViewObject, py_obj)
mview = py_mem.c_view
mview.c_buf = view.c_buf
diff --git a/pypy/module/cpyext/test/test_memoryobject.py
b/pypy/module/cpyext/test/test_memoryobject.py
--- a/pypy/module/cpyext/test/test_memoryobject.py
+++ b/pypy/module/cpyext/test/test_memoryobject.py
@@ -4,7 +4,7 @@
from pypy.module.cpyext.test.test_api import BaseApiTest
from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
from rpython.rlib.buffer import StringBuffer
-from pypy.module.cpyext.pyobject import from_ref
+from pypy.module.cpyext.pyobject import make_ref, from_ref
from pypy.module.cpyext.memoryobject import PyMemoryViewObject
only_pypy ="config.option.runappdirect and '__pypy__' not in
sys.builtin_module_names"
@@ -12,9 +12,9 @@
class TestMemoryViewObject(BaseApiTest):
def test_frombuffer(self, space, api):
w_buf = space.newbuffer(StringBuffer("hello"))
+ w_memoryview = api.PyMemoryView_FromObject(w_buf)
c_memoryview = rffi.cast(
- PyMemoryViewObject, api.PyMemoryView_FromObject(w_buf))
- w_memoryview = from_ref(space, c_memoryview)
+ PyMemoryViewObject, make_ref(space, w_memoryview))
view = c_memoryview.c_view
assert view.c_ndim == 1
f = rffi.charp2str(view.c_format)
@@ -32,6 +32,7 @@
assert space.eq_w(space.getattr(w_mv, w_f),
space.getattr(w_memoryview, w_f))
api.Py_DecRef(ref)
+ api.Py_DecRef(w_memoryview)
class AppTestPyBuffer_FillInfo(AppTestCpythonExtensionBase):
def test_fillWithObject(self):
@@ -62,7 +63,6 @@
""")])
result = module.fillinfo()
assert b"hello, world." == result
- del result
class AppTestBufferProtocol(AppTestCpythonExtensionBase):
def test_fromobject(self):
@@ -172,8 +172,6 @@
# in <bound method ConcreteArray.__del__ ...> ignored
def test_releasebuffer(self):
- if not self.runappdirect:
- skip("Fails due to ll2ctypes nonsense")
module = self.import_extension('foo', [
("create_test", "METH_NOARGS",
"""
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit