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