Author: Armin Rigo <ar...@tunes.org> Branch: cffi-1.0 Changeset: r77211:8d28e47f70b9 Date: 2015-05-08 15:57 +0200 http://bitbucket.org/pypy/pypy/changeset/8d28e47f70b9/
Log: Grumble, figured out that the reason we get sometimes unexpected objects staying alive is that there is a cycle involving W_FFIObject. As it also has a destructor, on CPython it ends up in gc.garbage. diff --git a/pypy/module/_cffi_backend/ffi_obj.py b/pypy/module/_cffi_backend/ffi_obj.py --- a/pypy/module/_cffi_backend/ffi_obj.py +++ b/pypy/module/_cffi_backend/ffi_obj.py @@ -24,22 +24,27 @@ return w_ffitype.getdictvalue(space, 'error') +class FreeCtxObj(object): + def __init__(self, ctxobj): + self.ctxobj = ctxobj + @rgc.must_be_light_finalizer + def __del__(self): + parse_c_type.free_ctxobj(self.ctxobj) + + class W_FFIObject(W_Root): def __init__(self, space, src_ctx=parse_c_type.NULL_CTX): self.space = space self.types_dict = {} self.ctxobj = parse_c_type.allocate_ctxobj(src_ctx) + self._finalizer = FreeCtxObj(self.ctxobj) if src_ctx: self.cached_types = [None] * parse_c_type.get_num_types(src_ctx) else: self.cached_types = None self.w_FFIError = get_ffi_error(space) - @rgc.must_be_light_finalizer - def __del__(self): - parse_c_type.free_ctxobj(self.ctxobj) - @jit.elidable def parse_string_to_type(self, string, flags): try: diff --git a/pypy/module/_cffi_backend/newtype.py b/pypy/module/_cffi_backend/newtype.py --- a/pypy/module/_cffi_backend/newtype.py +++ b/pypy/module/_cffi_backend/newtype.py @@ -45,6 +45,7 @@ return x def _clean_cache(space): + "NOT_RPYTHON" space.fromcache(UniqueCache).__init__(space) # ____________________________________________________________ _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit