Author: Ronan Lamy <[email protected]>
Branch: cpyext-leakchecking
Changeset: r91962:c99247c01177
Date: 2017-07-25 11:58 +0200
http://bitbucket.org/pypy/pypy/changeset/c99247c01177/
Log: Tweak CPyBuffer.releasebuffer() to make ll2ctypes happy
diff --git a/pypy/interpreter/executioncontext.py
b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -605,6 +605,7 @@
e.write_unraisable(space, where, w_obj)
e.clear(space) # break up reference cycles
else:
+ raise
addrstring = w_obj.getaddrstring(space)
msg = ("RPython exception %s in %s<%s at 0x%s> ignored\n" % (
str(e), where, space.type(w_obj).name, addrstring))
@@ -615,7 +616,7 @@
def make_finalizer_queue(W_Root, space):
"""Make a FinalizerQueue subclass which responds to GC finalizer
events by 'firing' the UserDelAction class above. It does not
- directly fetches the objects to finalize at all; they stay in the
+ directly fetches the objects to finalize at all; they stay in the
GC-managed queue, and will only be fetched by UserDelAction
(between bytecodes)."""
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
@@ -73,19 +73,24 @@
if self.needs_decref:
if self.releasebufferproc:
func_target = rffi.cast(releasebufferproc,
self.releasebufferproc)
- with lltype.scoped_alloc(Py_buffer) as pybuf:
- pybuf.c_buf = self.ptr
- pybuf.c_len = self.size
- pybuf.c_ndim = cts.cast('int', self.ndim)
- pybuf.c_shape = cts.cast('Py_ssize_t*', pybuf.c__shape)
- pybuf.c_strides = cts.cast('Py_ssize_t*',
pybuf.c__strides)
- for i in range(self.ndim):
- pybuf.c_shape[i] = self.shape[i]
- pybuf.c_strides[i] = self.strides[i]
- with rffi.scoped_str2charp(
- self.format if self.format else "B") as fmt:
- pybuf.c_format = fmt
- generic_cpy_call(self.space, func_target,
self.pyobj, pybuf)
+ size = rffi.sizeof(cts.gettype('Py_buffer'))
+ pybuf = lltype.malloc(rffi.VOIDP.TO, size, flavor='raw',
zero=True)
+ pybuf = cts.cast('Py_buffer*', pybuf)
+ pybuf.c_buf = self.ptr
+ pybuf.c_len = self.size
+ pybuf.c_ndim = cts.cast('int', self.ndim)
+ pybuf.c_shape = cts.cast('Py_ssize_t*', pybuf.c__shape)
+ pybuf.c_strides = cts.cast('Py_ssize_t*', pybuf.c__strides)
+ for i in range(self.ndim):
+ pybuf.c_shape[i] = self.shape[i]
+ pybuf.c_strides[i] = self.strides[i]
+ fmt = rffi.str2charp(self.format if self.format else "B")
+ try:
+ pybuf.c_format = fmt
+ generic_cpy_call(self.space, func_target, self.pyobj,
pybuf)
+ finally:
+ lltype.free(fmt, flavor='raw')
+ lltype.free(pybuf, flavor='raw')
decref(self.space, self.pyobj)
self.pyobj = lltype.nullptr(PyObject.TO)
else:
diff --git a/pypy/module/cpyext/test/test_cpyext.py
b/pypy/module/cpyext/test/test_cpyext.py
--- a/pypy/module/cpyext/test/test_cpyext.py
+++ b/pypy/module/cpyext/test/test_cpyext.py
@@ -109,9 +109,9 @@
except leakfinder.MallocMismatch as e:
result = e.args[0]
filtered_result = {}
- for obj in result:
+ for obj, value in result.iteritems():
if not is_allowed_to_leak(self.space, obj):
- filtered_result[obj] = result[obj]
+ filtered_result[obj] = value
if filtered_result:
raise leakfinder.MallocMismatch(filtered_result)
assert not self.space.finalizer_queue.next_dead()
diff --git a/rpython/tool/leakfinder.py b/rpython/tool/leakfinder.py
--- a/rpython/tool/leakfinder.py
+++ b/rpython/tool/leakfinder.py
@@ -6,6 +6,7 @@
# So far, this is used for lltype.malloc(flavor='raw').
TRACK_ALLOCATIONS = False
ALLOCATED = {}
+TB_LINES = 76
class MallocMismatch(Exception):
def __str__(self):
@@ -13,8 +14,8 @@
dict2 = {}
for obj, traceback in dict.items():
traceback = traceback.splitlines()
- if len(traceback) > 8:
- traceback = [' ...'] + traceback[-6:]
+ if len(traceback) > TB_LINES + 2:
+ traceback = [' ...'] + traceback[-TB_LINES:]
traceback = '\n'.join(traceback)
dict2.setdefault(traceback, [])
dict2[traceback].append(obj)
@@ -58,7 +59,7 @@
if TRACK_ALLOCATIONS:
frame = sys._getframe(framedepth)
sio = cStringIO.StringIO()
- traceback.print_stack(frame, limit=10, file=sio)
+ traceback.print_stack(frame, limit=40, file=sio)
tb = sio.getvalue()
ALLOCATED[obj] = tb
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit