Author: fijal
Branch: jit-leaner-frontend
Changeset: r82925:7fef527aef0b
Date: 2016-03-10 10:44 +0200
http://bitbucket.org/pypy/pypy/changeset/7fef527aef0b/

Log:    use more hypothesis and fix the next problem

diff --git a/rpython/jit/metainterp/opencoder.py 
b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -47,6 +47,7 @@
     def get_size_jitcode_pc(self):
         if self.save_pos >= 0:
             self.pos = self.save_pos
+            self.save_pos = -1
         size = self._next()
         if size < 0:
             self.save_pos = self.pos
diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1581,6 +1581,7 @@
         effectinfo = descr.get_extra_info()
         if effectinfo.oopspecindex == effectinfo.OS_NOT_IN_TRACE:
             return self.metainterp.do_not_in_trace_call(allboxes, descr)
+        cut_pos = self.metainterp.history.get_trace_position()
 
         if (assembler_call or
                 effectinfo.check_forces_virtual_or_virtualizable()):
@@ -1618,8 +1619,8 @@
             self.metainterp.vrefs_after_residual_call()
             vablebox = None
             if assembler_call:
-                vablebox, resbox = self.metainterp.direct_assembler_call(
-                    assembler_call_jd)
+                vablebox, resbox = 
self.metainterp.direct_assembler_call(resbox,
+                    assembler_call_jd, cut_pos)
             if resbox and resbox.type != 'v':
                 self.make_result_of_lastop(resbox)
             self.metainterp.vable_after_residual_call(funcbox)
@@ -3007,11 +3008,11 @@
         newop.copy_value_from(op)
         return newop
 
-    def direct_assembler_call(self, targetjitdriver_sd):
+    def direct_assembler_call(self, op, targetjitdriver_sd, cut_pos):
         """ Generate a direct call to assembler for portal entry point,
         patching the CALL_MAY_FORCE that occurred just now.
         """
-        op = self.history.operations.pop()
+        self.history.cut(cut_pos)
         assert op.is_call_may_force()
         num_green_args = targetjitdriver_sd.num_green_args
         arglist = op.getarglist()
@@ -3021,8 +3022,9 @@
         warmrunnerstate = targetjitdriver_sd.warmstate
         token = warmrunnerstate.get_assembler_token(greenargs)
         opnum = OpHelpers.call_assembler_for_descr(op.getdescr())
-        op = op.copy_and_change(opnum, args=args, descr=token)
-        self.history.operations.append(op)
+        oldop = op
+        op = self.history.record_nospec(opnum, args, descr=token)
+        op.copy_value_from(oldop)
         if opnum == rop.CALL_ASSEMBLER_N:
             op = None
         #
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -200,14 +200,12 @@
 class NumberingState(object):
     def __init__(self, size):
         self.liveboxes = {}
-        self.current = [rffi.cast(rffi.SHORT, 0)] * (size + 2)
-        self.position = 0
+        self.current = []
         self.n = 0
         self.v = 0
 
     def append(self, item):
-        self.current[self.position] = item
-        self.position += 1
+        self.current.append(item)
 
 class ResumeDataLoopMemo(object):
 
@@ -317,15 +315,13 @@
         #self._number_boxes(topsnapshot.boxes, optimizer, state)
         #assert state.position == special_boxes_size
 
-        total = 2
         while not snapshot_iter.done():
             size, jitcode_index, pc = snapshot_iter.get_size_jitcode_pc()
-            total += 2 + size
             state.append(rffi.cast(rffi.SHORT, jitcode_index))
             state.append(rffi.cast(rffi.SHORT, pc))
             self._number_boxes(snapshot_iter, size, optimizer, state)
 
-        numb = resumecode.create_numbering(state.current, total)
+        numb = resumecode.create_numbering(state.current)
         return numb, state.liveboxes, state.v
         
     def forget_numberings(self):
diff --git a/rpython/jit/metainterp/test/strategies.py 
b/rpython/jit/metainterp/test/strategies.py
--- a/rpython/jit/metainterp/test/strategies.py
+++ b/rpython/jit/metainterp/test/strategies.py
@@ -12,27 +12,64 @@
 boxlists = strategies.lists(boxes, min_size=1).flatmap(
     lambda cis: strategies.lists(strategies.sampled_from(cis)))
 
