Author: fijal
Branch: jit-leaner-frontend
Changeset: r82244:86783301e2bd
Date: 2016-02-14 16:15 +0100
http://bitbucket.org/pypy/pypy/changeset/86783301e2bd/

Log:    fix oparser up to the point. I'm not completely convinced what's the
        point of MockLoopModel any more

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
@@ -13,7 +13,6 @@
 class TraceIterator(object):
     def __init__(self, trace, end):
         self.trace = trace
-        self.inpargs = trace._inpargs
         self.pos = 0
         self._count = 0
         self.end = end
@@ -21,7 +20,7 @@
 
     def _get(self, i):
         if i < 0:
-            return self.inpargs[-i-1]
+            return self.trace.inputargs[-i - 1]
         res = self._cache[i]
         assert res is not None
         return res
@@ -40,6 +39,8 @@
             return self._get(v)
         elif tag == TAGINT:
             return ConstInt(v)
+        elif tag == TAGCONST:
+            return self.trace._consts[v]
         else:
             yyyy
 
@@ -54,7 +55,11 @@
         for i in range(argnum):
             args.append(self._untag(self._next()))
         if opwithdescr[opnum]:
-            xxx
+            descr_index = self._next()
+            if descr_index == -1:
+                descr = None
+            else:
+                descr = self.trace._descrs[descr_index]
         else:
             descr = None
         res = ResOperation(opnum, args, -1, descr=descr)
@@ -65,10 +70,26 @@
 class Trace(object):
     def __init__(self, inputargs):
         self._ops = []
+        self._descrs = [None]
+        self._consts = [None]
         for i, inparg in enumerate(inputargs):
             inparg.position = -i - 1
         self._count = 0
-        self._inpargs = inputargs
+        self.inputargs = inputargs
+
+    def _encode(self, box):
+        if isinstance(box, Const):
+            if isinstance(box, ConstInt) and box.getint() < MAXINT:
+                return tag(TAGINT, box.getint())
+            else:
+                self._consts.append(box)
+                return tag(TAGCONST, len(self._consts) - 1)
+        elif isinstance(box, AbstractResOp):
+            return tag(TAGBOX, box.position)
+        elif isinstance(box, AbstractInputArg):
+            return tag(TAGBOX, box.position)
+        else:
+            assert False, "unreachable code"
 
     def _record_op(self, opnum, argboxes, descr=None):
         operations = self._ops
@@ -76,9 +97,12 @@
         operations.append(opnum)
         if oparity[opnum] == -1:
             operations.append(len(argboxes))
-        operations.extend([encode(box) for box in argboxes])
-        if descr is not None:
-            operations.append(encode(descr))
+        operations.extend([self._encode(box) for box in argboxes])
+        if opwithdescr[opnum]:
+            if descr is None:
+                operations.append(-1)
+            else:
+                operations.append(self._encode_descr(descr))
         self._count += 1
         return pos
 
@@ -94,6 +118,12 @@
         self._count += 1
         return pos        
 
+    def _encode_descr(self, descr):
+        # XXX provide a global cache for prebuilt descrs so we don't
+        #     have to repeat them here        
+        self._descrs.append(descr)
+        return len(self._descrs) - 1
+
     def record_forwarding(self, op, newtag):
         index = op._pos
         self._ops[index] = -newtag - 1
@@ -123,18 +153,3 @@
 
 def untag(tagged):
     return intmask(tagged) & TAGMASK, intmask(tagged) >> TAGSHIFT
-
-def encode(box):
-    if isinstance(box, Const):
-        if isinstance(box, ConstInt) and box.getint() < MAXINT:
-            return tag(TAGINT, box.getint())
-        else:
-            yyy
-    elif isinstance(box, AbstractResOp):
-        return tag(TAGBOX, box.position)
-    elif isinstance(box, AbstractInputArg):
-        return tag(TAGBOX, box.position)
-    elif isinstance(box, AbstractDescr):
-        pass
-    else:
-        yyy
diff --git a/rpython/jit/metainterp/resoperation.py 
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -95,7 +95,7 @@
         assert isinstance(op, ResOpWithDescr)
         if opnum == rop.FINISH:
             assert descr.final_descr
-        elif op.is_guard():
+        elif OpHelpers.is_guard(opnum):
             assert not descr.final_descr
         op.setdescr(descr)
     op.inittype()
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -408,10 +408,7 @@
         if num < len(newlines):
             raise ParseError("unexpected dedent at line: %s" % newlines[num])
         self.trace.comment = first_comment
-        #self.trace.original_jitcell_token = self.original_jitcell_token
-        #loop.operations = ops
-        #loop.inputargs = inpargs
-        #loop.last_offset = last_offset
+        self.trace.original_jitcell_token = self.original_jitcell_token
         return self.trace
 
     def record(self, opnum, args, descr):
diff --git a/rpython/jit/tool/oparser_model.py 
b/rpython/jit/tool/oparser_model.py
--- a/rpython/jit/tool/oparser_model.py
+++ b/rpython/jit/tool/oparser_model.py
@@ -29,7 +29,6 @@
 
 def get_mock_model():
     class MockLoopModel(object):
-
         class TreeLoop(object):
             def __init__(self, name):
                 self.name = name
