Author: Maciej Fijalkowski <[email protected]>
Branch: improve-gc-tracing-hooks
Changeset: r74028:091a871f1217
Date: 2014-10-21 12:26 +0200
http://bitbucket.org/pypy/pypy/changeset/091a871f1217/
Log: test_transformed_gc in progress
diff --git a/rpython/memory/gctransform/framework.py
b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -1,6 +1,8 @@
from rpython.annotator import model as annmodel
from rpython.rtyper.llannotation import SomeAddress, SomePtr
from rpython.rlib import rgc
+from rpython.rlib.objectmodel import specialize
+from rpython.rlib.unroll import unrolling_iterable
from rpython.rtyper import rmodel, annlowlevel
from rpython.rtyper.lltypesystem import lltype, llmemory, rffi, llgroup
from rpython.rtyper.lltypesystem.lloperation import LL_OPERATIONS
@@ -172,6 +174,8 @@
self.malloc_fnptr_cache = {}
gcdata.gc = GCClass(translator.config.translation, **GC_PARAMS)
+ self.create_custom_trace_funcs(gcdata.gc,
+ translator.rtyper.custom_trace_funcs)
root_walker = self.build_root_walker()
root_walker.finished_minor_collection_func = finished_minor_collection
self.root_walker = root_walker
@@ -490,6 +494,23 @@
[SomeAddress()],
annmodel.s_None)
+ def create_custom_trace_funcs(self, gc, custom_trace_funcs):
+ custom_trace_funcs_unrolled = unrolling_iterable(
+ [(self.get_type_id(TP), func) for TP, func in custom_trace_funcs])
+
+ @specialize.arg(3)
+ def custom_trace_dispatcher(self, obj, typeid, callback, arg):
+ for type_id_exp, func in custom_trace_funcs_unrolled:
+ if typeid == type_id_exp:
+ func(obj, callback, arg)
+ return
+ else:
+ assert False
+
+ gc.__class__.custom_trace_dispatcher = custom_trace_dispatcher
+
+ for TP, func in custom_trace_funcs:
+ specialize.arg(1)(func)
def consider_constant(self, TYPE, value):
self.layoutbuilder.consider_constant(TYPE, value, self.gcdata.gc)
diff --git a/rpython/memory/test/test_transformed_gc.py
b/rpython/memory/test/test_transformed_gc.py
--- a/rpython/memory/test/test_transformed_gc.py
+++ b/rpython/memory/test/test_transformed_gc.py
@@ -385,23 +385,16 @@
assert 160 <= res <= 165
def define_custom_trace(cls):
- from rpython.rtyper.annlowlevel import llhelper
- from rpython.rtyper.lltypesystem import llmemory
#
- S = lltype.GcStruct('S', ('x', llmemory.Address), rtti=True)
+ S = lltype.GcStruct('S', ('x', 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)
+
#
def setup():
+ rgc.register_custom_trace_hook(S, customtrace)
s1 = lltype.malloc(S)
tx = lltype.malloc(T)
tx.z = 4243
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit