[pypy-svn] r65374 - pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test
fijal at codespeak.net
fijal at codespeak.net
Sun May 24 02:41:36 CEST 2009
Author: fijal
Date: Sun May 24 02:41:34 2009
New Revision: 65374
Modified:
pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/oparser.py
pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_oparser.py
Log:
Progress on a parser
Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/oparser.py (original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/oparser.py Sun May 24 02:41:34 2009
@@ -3,16 +3,20 @@
in a nicer fashion
"""
-from pypy.jit.metainterp.history import TreeLoop, BoxInt, BoxPtr, ConstInt
+from pypy.jit.metainterp.history import TreeLoop, BoxInt, BoxPtr, ConstInt,\
+ ConstAddr
from pypy.jit.metainterp.resoperation import rop, ResOperation
+from pypy.rpython.lltypesystem import lltype, llmemory
class ParseError(Exception):
pass
class OpParser(object):
- def __init__(self, descr):
+ def __init__(self, descr, cpu, namespace):
self.descr = descr
self.vars = {}
+ self.cpu = cpu
+ self.consts = namespace
def box_for_var(self, elem):
if elem.startswith('i'):
@@ -39,6 +43,10 @@
try:
return ConstInt(int(arg))
except ValueError:
+ if arg.startswith('ConstAddr('):
+ name = arg[len('ConstAddr('):-1]
+ return ConstAddr(llmemory.cast_ptr_to_adr(self.consts[name]),
+ self.cpu)
return self.vars[arg]
def parse_op(self, line):
@@ -50,7 +58,7 @@
opnum = getattr(rop, opname.upper())
except AttributeError:
raise ParseError("unknown op: %s" % opname)
- endnum = line.find(')')
+ endnum = line.rfind(')')
if endnum == -1:
raise ParseError("invalid line: %s" % line)
argspec = line[num + 1:endnum]
@@ -89,22 +97,47 @@
def parse(self):
lines = self.descr.split("\n")
- inpargs = None
ops = []
+ newlines = []
for line in lines:
- line = line.strip()
- if not line or line.startswith("#"):
+ if not line.strip() or line.strip().startswith("#"):
continue # a comment
- if inpargs is None:
- if not line.startswith('[') or not line.endswith(']'):
- raise ParseError("Wrong header: %s" % line)
- inpargs = self.parse_header_line(line[1:-1])
- else:
- ops.append(self.parse_next_op(line))
+ newlines.append(line)
+ base_indent, inpargs = self.parse_inpargs(newlines[0])
+ newlines = newlines[1:]
+ num, ops = self.parse_ops(base_indent, newlines, 0)
+ if num < len(newlines):
+ raise ParseError("unexpected dedent at line: %s" % newlines[num])
loop = TreeLoop("loop")
loop.operations = ops
loop.inputargs = inpargs
return loop
-def parse(descr):
- return OpParser(descr).parse()
+ def parse_ops(self, indent, lines, start):
+ num = start
+ ops = []
+ while num < len(lines):
+ line = lines[num]
+ if not line.startswith(" " * indent):
+ # dedent
+ return num, ops
+ elif line.startswith(" "*(indent + 1)):
+ # suboperations
+ new_indent = len(line) - len(line.lstrip())
+ num, suboperations = self.parse_ops(new_indent, lines, num)
+ ops[-1].suboperations = suboperations
+ else:
+ ops.append(self.parse_next_op(lines[num].strip()))
+ num += 1
+ return num, ops
+
+ def parse_inpargs(self, line):
+ base_indent = line.find('[')
+ line = line.strip()
+ if base_indent == -1 or not line.endswith(']'):
+ raise ParseError("Wrong header: %s" % line)
+ inpargs = self.parse_header_line(line[1:-1])
+ return base_indent, inpargs
+
+def parse(descr, cpu=None, namespace={}):
+ return OpParser(descr, cpu, namespace).parse()
Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_oparser.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_oparser.py (original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_oparser.py Sun May 24 02:41:34 2009
@@ -1,4 +1,6 @@
+from pypy.rpython.lltypesystem import lltype
+
from pypy.jit.metainterp.test.oparser import parse
from pypy.jit.metainterp.resoperation import rop
@@ -15,3 +17,16 @@
assert [op.opnum for op in loop.operations] == [rop.INT_ADD, rop.INT_SUB,
rop.FAIL]
assert len(loop.inputargs) == 2
+
+def test_const_ptr_subops():
+ x = """
+ [p0]
+ guard_class(p0, ConstAddr(vtable))
+ fail()
+ """
+ S = lltype.Struct('S')
+ vtable = lltype.nullptr(S)
+ loop = parse(x, None, locals())
+ assert len(loop.operations) == 1
+ assert len(loop.operations[0].suboperations) == 1
+
More information about the Pypy-commit
mailing list