diff --git a/rpython/jit/tool/test/test_oparser.py 
b/rpython/jit/tool/test/test_oparser.py
--- a/rpython/jit/tool/test/test_oparser.py
+++ b/rpython/jit/tool/test/test_oparser.py
@@ -29,7 +29,7 @@
         assert [op.getopnum() for op in ops] == [rop.INT_ADD, rop.INT_SUB,
                                                         rop.FINISH]
         assert len(loop.inputargs) == 2
-        assert loop.operations[-1].getdescr()
+        assert ops[-1].getdescr()
 
     def test_const_ptr_subops(self):
         x = """
@@ -39,9 +39,10 @@
         S = lltype.Struct('S')
         vtable = lltype.nullptr(S)
         loop = self.parse(x, None, locals())
-        assert len(loop.operations) == 1
-        assert loop.operations[0].getdescr()
-        assert loop.operations[0].getfailargs() == []
+        ops = loop._get_operations()
+        assert len(ops) == 1
+        assert ops[0].getdescr()
+        assert not ops[0].getfailargs()
 
     def test_descr(self):
         class Xyz(AbstractDescr):
@@ -53,7 +54,8 @@
         """
         stuff = Xyz()
         loop = self.parse(x, None, locals())
-        assert loop.operations[0].getdescr() is stuff
+        ops = loop._get_operations()
+        assert ops[0].getdescr() is stuff
 
     def test_after_fail(self):
         x = """
@@ -62,7 +64,7 @@
         i1 = int_add(1, 2)
         """
         loop = self.parse(x, None, {})
-        assert len(loop.operations) == 2
+        assert len(loop._get_operations()) == 2
 
     def test_descr_setfield(self):
         class Xyz(AbstractDescr):
@@ -74,7 +76,7 @@
         """
         stuff = Xyz()
         loop = self.parse(x, None, locals())
-        assert loop.operations[0].getdescr() is stuff
+        assert loop._get_operations()[0].getdescr() is stuff
 
     def test_getvar_const_ptr(self):
         x = '''
@@ -84,7 +86,7 @@
         TP = lltype.GcArray(lltype.Signed)
         NULL = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.nullptr(TP))
         loop = self.parse(x, None, {'func_ptr' : NULL})
-        assert loop.operations[0].getarg(0).value == NULL
+        assert loop._get_operations()[0].getarg(0).value == NULL
 
     def test_jump_target(self):
         x = '''
@@ -92,7 +94,7 @@
         jump()
         '''
         loop = self.parse(x)
-        assert loop.operations[0].getdescr() is loop.original_jitcell_token
+        assert loop._get_operations()[0].getdescr() is 
loop.original_jitcell_token
 
     def test_jump_target_other(self):
         looptoken = JitCellToken()
@@ -102,7 +104,7 @@
         jump(descr=looptoken)
         '''
         loop = self.parse(x, namespace=locals())
-        assert loop.operations[0].getdescr() is looptoken
+        assert loop._get_operations()[0].getdescr() is looptoken
 
     def test_floats(self):
         x = '''
@@ -110,7 +112,7 @@
         f1 = float_add(f0, 3.5)
         '''
         loop = self.parse(x)
-        box = loop.operations[0].getarg(0)
+        box = loop._get_operations()[0].getarg(0)
         # we cannot use isinstance, because in case of mock the class will be
         # constructed on the fly
         assert box.__class__.__name__ == 'InputArgFloat'
@@ -124,12 +126,13 @@
         debug_merge_point(0, 0, '(stuff) #1')
         '''
         loop = self.parse(x)
-        assert loop.operations[0].getarg(2)._get_str() == 'info'
-        assert loop.operations[0].getarg(1).value == 0
-        assert loop.operations[1].getarg(2)._get_str() == 'info'
-        assert loop.operations[2].getarg(2)._get_str() == "<some ('other.')> 
info"
-        assert loop.operations[2].getarg(1).value == 1
-        assert loop.operations[3].getarg(2)._get_str() == "(stuff) #1"
+        ops = loop._get_operations()
+        assert ops[0].getarg(2)._get_str() == 'info'
+        assert ops[0].getarg(1).value == 0
+        assert ops[1].getarg(2)._get_str() == 'info'
+        assert ops[2].getarg(2)._get_str() == "<some ('other.')> info"
+        assert ops[2].getarg(1).value == 1
+        assert ops[3].getarg(2)._get_str() == "(stuff) #1"
 
 
     def test_descr_with_obj_print(self):
@@ -165,7 +168,7 @@
         p0 = new(, descr=<SizeDescr 12>)
         '''
         loop = self.parse(x)
-        assert loop.operations[0].getopname() == 'new'
+        assert loop._get_operations()[0].getopname() == 'new'
 
     def test_no_fail_args(self):
         x = '''
@@ -173,7 +176,7 @@
         guard_true(i0, descr=<Guard0>)
         '''
         loop = self.parse(x, nonstrict=True)
-        assert loop.operations[0].getfailargs() == []
+        assert not loop._get_operations()[0].getfailargs()
 
     def test_offsets(self):
         x = """
@@ -209,8 +212,9 @@
         jump(i0, descr=1)
         """
         loop = self.parse(x)
-        assert loop.operations[0].getdescr() is loop.operations[1].getdescr()
-        assert isinstance(loop.operations[0].getdescr(), TargetToken)
+        ops = loop._get_operations()
+        assert ops[0].getdescr() is ops[1].getdescr()
+        assert isinstance(ops[0].getdescr(), TargetToken)
 
 
 class ForbiddenModule(object):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to