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