Author: Maciej Fijalkowski <fij...@gmail.com> Branch: improve-gc-tracing-hooks Changeset: r74020:90fb5f3f406a Date: 2014-10-20 19:44 +0200 http://bitbucket.org/pypy/pypy/changeset/90fb5f3f406a/
Log: Whack around to kill the remnants of the previous system diff --git a/rpython/memory/gctypelayout.py b/rpython/memory/gctypelayout.py --- a/rpython/memory/gctypelayout.py +++ b/rpython/memory/gctypelayout.py @@ -22,13 +22,11 @@ # returned address (or NULL the first time) as the second argument. FINALIZER_FUNC = lltype.FuncType([llmemory.Address], lltype.Void) FINALIZER = lltype.Ptr(FINALIZER_FUNC) - EXTRA = lltype.Struct("type_info_extra", - ('finalizer', FINALIZER)) # structure describing the layout of a typeid TYPE_INFO = lltype.Struct("type_info", ("infobits", lltype.Signed), # combination of the T_xxx consts - ("extra", lltype.Ptr(EXTRA)), + ("finalizer", FINALIZER), ("fixedsize", lltype.Signed), ("ofstoptrs", lltype.Ptr(OFFSETS_TO_GC_PTR)), hints={'immutable': True}, @@ -80,18 +78,13 @@ return (infobits & T_IS_GCARRAY_OF_GCPTR) != 0 def q_finalizer(self, typeid): - typeinfo = self.get(typeid) - if typeinfo.infobits & T_HAS_FINALIZER: - return typeinfo.extra.finalizer - else: - return lltype.nullptr(GCData.FINALIZER_FUNC) + return self.get(typeid).finalizer def q_light_finalizer(self, typeid): typeinfo = self.get(typeid) if typeinfo.infobits & T_HAS_LIGHTWEIGHT_FINALIZER: - return typeinfo.extra.finalizer - else: - return lltype.nullptr(GCData.FINALIZER_FUNC) + return typeinfo.finalizer + return lltype.nullptr(GCData.FINALIZER_FUNC) def q_offsets_to_gc_pointers(self, typeid): return self.get(typeid).ofstoptrs @@ -166,9 +159,8 @@ T_IS_GCARRAY_OF_GCPTR = 0x040000 T_IS_WEAKREF = 0x080000 T_IS_RPYTHON_INSTANCE = 0x100000 # the type is a subclass of OBJECT -T_HAS_FINALIZER = 0x200000 -T_HAS_CUSTOM_TRACE = 0x400000 -T_HAS_LIGHTWEIGHT_FINALIZER = 0x800000 +T_HAS_CUSTOM_TRACE = 0x200000 +T_HAS_LIGHTWEIGHT_FINALIZER = 0x400000 T_HAS_GCPTR = 0x1000000 T_KEY_MASK = intmask(0xFE000000) # bug detection only T_KEY_VALUE = intmask(0x5A000000) # bug detection only @@ -197,18 +189,11 @@ # fptrs = builder.special_funcptr_for_type(TYPE) if fptrs: - extra = lltype.malloc(GCData.EXTRA, zero=True, immortal=True, - flavor='raw') if "finalizer" in fptrs: - extra.finalizer = fptrs["finalizer"] - infobits |= T_HAS_FINALIZER + info.finalizer = fptrs["finalizer"] if "light_finalizer" in fptrs: - extra.finalizer = fptrs["light_finalizer"] - infobits |= T_HAS_FINALIZER | T_HAS_LIGHTWEIGHT_FINALIZER - if "custom_trace" in fptrs: - extra.customtracer = fptrs["custom_trace"] - infobits |= T_HAS_CUSTOM_TRACE | T_HAS_GCPTR - info.extra = extra + info.finalizer = fptrs["light_finalizer"] + infobits |= T_HAS_LIGHTWEIGHT_FINALIZER # if not TYPE._is_varsize(): info.fixedsize = llarena.round_up_for_allocation( diff --git a/rpython/memory/test/gc_test_base.py b/rpython/memory/test/gc_test_base.py --- a/rpython/memory/test/gc_test_base.py +++ b/rpython/memory/test/gc_test_base.py @@ -237,26 +237,19 @@ assert 160 <= res <= 165 def test_custom_trace(self): - from rpython.rtyper.annlowlevel import llhelper from rpython.rtyper.lltypesystem import llmemory from rpython.rtyper.lltypesystem.llarena import ArenaError # S = lltype.GcStruct('S', ('x', llmemory.Address), - ('y', llmemory.Address), rtti=True) + ('y', llmemory.Address)) T = lltype.GcStruct('T', ('z', lltype.Signed)) offset_of_x = llmemory.offsetof(S, 'x') - def customtrace(obj, prev): - if not prev: - return obj + offset_of_x - else: - return llmemory.NULL - CUSTOMTRACEFUNC = lltype.FuncType([llmemory.Address, llmemory.Address], - llmemory.Address) - customtraceptr = llhelper(lltype.Ptr(CUSTOMTRACEFUNC), customtrace) - lltype.attachRuntimeTypeInfo(S, customtraceptr=customtraceptr) + def customtrace(obj, callback, arg): + callback(obj + offset_of_x, arg) # for attrname in ['x', 'y']: def setup(): + rgc.register_custom_trace_hook(S, customtrace) s1 = lltype.malloc(S) tx = lltype.malloc(T) tx.z = 42 diff --git a/rpython/rtyper/lltypesystem/lltype.py b/rpython/rtyper/lltypesystem/lltype.py --- a/rpython/rtyper/lltypesystem/lltype.py +++ b/rpython/rtyper/lltypesystem/lltype.py @@ -383,8 +383,7 @@ about=self)._obj Struct._install_extras(self, **kwds) - def _attach_runtime_type_info_funcptr(self, funcptr, destrptr, - customtraceptr): + def _attach_runtime_type_info_funcptr(self, funcptr, destrptr): if self._runtime_type_info is None: raise TypeError("attachRuntimeTypeInfo: %r must have been built " "with the rtti=True argument" % (self,)) @@ -408,18 +407,6 @@ raise TypeError("expected a destructor function " "implementation, got: %s" % destrptr) self._runtime_type_info.destructor_funcptr = destrptr - if customtraceptr is not None: - from rpython.rtyper.lltypesystem import llmemory - T = typeOf(customtraceptr) - if (not isinstance(T, Ptr) or - not isinstance(T.TO, FuncType) or - len(T.TO.ARGS) != 2 or - T.TO.RESULT != llmemory.Address or - T.TO.ARGS[0] != llmemory.Address or - T.TO.ARGS[1] != llmemory.Address): - raise TypeError("expected a custom trace function " - "implementation, got: %s" % customtraceptr) - self._runtime_type_info.custom_trace_funcptr = customtraceptr class GcStruct(RttiStruct): _gckind = 'gc' @@ -2288,12 +2275,10 @@ return SomePtr(ll_ptrtype=PtrT.const) -def attachRuntimeTypeInfo(GCSTRUCT, funcptr=None, destrptr=None, - customtraceptr=None): +def attachRuntimeTypeInfo(GCSTRUCT, funcptr=None, destrptr=None): if not isinstance(GCSTRUCT, RttiStruct): raise TypeError("expected a RttiStruct: %s" % GCSTRUCT) - GCSTRUCT._attach_runtime_type_info_funcptr(funcptr, destrptr, - customtraceptr) + GCSTRUCT._attach_runtime_type_info_funcptr(funcptr, destrptr) return _ptr(Ptr(RuntimeTypeInfo), GCSTRUCT._runtime_type_info) def getRuntimeTypeInfo(GCSTRUCT): diff --git a/rpython/rtyper/rtyper.py b/rpython/rtyper/rtyper.py --- a/rpython/rtyper/rtyper.py +++ b/rpython/rtyper/rtyper.py @@ -646,7 +646,7 @@ raise TyperError("runtime type info function %r returns %r, " "excepted Ptr(RuntimeTypeInfo)" % (func, s)) funcptr = self.getcallable(graph) - attachRuntimeTypeInfo(GCSTRUCT, funcptr, destrptr, None) + attachRuntimeTypeInfo(GCSTRUCT, funcptr, destrptr) # register operations from annotation model RPythonTyper._registeroperations(unaryop.UNARY_OPERATIONS, binaryop.BINARY_OPERATIONS) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit