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

Reply via email to