Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r61834:4f5cc418bac8
Date: 2013-02-27 11:38 +0200
http://bitbucket.org/pypy/pypy/changeset/4f5cc418bac8/
Log: a test and a fix (and we're not done yet)
diff --git a/rpython/jit/backend/llsupport/test/test_gc_integration.py
b/rpython/jit/backend/llsupport/test/test_gc_integration.py
--- a/rpython/jit/backend/llsupport/test/test_gc_integration.py
+++ b/rpython/jit/backend/llsupport/test/test_gc_integration.py
@@ -651,18 +651,21 @@
invoke_around_extcall(before, after)
- def f(x):
+ def f(frame, x):
+ # all the gc pointers are alive p1 -> p7 (but not p0)
+ assert bin(frame.jf_gcmap[0]).count('1') == 7
assert x == 1
return 2
- FUNC = lltype.FuncType([lltype.Signed], lltype.Signed)
+ FUNC = lltype.FuncType([JITFRAMEPTR, lltype.Signed], lltype.Signed)
fptr = llhelper(lltype.Ptr(FUNC), f)
calldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
EffectInfo.MOST_GENERAL)
loop = self.parse("""
- [i0]
- i1 = call_release_gil(ConstClass(fptr), i0, descr=calldescr)
- guard_not_forced(descr=faildescr) []
+ [i0, p1, p2, p3, p4, p5, p6, p7]
+ p0 = force_token()
+ i1 = call_release_gil(ConstClass(fptr), p0, i0, descr=calldescr)
+ guard_not_forced(descr=faildescr) [p1, p2, p3, p4, p5, p6, p7]
finish(i1, descr=finaldescr)
""", namespace={'fptr': fptr, 'calldescr':calldescr,
'faildescr': BasicFailDescr(),
@@ -671,7 +674,8 @@
cpu.gc_ll_descr.init_nursery(100)
cpu.setup_once()
cpu.compile_loop(loop.inputargs, loop.operations, token)
- frame = cpu.execute_token(token, 1)
+ args = [lltype.nullptr(llmemory.GCREF.TO) for i in range(7)]
+ frame = cpu.execute_token(token, 1, *args)
frame = rffi.cast(JITFRAMEPTR, frame)
assert frame.jf_frame[0] == 2
assert l == ['before', 'after']
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -876,13 +876,13 @@
for box, loc in self.rm.reg_bindings.iteritems():
if loc in forbidden_regs:
continue
- if box.type == REF and self.rm.stays_alive(box):
+ if box.type == REF and self.rm.is_still_alive(box):
assert not noregs
assert isinstance(loc, RegLoc)
val = gpr_reg_mgr_cls.all_reg_indexes[loc.value]
gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8))
for box, loc in self.fm.bindings.iteritems():
- if box.type == REF and self.rm.stays_alive(box):
+ if box.type == REF and self.rm.is_still_alive(box):
assert isinstance(loc, FrameLoc)
val = loc.position + JITFRAME_FIXED_SIZE
gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit