Author: Maciej Fijalkowski <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit