Author: Maciej Fijalkowski <fij...@gmail.com> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit