Author: Armin Rigo <ar...@tunes.org> Branch: tealet Changeset: r45876:d6075e673700 Date: 2011-07-15 09:38 +0200 http://bitbucket.org/pypy/pypy/changeset/d6075e673700/
Log: Support tealets on asmgcc too. It's actually easy, unless I'm missing something. diff --git a/pypy/config/translationoption.py b/pypy/config/translationoption.py --- a/pypy/config/translationoption.py +++ b/pypy/config/translationoption.py @@ -31,8 +31,7 @@ BoolOption("tealet", "enable stackless features via tealets", default=False, cmdline="--tealet", requires=[("translation.type_system", "lltype"), - ("translation.gctransformer", "framework"), - ("translation.gcrootfinder", "shadowstack")]), + ("translation.gctransformer", "framework")]), ChoiceOption("type_system", "Type system to use when RTyping", ["lltype", "ootype"], cmdline=None, default="lltype", requires={ diff --git a/pypy/rlib/test/test_rtealet.py b/pypy/rlib/test/test_rtealet.py --- a/pypy/rlib/test/test_rtealet.py +++ b/pypy/rlib/test/test_rtealet.py @@ -29,5 +29,3 @@ class TestTealetAsmgcc(BaseTestTealet): gcrootfinder = "asmgcc" - def setup_class(cls): - py.test.skip("XXX in-progress") diff --git a/pypy/rpython/lltypesystem/lloperation.py b/pypy/rpython/lltypesystem/lloperation.py --- a/pypy/rpython/lltypesystem/lloperation.py +++ b/pypy/rpython/lltypesystem/lloperation.py @@ -483,8 +483,8 @@ 'gc_dump_rpy_heap' : LLOp(), 'gc_typeids_z' : LLOp(), - 'gc_save_stack_roots' : LLOp(), # for tealet support - 'gc_restore_stack_roots': LLOp(), # for tealet support + 'gc_save_stack_roots' : LLOp(canunwindgc=True), # for tealet support + 'gc_restore_stack_roots': LLOp(canunwindgc=True), # for tealet support # ------- JIT & GC interaction, only for some GCs ---------- diff --git a/pypy/rpython/memory/gctransform/asmgcroot.py b/pypy/rpython/memory/gctransform/asmgcroot.py --- a/pypy/rpython/memory/gctransform/asmgcroot.py +++ b/pypy/rpython/memory/gctransform/asmgcroot.py @@ -1,3 +1,4 @@ +from pypy.annotation import model as annmodel from pypy.rpython.memory.gctransform.framework import FrameworkGCTransformer from pypy.rpython.memory.gctransform.framework import BaseRootWalker from pypy.rpython.lltypesystem import lltype, llmemory, rffi @@ -147,6 +148,54 @@ self._extra_gcmapend = lambda: llmemory.NULL self._extra_mark_sorted = lambda: True + def need_tealet_support(self, gctransformer, getfn): + # tealet support: hooks to save and restore the GC pointers + # from the stack before it is whisked away by "tealet.c". + GCPTR_ARRAY = lltype.Ptr(lltype.GcArray(llmemory.GCREF)) + SIGNED_ARRAY = lltype.Ptr(lltype.GcArray(lltype.Signed)) + WALKER_PTR = lltype.Ptr(lltype.Struct('walker', + ('gcptr_array', GCPTR_ARRAY), + ('signed_array', SIGNED_ARRAY))) + gcdata = self.gcdata + # + def ll_count_locations(gc, addr): + gcdata._gc_tealet_count += 1 + # + def ll_save_locations(gc, addr): + gcref = llmemory.cast_adr_to_ptr(addr.address[0], llmemory.GCREF) + gcdata._gc_tealet_array[gcdata._gc_tealet_count] = gcref + gcdata._gc_tealet_count += 1 + # + def ll_restore_locations(gc, addr): + gcref = gcdata._gc_tealet_array[gcdata._gc_tealet_count] + gcdata._gc_tealet_count += 1 + addr.address[0] = llmemory.cast_ptr_to_adr(gcref) + # + def ll_save_stack_roots(walker): + gcdata._gc_tealet_count = 0 + self.walk_stack_roots(ll_count_locations) + count = gcdata._gc_tealet_count + gcdata._gc_tealet_count = 0 + gcdata._gc_tealet_array = lltype.malloc(GCPTR_ARRAY.TO, count) + self.walk_stack_roots(ll_save_locations) + walker.gcptr_array = gcdata._gc_tealet_array + gcdata._gc_tealet_array = lltype.nullptr(GCPTR_ARRAY.TO) + # + def ll_restore_stack_roots(walker): + gcdata._gc_tealet_array = walker.gcptr_array + gcdata._gc_tealet_count = 0 + self.walk_stack_roots(ll_restore_locations) + gcdata._gc_tealet_array = lltype.nullptr(GCPTR_ARRAY.TO) + # + self.ll_save_stack_roots_ptr = getfn(ll_save_stack_roots, + [annmodel.SomePtr(WALKER_PTR)], + annmodel.s_None, + minimal_transform=False) + self.ll_restore_stack_roots_ptr = getfn(ll_restore_stack_roots, + [annmodel.SomePtr(WALKER_PTR)], + annmodel.s_None, + minimal_transform=False) + def need_thread_support(self, gctransformer, getfn): # Threads supported "out of the box" by the rest of the code. # The whole code in this function is only there to support _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit