Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r77638:beece8a05340 Date: 2015-05-28 11:34 +0200 http://bitbucket.org/pypy/pypy/changeset/beece8a05340/
Log: update to cffi/1283fea71028 for issue 198. fix another reftracker issue (before translation only) diff --git a/pypy/module/_cffi_backend/lib_obj.py b/pypy/module/_cffi_backend/lib_obj.py --- a/pypy/module/_cffi_backend/lib_obj.py +++ b/pypy/module/_cffi_backend/lib_obj.py @@ -131,9 +131,10 @@ g.c_address) assert fetch_funcptr assert w_ct.size > 0 - with lltype.scoped_alloc(rffi.CCHARP.TO, w_ct.size) as ptr: - fetch_funcptr(ptr) - w_result = w_ct.convert_to_object(ptr) + ptr = lltype.malloc(rffi.CCHARP.TO, w_ct.size, flavor='raw') + self.ffi._finalizer.free_mems.append(ptr) + fetch_funcptr(ptr) + w_result = w_ct.convert_to_object(ptr) # elif op == cffi_opcode.OP_DLOPEN_FUNC: # For dlopen(): the function of the given 'name'. We use diff --git a/pypy/module/_cffi_backend/test/test_recompiler.py b/pypy/module/_cffi_backend/test/test_recompiler.py --- a/pypy/module/_cffi_backend/test/test_recompiler.py +++ b/pypy/module/_cffi_backend/test/test_recompiler.py @@ -66,6 +66,9 @@ """) ffiobject = space.getitem(w_res, space.wrap(0)) ffiobject._test_recompiler_source_ffi = ffi + if not hasattr(space, '_cleanup_ffi'): + space._cleanup_ffi = [] + space._cleanup_ffi.append(ffiobject) return w_res @@ -84,6 +87,10 @@ """) def teardown_method(self, meth): + if hasattr(self.space, '_cleanup_ffi'): + for ffi in self.space._cleanup_ffi: + del ffi.cached_types # try to prevent cycles + del self.space._cleanup_ffi self.space.appexec([self._w_modules], """(old_modules): import sys for key in sys.modules.keys(): @@ -799,3 +806,19 @@ assert addr(0xABC05) == 47 assert isinstance(addr, ffi.CData) assert ffi.typeof(addr) == ffi.typeof("long(*)(long)") + + def test_issue198(self): + ffi, lib = self.prepare(""" + typedef struct{...;} opaque_t; + const opaque_t CONSTANT; + int toint(opaque_t); + """, 'test_issue198', """ + typedef int opaque_t; + #define CONSTANT ((opaque_t)42) + static int toint(opaque_t o) { return o; } + """) + def random_stuff(): + pass + assert lib.toint(lib.CONSTANT) == 42 + random_stuff() + assert lib.toint(lib.CONSTANT) == 42 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit