Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r59925:8c847106dab3
Date: 2013-01-10 20:18 +0200
http://bitbucket.org/pypy/pypy/changeset/8c847106dab3/
Log: hack enough to make those two tests pass again, this time with
understanding
diff --git a/pypy/jit/backend/llgraph/runner.py
b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -49,6 +49,7 @@
class WeakrefDescr(AbstractDescr):
def __init__(self, realdescr):
self.realdescrref = weakref.ref(realdescr)
+ self.final_descr = getattr(realdescr, 'final_descr', False)
class ExecutionFinished(Exception):
def __init__(self, deadframe):
diff --git a/pypy/jit/backend/llsupport/jitframe.py
b/pypy/jit/backend/llsupport/jitframe.py
--- a/pypy/jit/backend/llsupport/jitframe.py
+++ b/pypy/jit/backend/llsupport/jitframe.py
@@ -32,7 +32,7 @@
# exception is not stored there, but is simply kept as a variable there)
('jf_guard_exc', llmemory.GCREF),
# the actual frame
- ('jf_frame', lltype.Array(lltype.Signed))
+ ('jf_frame', lltype.Array(lltype.Signed, hints={'nolength': True}))
)
JITFRAMEPTR = lltype.Ptr(JITFRAME)
diff --git a/pypy/jit/backend/llsupport/llmodel.py
b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -274,20 +274,30 @@
descr = deadframe.jf_descr
return history.AbstractDescr.show(self, descr)
+ def _decode_pos(self, deadframe, index):
+ descr = self.get_latest_descr(deadframe)
+ if descr.final_descr:
+ assert index == 0
+ return 0
+ xxx
+
def get_int_value(self, deadframe, index):
+ pos = self._decode_pos(deadframe, index)
descr = self.gc_ll_descr.getframedescrs(self).arraydescr
ofs = self.unpack_arraydescr(descr)
- return self.read_int_at_mem(deadframe, index + ofs, 1, WORD)
+ return self.read_int_at_mem(deadframe, pos + ofs, 1, WORD)
def get_ref_value(self, deadframe, index):
+ pos = self._decode_pos(deadframe, index)
descr = self.gc_ll_descr.getframedescrs(self).arraydescr
ofs = self.unpack_arraydescr(descr)
- return self.read_ref_at_mem(deadframe, index + ofs)
+ return self.read_ref_at_mem(deadframe, pos + ofs)
def get_float_value(self, deadframe, index):
+ pos = self._decode_pos(deadframe, index)
descr = self.gc_ll_descr.getframedescrs(self).arraydescr
ofs = self.unpack_arraydescr(descr)
- return self.read_float_at_mem(deadframe, index + ofs)
+ return self.read_float_at_mem(deadframe, pos + ofs)
# ____________________ RAW PRIMITIVES ________________________
diff --git a/pypy/jit/backend/model.py b/pypy/jit/backend/model.py
--- a/pypy/jit/backend/model.py
+++ b/pypy/jit/backend/model.py
@@ -332,6 +332,8 @@
asmmemmgr_blocks = None
asmmemmgr_gcroots = 0
+ frame_depth = 0
+
def __init__(self, cpu, number):
cpu.total_compiled_loops += 1
self.cpu = cpu
diff --git a/pypy/jit/backend/test/runner_test.py
b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -2,6 +2,7 @@
from pypy.jit.metainterp.history import (AbstractFailDescr,
AbstractDescr,
BasicFailDescr,
+ BasicFinalDescr,
BoxInt, Box, BoxPtr,
JitCellToken, TargetToken,
ConstInt, ConstPtr,
@@ -94,7 +95,7 @@
results = [result]
operations = [ResOperation(opnum, valueboxes, result),
ResOperation(rop.FINISH, results, None,
- descr=BasicFailDescr(0))]
+ descr=BasicFinalDescr(0))]
if operations[0].is_guard():
operations[0].setfailargs([])
if not descr:
@@ -111,24 +112,19 @@
avoid_instances = False
- def find_pos_on_faildescr(self, fail):
- # overloaded by backends
- return 0
-
def test_compile_linear_loop(self):
i0 = BoxInt()
i1 = BoxInt()
operations = [
ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
- ResOperation(rop.FINISH, [i1], None, descr=BasicFailDescr(1))
+ ResOperation(rop.FINISH, [i1], None, descr=BasicFinalDescr(1))
]
inputargs = [i0]
looptoken = JitCellToken()
self.cpu.compile_loop(inputargs, operations, looptoken)
deadframe = self.cpu.execute_token(looptoken, 2)
fail = self.cpu.get_latest_descr(deadframe)
- res = self.cpu.get_int_value(deadframe,
- self.find_pos_on_faildescr(fail))
+ res = self.cpu.get_int_value(deadframe, 0)
assert res == 3
assert fail.identifier == 1
@@ -137,7 +133,7 @@
i1 = BoxFloat()
operations = [
ResOperation(rop.FLOAT_ADD, [i0, constfloat(2.3)], i1),
- ResOperation(rop.FINISH, [i1], None, descr=BasicFailDescr(1))
+ ResOperation(rop.FINISH, [i1], None, descr=BasicFinalDescr(1))
]
inputargs = [i0]
looptoken = JitCellToken()
@@ -145,8 +141,7 @@
deadframe = self.cpu.execute_token(looptoken,
longlong.getfloatstorage(2.8))
fail = self.cpu.get_latest_descr(deadframe)
- res = self.cpu.get_float_value(deadframe,
- self.find_pos_on_faildescr(fail))
+ res = self.cpu.get_float_value(deadframe, 0)
assert longlong.getrealfloat(res) == 5.1
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 1
@@ -313,7 +308,7 @@
looptoken = JitCellToken()
operations = [
ResOperation(rop.GUARD_FALSE, [i0], None, descr=faildescr1),
- ResOperation(rop.FINISH, [], None, descr=BasicFailDescr(2)),
+ ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(2)),
]
inputargs = [i0]
operations[0].setfailargs([i0])
@@ -328,7 +323,7 @@
bridge.append(ResOperation(rop.GUARD_FALSE, [i0], None,
descr=BasicFailDescr(3)))
bridge.append(ResOperation(rop.FINISH, [], None,
- descr=BasicFailDescr(4)))
+ descr=BasicFinalDescr(4)))
bridge[-2].setfailargs(i1list)
self.cpu.compile_bridge(faildescr1, [i0], bridge, looptoken)
@@ -343,6 +338,8 @@
def test_finish(self):
i0 = BoxInt()
class UntouchableFailDescr(AbstractFailDescr):
+ final_descr = True
+
def __setattr__(self, name, value):
if (name == 'index' or name == '_carry_around_for_tests'
or name == '_TYPE'):
@@ -468,7 +465,7 @@
ResOperation(rop.GUARD_NO_OVERFLOW, [], None,
descr=BasicFailDescr(1)),
ResOperation(rop.FINISH, [v_res], None,
- descr=BasicFailDescr(2)),
+ descr=BasicFinalDescr(2)),
]
ops[1].setfailargs([])
else:
@@ -477,7 +474,7 @@
ResOperation(opnum, [v1, v2], v_res),
ResOperation(rop.GUARD_OVERFLOW, [], None,
descr=BasicFailDescr(1)),
- ResOperation(rop.FINISH, [], None,
descr=BasicFailDescr(2)),
+ ResOperation(rop.FINISH, [], None,
descr=BasicFinalDescr(2)),
]
ops[1].setfailargs([v_res])
#
@@ -1171,7 +1168,7 @@
values.append(longlong.getfloatstorage(r.random()))
#
looptoken = JitCellToken()
- faildescr = BasicFailDescr(42)
+ faildescr = BasicFinalDescr(42)
operations = []
retboxes = []
retvalues = []
@@ -1322,7 +1319,7 @@
i2 = BoxInt()
targettoken = TargetToken()
faildescr1 = BasicFailDescr(1)
- faildescr2 = BasicFailDescr(2)
+ faildescr2 = BasicFinalDescr(2)
operations = [
ResOperation(rop.LABEL, fboxes, None, descr=targettoken),
ResOperation(rop.FLOAT_LE, [fboxes[0], constfloat(9.2)], i2),
@@ -1360,7 +1357,7 @@
if not self.cpu.supports_floats:
py.test.skip("requires floats")
fboxes = [BoxFloat() for i in range(3)]
- faildescr1 = BasicFailDescr(100)
+ faildescr1 = BasicFinalDescr(100)
loopops = """
[i0,f1, f2]
f3 = float_add(f1, f2)
@@ -1414,7 +1411,7 @@
box = BoxInt()
res = BoxInt()
faildescr1 = BasicFailDescr(1)
- faildescr2 = BasicFailDescr(2)
+ faildescr2 = BasicFinalDescr(2)
inputargs = [box]
operations = [
ResOperation(opname, [box], res),
@@ -1458,7 +1455,7 @@
ibox2 = ConstInt(-42)
b1 = BoxInt()
faildescr1 = BasicFailDescr(1)
- faildescr2 = BasicFailDescr(2)
+ faildescr2 = BasicFinalDescr(2)
inputargs = [ib for ib in [ibox1, ibox2]
if isinstance(ib, BoxInt)]
operations = [
@@ -1510,7 +1507,7 @@
ibox2 = ConstInt(42)
b1 = BoxInt()
faildescr1 = BasicFailDescr(1)
- faildescr2 = BasicFailDescr(2)
+ faildescr2 = BasicFinalDescr(2)
inputargs = [ib for ib in [ibox1, ibox2]
if isinstance(ib, BoxInt)]
operations = [
@@ -1566,7 +1563,7 @@
fbox2 = constfloat(-4.5)
b1 = BoxInt()
faildescr1 = BasicFailDescr(1)
- faildescr2 = BasicFailDescr(2)
+ faildescr2 = BasicFinalDescr(2)
inputargs = [fb for fb in [fbox1, fbox2]
if isinstance(fb, BoxFloat)]
operations = [
@@ -1630,7 +1627,7 @@
operations.append(ResOperation(opnum, boxargs, boxres))
# Unique-ify inputargs
inputargs = list(set(inputargs))
- faildescr = BasicFailDescr(1)
+ faildescr = BasicFinalDescr(1)
operations.append(ResOperation(rop.FINISH, [], None,
descr=faildescr))
looptoken = JitCellToken()
@@ -1703,7 +1700,7 @@
ResOperation(guard_opnum, [box], None,
descr=BasicFailDescr(4)),
ResOperation(rop.FINISH, [], None,
- descr=BasicFailDescr(5))]
+ descr=BasicFinalDescr(5))]
operations[1].setfailargs([])
looptoken = JitCellToken()
# Use "set" to unique-ify inputargs
@@ -2226,7 +2223,7 @@
ResOperation(rop.CALL_MAY_FORCE, [funcbox, tok, i1], None,
descr=calldescr),
ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
- ResOperation(rop.FINISH, [i0], None, descr=BasicFailDescr(0))
+ ResOperation(rop.FINISH, [i0], None, descr=BasicFinalDescr(0))
]
ops[2].setfailargs([i1, i0])
looptoken = JitCellToken()
@@ -2272,7 +2269,7 @@
ResOperation(rop.CALL_MAY_FORCE, [funcbox, tok, i1], i2,
descr=calldescr),
ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
- ResOperation(rop.FINISH, [i2], None, descr=BasicFailDescr(0))
+ ResOperation(rop.FINISH, [i2], None, descr=BasicFinalDescr(0))
]
ops[2].setfailargs([i1, i2, i0])
looptoken = JitCellToken()
@@ -2320,7 +2317,7 @@
ResOperation(rop.CALL_MAY_FORCE, [funcbox, tok, i1], f2,
descr=calldescr),
ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
- ResOperation(rop.FINISH, [f2], None, descr=BasicFailDescr(0))
+ ResOperation(rop.FINISH, [f2], None, descr=BasicFinalDescr(0))
]
ops[2].setfailargs([i1, f2, i0])
looptoken = JitCellToken()
@@ -2362,7 +2359,7 @@
ResOperation(rop.CALL_RELEASE_GIL, [funcbox, i1], i2,
descr=calldescr),
ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
- ResOperation(rop.FINISH, [i2], None, descr=BasicFailDescr(0))
+ ResOperation(rop.FINISH, [i2], None, descr=BasicFinalDescr(0))
]
ops[1].setfailargs([i1, i2])
looptoken = JitCellToken()
@@ -2420,7 +2417,7 @@
ResOperation(rop.CALL_RELEASE_GIL, [funcbox, i0, i1, i2, i3], None,
descr=calldescr),
ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
- ResOperation(rop.FINISH, [], None, descr=BasicFailDescr(0))
+ ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(0))
]
ops[1].setfailargs([])
looptoken = JitCellToken()
@@ -2478,7 +2475,7 @@
]
ops[-1].setfailargs([])
ops += [
- ResOperation(rop.FINISH, [i3], None, descr=BasicFailDescr(0))
+ ResOperation(rop.FINISH, [i3], None, descr=BasicFinalDescr(0))
]
looptoken = JitCellToken()
self.cpu.compile_loop([i1, i2], ops, looptoken)
@@ -2499,7 +2496,7 @@
faildescr = BasicFailDescr(1)
ops = [
ResOperation(rop.GUARD_NOT_INVALIDATED, [], None, descr=faildescr),
- ResOperation(rop.FINISH, [i0], None, descr=BasicFailDescr(0))
+ ResOperation(rop.FINISH, [i0], None, descr=BasicFinalDescr(0))
]
ops[0].setfailargs([i1])
looptoken = JitCellToken()
@@ -2527,7 +2524,7 @@
faildescr2 = BasicFailDescr(2)
ops = [
ResOperation(rop.GUARD_NOT_INVALIDATED, [],None, descr=faildescr2),
- ResOperation(rop.FINISH, [i2], None, descr=BasicFailDescr(3))
+ ResOperation(rop.FINISH, [i2], None, descr=BasicFinalDescr(3))
]
ops[0].setfailargs([])
self.cpu.compile_bridge(faildescr, [i2], ops, looptoken)
@@ -2559,7 +2556,7 @@
ops = [
ResOperation(rop.GUARD_NOT_INVALIDATED, [], None, descr=faildescr),
ResOperation(rop.LABEL, [i0], None, descr=labeldescr),
- ResOperation(rop.FINISH, [i0], None, descr=BasicFailDescr(3)),
+ ResOperation(rop.FINISH, [i0], None, descr=BasicFinalDescr(3)),
]
ops[0].setfailargs([])
looptoken = JitCellToken()
@@ -3339,7 +3336,7 @@
p0 = BoxPtr()
operations = [
ResOperation(rop.NEWUNICODE, [i0], p0),
- ResOperation(rop.FINISH, [p0], None, descr=BasicFailDescr(1))
+ ResOperation(rop.FINISH, [p0], None, descr=BasicFinalDescr(1))
]
inputargs = [i0]
looptoken = JitCellToken()
@@ -3495,7 +3492,7 @@
operations = [
ResOperation(rop.INT_LE, [i0, ConstInt(1)], i1),
ResOperation(rop.GUARD_TRUE, [i1], None, descr=faildescr1),
- ResOperation(rop.FINISH, [i0], None, descr=BasicFailDescr(1234)),
+ ResOperation(rop.FINISH, [i0], None, descr=BasicFinalDescr(1234)),
]
operations[1].setfailargs([i0])
self.cpu.compile_loop(inputargs, operations, looptoken1)
@@ -3572,13 +3569,13 @@
operations = [
ResOperation(rop.GUARD_NONNULL_CLASS, [t_box, T_box], None,
descr=faildescr),
- ResOperation(rop.FINISH, [], None, descr=BasicFailDescr(1))]
+ ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(1))]
operations[0].setfailargs([])
looptoken = JitCellToken()
inputargs = [t_box]
self.cpu.compile_loop(inputargs, operations, looptoken)
operations = [
- ResOperation(rop.FINISH, [], None, descr=BasicFailDescr(99))
+ ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(99))
]
self.cpu.compile_bridge(faildescr, [], operations, looptoken)
deadframe = self.cpu.execute_token(looptoken, null_box.getref_base())
@@ -3709,7 +3706,7 @@
ResOperation(rop.CALL_MAY_FORCE, [funcbox, tok, i1], i2,
descr=calldescr),
ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
- ResOperation(rop.FINISH, [i2], None, descr=BasicFailDescr(0))
+ ResOperation(rop.FINISH, [i2], None, descr=BasicFinalDescr(0))
]
ops[2].setfailargs([i2])
looptoken = JitCellToken()
diff --git a/pypy/jit/backend/x86/arch.py b/pypy/jit/backend/x86/arch.py
--- a/pypy/jit/backend/x86/arch.py
+++ b/pypy/jit/backend/x86/arch.py
@@ -48,12 +48,14 @@
FORCE_INDEX_OFS = 0
SAVED_REGISTERS = 1 # range(1, 5)
MY_COPY_OF_REGS = 5 # range(5, 9)
+ JITFRAME_FIXED_SIZE = 1
else:
# rbp + rbx + r12 + r13 + r14 + r15 + 11 extra words + force_index = 18
FRAME_FIXED_SIZE = 18 # 18 aligned to 16 bytes = 2 * WORD
FORCE_INDEX_OFS = 0
SAVED_REGISTERS = 1 # range(1, 7)
MY_COPY_OF_REGS = 7 # range(7, 18)
+ JITFRAME_FIXED_SIZE = 1
# "My copy of regs" has room for almost all registers, apart from eax and edx
# which are used in the malloc itself. They are:
diff --git a/pypy/jit/backend/x86/assembler.py
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -1951,6 +1951,8 @@
# no malloc allowed here!! xxx apart from one, hacking a lot
#self.fail_ebp = allregisters[16 + ebp.value]
num = 0
+ import pdb
+ pdb.set_trace()
XXX
deadframe = lltype.nullptr(jitframe.DEADFRAME)
# step 1: lots of mess just to count the final value of 'num'
@@ -2156,7 +2158,14 @@
self.mc = None
def genop_finish(self, op, arglocs, result_loc):
- [argloc] = arglocs
+ if len(arglocs) == 2:
+ [return_val, argloc] = arglocs
+ if op.getarg(0).type == FLOAT:
+ self.mc.MOVSD_bx(0, return_val.value)
+ else:
+ self.mc.MOV_br(0, return_val.value)
+ else:
+ [argloc] = arglocs
if argloc is not eax:
self.mov(argloc, eax)
# exit function
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -4,7 +4,7 @@
import os
from pypy.jit.metainterp.history import (Box, Const, ConstInt, ConstPtr,
- ResOperation, BoxPtr, ConstFloat,
+ BoxPtr, ConstFloat,
BoxFloat, INT, REF, FLOAT,
TargetToken, JitCellToken)
from pypy.jit.backend.x86.regloc import *
@@ -13,18 +13,17 @@
from pypy.rlib import rgc
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.backend.x86.jump import remap_frame_layout_mixed
-from pypy.jit.codewriter import heaptracker, longlong
+from pypy.jit.codewriter import longlong
from pypy.jit.codewriter.effectinfo import EffectInfo
from pypy.jit.metainterp.resoperation import rop
-from pypy.jit.backend.llsupport.descr import FieldDescr, ArrayDescr
-from pypy.jit.backend.llsupport.descr import CallDescr, SizeDescr
-from pypy.jit.backend.llsupport.descr import InteriorFieldDescr
+from pypy.jit.backend.llsupport.descr import ArrayDescr
+from pypy.jit.backend.llsupport.descr import CallDescr
from pypy.jit.backend.llsupport.descr import unpack_arraydescr
from pypy.jit.backend.llsupport.descr import unpack_fielddescr
from pypy.jit.backend.llsupport.descr import unpack_interiorfielddescr
from pypy.jit.backend.llsupport.regalloc import FrameManager, RegisterManager,\
TempBox, compute_vars_longevity, is_comparison_or_ovf_op
-from pypy.jit.backend.x86.arch import WORD, FRAME_FIXED_SIZE
+from pypy.jit.backend.x86.arch import WORD, JITFRAME_FIXED_SIZE
from pypy.jit.backend.x86.arch import IS_X86_32, IS_X86_64, MY_COPY_OF_REGS
from pypy.jit.backend.x86 import rx86
from pypy.rlib.rarithmetic import r_longlong
@@ -133,10 +132,7 @@
class X86FrameManager(FrameManager):
@staticmethod
def frame_pos(i, box_type):
- if IS_X86_32 and box_type == FLOAT:
- return StackLoc(i, get_ebp_ofs(i+1), box_type)
- else:
- return StackLoc(i, get_ebp_ofs(i), box_type)
+ return StackLoc(i, get_ebp_ofs(i), box_type)
@staticmethod
def frame_size(box_type):
if IS_X86_32 and box_type == FLOAT:
@@ -498,11 +494,13 @@
# the frame is in ebp, but we have to point where in the frame is
# the potential argument to FINISH
descr = op.getdescr()
- self.force_spill_var(op.getarg(0))
- loc = self.loc(op.getarg(0))
- descr._x86_result_offset = loc.value
fail_no = self.assembler.cpu.get_fail_descr_number(descr)
- self.Perform(op, [imm(fail_no)], None)
+ if op.numargs() == 1:
+ loc = self.make_sure_var_in_reg(op.getarg(0))
+ locs = [loc, imm(fail_no)]
+ else:
+ locs = [imm(fail_no)]
+ self.Perform(op, locs, None)
self.possibly_free_var(op.getarg(0))
def consider_guard_no_exception(self, op):
@@ -1481,9 +1479,9 @@
def get_ebp_ofs(position):
# Argument is a frame position (0, 1, 2...).
- # Returns (ebp-20), (ebp-24), (ebp-28)...
+ # Returns (ebp+20), (ebp+24), (ebp+28)...
# i.e. the n'th word beyond the fixed frame size.
- return WORD * position
+ return WORD * (position + JITFRAME_FIXED_SIZE)
def _valid_addressing_size(size):
return size == 1 or size == 2 or size == 4 or size == 8
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -8,7 +8,8 @@
from pypy.jit.codewriter import longlong
from pypy.jit.metainterp import history, compile
from pypy.jit.backend.x86.assembler import Assembler386
-from pypy.jit.backend.x86.arch import FORCE_INDEX_OFS, IS_X86_32
+from pypy.jit.backend.x86.arch import (FORCE_INDEX_OFS, IS_X86_32,
+ JITFRAME_FIXED_SIZE)
from pypy.jit.backend.x86.profagent import ProfileAgent
from pypy.jit.backend.llsupport.llmodel import AbstractLLCPU
from pypy.jit.backend.llsupport import jitframe
@@ -114,7 +115,8 @@
addr = executable_token._x86_function_addr
func = rffi.cast(FUNCPTR, addr)
#llop.debug_print(lltype.Void, ">>>> Entering", addr)
- frame = lltype.malloc(jitframe.JITFRAME, clt.frame_depth)
+ frame = lltype.malloc(jitframe.JITFRAME, clt.frame_depth +
+ JITFRAME_FIXED_SIZE)
frame.jf_frame_info = clt.frame_info
ll_frame = lltype.cast_opaque_ptr(llmemory.GCREF, frame)
prev_interpreter = None # help flow space
@@ -123,7 +125,7 @@
LLInterpreter.current_interpreter = self.debug_ll_interpreter
try:
# XXX RPythonize
- num = 0
+ num = JITFRAME_FIXED_SIZE * WORD
for arg in args:
if isinstance(arg, int):
self.set_int_value(frame, num, arg)
@@ -207,17 +209,17 @@
"""
descr = self.gc_ll_descr.getframedescrs(self).arraydescr
ofs = self.unpack_arraydescr(descr)
- self.write_int_at_mem(newframe, ofs + index * WORD, WORD, 1, value)
+ self.write_int_at_mem(newframe, ofs + index, WORD, 1, value)
def set_ref_value(self, newframe, index, value):
descr = self.gc_ll_descr.getframedescrs(self).arraydescr
ofs = self.unpack_arraydescr(descr)
- self.write_ref_at_mem(newframe, ofs + index * WORD, value)
+ self.write_ref_at_mem(newframe, ofs + index, value)
def set_float_value(self, newframe, index, value):
descr = self.gc_ll_descr.getframedescrs(self).arraydescr
ofs = self.unpack_arraydescr(descr)
- self.write_float_at_mem(newframe, ofs + index * WORD, value)
+ self.write_float_at_mem(newframe, ofs + index, value)
class CPU386(AbstractX86CPU):
backend_name = 'x86'
diff --git a/pypy/jit/backend/x86/test/test_runner.py
b/pypy/jit/backend/x86/test/test_runner.py
--- a/pypy/jit/backend/x86/test/test_runner.py
+++ b/pypy/jit/backend/x86/test/test_runner.py
@@ -33,9 +33,6 @@
# for the individual tests see
# ====> ../../test/runner_test.py
- def find_pos_on_faildescr(self, descr):
- return descr._x86_result_offset
-
add_loop_instructions = ['mov', 'add', 'test', 'je', 'jmp']
if WORD == 4:
bridge_loop_instructions = ['lea', 'jmp']
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -412,7 +412,7 @@
# ____________________________________________________________
class _DoneWithThisFrameDescr(AbstractFailDescr):
- pass
+ final_descr = True
class DoneWithThisFrameDescrVoid(_DoneWithThisFrameDescr):
def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -166,12 +166,19 @@
class AbstractFailDescr(AbstractDescr):
index = -1
+ final_descr = False
def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
raise NotImplementedError
def compile_and_attach(self, metainterp, new_loop):
raise NotImplementedError
+class BasicFinalDescr(AbstractFailDescr):
+ final_descr = True
+
+ def __init__(self, identifier=None):
+ self.identifier = identifier # for testing
+
class BasicFailDescr(AbstractFailDescr):
def __init__(self, identifier=None):
self.identifier = identifier # for testing
diff --git a/pypy/jit/metainterp/resoperation.py
b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -6,6 +6,10 @@
op.initarglist(args)
if descr is not None:
assert isinstance(op, ResOpWithDescr)
+ if opnum == rop.FINISH:
+ assert descr.final_descr
+ elif op.is_guard():
+ assert not descr.final_descr
op.setdescr(descr)
return op
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -1279,17 +1279,6 @@
def write_a_float(self, index, float):
self.blackholeinterp.setarg_f(index, float)
-def resume_renum(list_of_positions, storage):
- num = storage.rd_numb
- while num:
- i = 0
- while i < len(num.nums):
- pos, flags = untag(num.nums[i])
- if flags == TAGBOX:
- num.nums[i] = tag(list_of_positions[pos], TAGBOX)
- i += 1
- num = num.prev
-
# ____________________________________________________________
def dump_storage(storage, liveboxes):
diff --git a/pypy/jit/metainterp/test/test_resume.py
b/pypy/jit/metainterp/test/test_resume.py
--- a/pypy/jit/metainterp/test/test_resume.py
+++ b/pypy/jit/metainterp/test/test_resume.py
@@ -499,22 +499,6 @@
assert snapshot.prev is fs[2].parent_resumedata_snapshot
assert snapshot.boxes == fs[2]._env
-def test_renaming():
- b1, b2, b3 = [BoxInt(), BoxPtr(), BoxInt()]
- c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]
- fs = [FakeFrame("code0", 0, b1, c1, b2)]
-
- storage = Storage()
- capture_resumedata(fs, None, [], storage)
- memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
- modifier.finish(FakeOptimizer({}))
- resume_renum([10, 20], storage)
- for num, x in zip(storage.rd_numb.prev.nums, [10, 20]):
- pos, tag = untag(num)
- if tag == TAGBOX:
- assert pos == x
-
class FakeMetaInterpStaticData:
cpu = LLtypeMixin.cpu
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -49,7 +49,9 @@
return newop
-def default_fail_descr(model, fail_args=None):
+def default_fail_descr(model, opnum, fail_args=None):
+ if opnum == rop.FINISH:
+ return model.BasicFinalDescr()
return model.BasicFailDescr()
@@ -244,14 +246,14 @@
"Unknown var in fail_args: %s" % arg)
fail_args.append(fail_arg)
if descr is None and self.invent_fail_descr:
- descr = self.invent_fail_descr(self.model, fail_args)
+ descr = self.invent_fail_descr(self.model, opnum, fail_args)
if hasattr(descr, '_oparser_uses_descr_of_guard'):
descr._oparser_uses_descr_of_guard(self, fail_args)
else:
fail_args = None
if opnum == rop.FINISH:
if descr is None and self.invent_fail_descr:
- descr = self.invent_fail_descr(self.model, fail_args)
+ descr = self.invent_fail_descr(self.model, opnum,
fail_args)
elif opnum == rop.JUMP:
if descr is None and self.invent_fail_descr:
descr = self.original_jitcell_token
diff --git a/pypy/jit/tool/oparser_model.py b/pypy/jit/tool/oparser_model.py
--- a/pypy/jit/tool/oparser_model.py
+++ b/pypy/jit/tool/oparser_model.py
@@ -6,7 +6,7 @@
from pypy.jit.metainterp.history import TreeLoop, JitCellToken
from pypy.jit.metainterp.history import Box, BoxInt, BoxFloat
from pypy.jit.metainterp.history import ConstInt, ConstObj, ConstPtr,
ConstFloat
- from pypy.jit.metainterp.history import BasicFailDescr, TargetToken
+ from pypy.jit.metainterp.history import BasicFailDescr,
BasicFinalDescr, TargetToken
from pypy.jit.metainterp.typesystem import llhelper
from pypy.jit.metainterp.history import get_const_ptr_for_string
@@ -49,6 +49,9 @@
class BasicFailDescr(object):
I_am_a_descr = True
+ class BasicFinalDescr(object):
+ I_am_a_descr = True
+
class Box(object):
_counter = 0
type = 'b'
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit