Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r61876:cf9ed3344df9
Date: 2013-02-28 18:27 +0200
http://bitbucket.org/pypy/pypy/changeset/cf9ed3344df9/
Log: a test and a fix
diff --git a/rpython/jit/backend/llsupport/jitframe.py
b/rpython/jit/backend/llsupport/jitframe.py
--- a/rpython/jit/backend/llsupport/jitframe.py
+++ b/rpython/jit/backend/llsupport/jitframe.py
@@ -47,7 +47,14 @@
i += 1
return frame
-JITFRAME = lltype.GcStruct(
+def jitframe_resolve(frame):
+ while frame.jf_forward:
+ frame = frame.jf_forward
+ return frame
+
+JITFRAME = lltype.GcForwardReference()
+
+JITFRAME.become(lltype.GcStruct(
'JITFRAME',
('jf_frame_info', lltype.Ptr(JITFRAMEINFO)),
# Once the execute_token() returns, the field 'jf_descr' stores the
@@ -68,6 +75,8 @@
# RPython code that finishes the function with an exception, the
# exception is not stored there, but is simply kept as a variable there)
('jf_guard_exc', llmemory.GCREF),
+ # in case the frame got reallocated, we have to forward it somewhere
+ ('jf_forward', lltype.Ptr(JITFRAME)),
# absolutely useless field used to make up for tracing hooks
inflexibilities
('jf_gc_trace_state', lltype.Signed),
# the actual frame
@@ -76,9 +85,10 @@
# about GCrefs here and not in frame info which might change
adtmeths = {
'allocate': jitframe_allocate,
+ 'resolve': jitframe_resolve,
},
rtti = True,
-)
+))
@specialize.memo()
def getofs(name):
diff --git a/rpython/jit/backend/llsupport/llmodel.py
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -89,6 +89,7 @@
frame.jf_frame_info.set_frame_depth(base_ofs, size)
new_frame = jitframe.JITFRAME.allocate(frame.jf_frame_info,
self.JITFRAME_FIXED_SIZE)
+ frame.jf_forward = new_frame
i = 0
while i < len(frame.jf_frame):
new_frame.jf_frame[i] = frame.jf_frame[i]
@@ -193,6 +194,7 @@
def force(self, addr_of_force_token):
frame = rffi.cast(jitframe.JITFRAMEPTR, addr_of_force_token)
+ frame = frame.resolve()
frame.jf_descr = frame.jf_force_descr
return lltype.cast_opaque_ptr(llmemory.GCREF, frame)
diff --git a/rpython/jit/backend/test/runner_test.py
b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -3732,7 +3732,7 @@
def test_compile_bridge_while_running(self):
def func():
bridge = parse("""
- [i1, i2]
+ [i1, i2, px]
i3 = int_add(i1, i2)
i4 = int_add(i1, i3)
i5 = int_add(i1, i4)
@@ -3750,7 +3750,7 @@
force_spill(i8)
force_spill(i9)
call(ConstClass(func2_ptr), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
descr=calldescr2)
- guard_true(i1, descr=guarddescr) [i1, i2, i3, i4, i5, i6, i7, i8,
i9]
+ guard_true(i1, descr=guarddescr) [i1, i2, i3, i4, i5, i6, i7, i8,
i9, px]
finish(i1, descr=finaldescr)
""", namespace={'finaldescr': finaldescr, 'calldescr2': calldescr2,
'guarddescr': guarddescr, 'func2_ptr': func2_ptr})
@@ -3783,7 +3783,8 @@
loop = parse("""
[i0, i1, i2]
call(ConstClass(func_ptr), descr=calldescr)
- guard_true(i0, descr=faildescr) [i1, i2]
+ px = force_token()
+ guard_true(i0, descr=faildescr) [i1, i2, px]
finish(i2, descr=finaldescr2)
""", namespace=locals())
self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
@@ -3796,6 +3797,11 @@
frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, frame)
assert len(frame.jf_frame) == frame.jf_frame_info.jfi_frame_depth
+ ref = self.cpu.get_ref_value(frame, 9)
+ token = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, ref)
+ assert token != frame
+ token = token.resolve()
+ assert token == frame
def test_compile_bridge_while_running_guard_no_exc(self):
xtp = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit