Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60419:4d6db99cec1d
Date: 2013-01-24 15:01 +0200
http://bitbucket.org/pypy/pypy/changeset/4d6db99cec1d/

Log:    frame can definitely contain young pointers

diff --git a/rpython/jit/backend/llsupport/gc.py 
b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -133,6 +133,13 @@
         """
         raise NotImplementedError # cpu specific
 
+    def malloc_jitframe(self, frame_info):
+        """ Allocate a new frame, overwritten by tests
+        """
+        frame = jitframe.JITFRAME.allocate(frame_info)
+        llop.gc_assume_young_pointers(lltype.Void, frame)
+        return frame
+
 class JitFrameDescrs:
     def _freeze_(self):
         return True
diff --git a/rpython/jit/backend/x86/runner.py 
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -118,7 +118,7 @@
             func = rffi.cast(FUNCPTR, addr)
             #llop.debug_print(lltype.Void, ">>>> Entering", addr)
             frame_info = clt.frame_info
-            frame = jitframe.JITFRAME.allocate(frame_info)
+            frame = self.gc_ll_descr.malloc_jitframe(frame_info)
             ll_frame = lltype.cast_opaque_ptr(llmemory.GCREF, frame)
             prev_interpreter = None   # help flow space
             if not self.translate_support_code:
diff --git a/rpython/jit/backend/x86/test/test_gc_integration.py 
b/rpython/jit/backend/x86/test/test_gc_integration.py
--- a/rpython/jit/backend/x86/test/test_gc_integration.py
+++ b/rpython/jit/backend/x86/test/test_gc_integration.py
@@ -348,8 +348,13 @@
         self.gcrootmap = MockShadowStackRootMap()
         self.nursery = lltype.malloc(rffi.CArray(lltype.Char), nursery_size,
                                      flavor='raw')
-        self.nursery_addr = rffi.cast(lltype.Signed, self.nursery)
+        self.nursery_ptrs = lltype.malloc(rffi.CArray(lltype.Signed), 2,
+                                          flavor='raw')
+        self.nursery_ptrs[0] = rffi.cast(lltype.Signed, self.nursery)
+        self.nursery_ptrs[1] = self.nursery_ptrs[0] + nursery_size
+        self.nursery_addr = rffi.cast(lltype.Signed, self.nursery_ptrs)
         self.write_barrier_descr = WriteBarrierDescr(self)
+        self._initialize_for_tests()
 
     def do_write_barrier(self, gcref_struct, gcref_newptr):
         pass
@@ -358,10 +363,14 @@
         return 0
 
     def get_nursery_free_addr(self):
-        return 0
+        return self.nursery_addr
+
+    def get_nursery_top_addr(self):
+        return self.nursery_addr + rffi.sizeof(lltype.Signed)
 
     def __del__(self):
         lltype.free(self.nursery, flavor='raw')
+        lltype.free(self.nursery_ptrs, flavor='raw')
     
 def unpack_gcmap(frame):
     res = []
@@ -387,6 +396,7 @@
         S.become(lltype.GcStruct('S',
                                  ('hdr', lltype.Signed),
                                  ('x', lltype.Ptr(S))))
+        cpu.gc_ll_descr.fielddescr_tid = cpu.fielddescrof(S, 'hdr')
         self.S = S
         self.cpu = cpu
 
@@ -452,8 +462,21 @@
         item = rffi.cast(lltype.Ptr(S), frame.jf_frame[gcmap[0]])
         assert item == new_items[2]
 
-    def test_malloc_frame_writebarrier(self):
+    def test_malloc_1(self):
+        cpu = self.cpu
+        sizeof = cpu.sizeof(self.S)
+        sizeof.tid = 0
         loop = self.parse("""
         []
-        """, namespace={})
-        loop
+        p0 = new(descr=sizedescr)
+        finish(p0, descr=finaldescr)
+        """, namespace={'sizedescr': sizeof,
+                        'finaldescr': BasicFinalDescr()})
+        token = JitCellToken()
+        cpu.compile_loop(loop.inputargs, loop.operations, token)
+        frame = cpu.execute_token(token)
+        # now we should be able to track everything from the frame
+        frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, frame)
+        thing = frame.jf_frame[unpack_gcmap(frame)[0]]
+        assert thing == rffi.cast(lltype.Signed, cpu.gc_ll_descr.nursery)
+        assert cpu.gc_ll_descr.nursery_ptrs[0] == thing + sizeof.size
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to