+const_or_box = strategies.sampled_from(['const', 'box'])
+
+class JitCode(object):
+    def __init__(self, index):
+        self.index = index
+
+class Frame(object):
+    parent_resumedata_position = -1
+
+    def __init__(self, jitcode, pc, boxes):
+        self.jitcode = jitcode
+        self.pc = pc
+        self.boxes = boxes
+
+    def get_list_of_active_boxes(self, flag):
+        return self.boxes
+
+def get_arg(draw, all_ops, allow_const=True):
+    if allow_const:
+        tp = draw(const_or_box)
+        if tp == 'const':
+            return draw(intconsts)
+    return draw(strategies.sampled_from(all_ops))
+
+def gen_int_add(draw, all_ops, framestack):
+    arg0 = get_arg(draw, all_ops)
+    arg1 = get_arg(draw, all_ops)
+    res = ResOperation(rop.INT_ADD, [arg0, arg1])
+    all_ops.add(res)
+    return res
+
+def gen_guard_true(draw, all_ops, framestack):
+    arg = get_arg(draw, all_ops, allow_const=False)
+    res = ResOperation(rop.GUARD_TRUE, [arg])
+    if draw(strategies.booleans()):
+        s = []
+        for i in range(10):
+            s.append(get_arg(draw, all_ops, allow_const=False))
+        boxes = list(set(s))
+        framestack.append(Frame(JitCode(1), 2, boxes))
+    res.framestack = framestack[:]
+    return res
+
+resops = strategies.sampled_from([gen_int_add, gen_guard_true])
+
 @strategies.composite
 def lists_of_operations(draw, inputboxes=intboxes):
-    def get(draw, l1, l2, index):
-        if index < len(l1):
-            return l1[index]
-        index -= len(l1)
-        if index >= len(l2):
-            return draw(intconsts)
-        return l2[index]
-
     size = draw(strategies.integers(min_value=1, max_value=100))
     inputargs = []
     for i in range(size):
         inputargs.append(draw(inputboxes))
     size = draw(strategies.integers(min_value=1, max_value=100))
     ops = []
+    all_ops = set(inputargs)
+    framestack = [Frame(JitCode(1), 2, [])]
     for i in range(size):
-        s = strategies.integers(min_value=0, max_value=len(inputargs) + 2 * 
len(ops))
-        arg0 = get(draw, inputargs, ops, draw(s))
-        arg1 = get(draw, inputargs, ops, draw(s))
-        ops.append(ResOperation(rop.INT_ADD, [arg0, arg1], -1))
+        opgen = draw(resops)
+        ops.append(opgen(draw, all_ops, framestack))
     return inputargs, ops
 
 if __name__ == '__main__':
diff --git a/rpython/jit/metainterp/test/test_opencoder.py 
b/rpython/jit/metainterp/test/test_opencoder.py
--- a/rpython/jit/metainterp/test/test_opencoder.py
+++ b/rpython/jit/metainterp/test/test_opencoder.py
@@ -43,7 +43,17 @@
         iter = t.get_iter()
         l = []
         while not iter.done():
-            l.append(iter.next())
+            op = iter.next()
+            if op.is_guard():
+                op.framestack = []
+                si = iter.get_snapshot_iter(op.rd_resume_position)
+                while not si.done():
+                    size, jitcode, pc = si.get_size_jitcode_pc()
+                    boxes = []
+                    for i in range(size):
+                        boxes.append(si.next())
+                    op.framestack.append(FakeFrame(JitCode(jitcode), pc, 
boxes))
+            l.append(op)
         return iter.inputargs, l, iter
 
     def test_simple_iterator(self):
@@ -121,6 +131,10 @@
         t = Trace(inputargs)
         for op in ops:
             newop = t.record_op(op.getopnum(), op.getarglist())
+            newop.orig_op = op
+            if newop.is_guard():
+                resume.capture_resumedata(op.framestack,
+                    None, [], t)
             op.position = newop.position
         inpargs, l, iter = self.unpack(t)
         loop1 = TreeLoop("loop1")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to