[pypy-svn] r66915 - pypy/branch/pyjitpl5/pypy/jit/metainterp/test
fijal at codespeak.net
fijal at codespeak.net
Tue Aug 18 16:49:52 CEST 2009
Author: fijal
Date: Tue Aug 18 16:49:51 2009
New Revision: 66915
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/oparser.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_oparser.py
Log:
(fijal, pedronis) A syntax for jumps
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/oparser.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/oparser.py Tue Aug 18 16:49:51 2009
@@ -49,13 +49,15 @@
getattr(boxes, name).value = value
class OpParser(object):
- def __init__(self, descr, cpu, namespace, type_system, boxkinds):
+ def __init__(self, descr, cpu, namespace, type_system, boxkinds, jump_targets):
self.descr = descr
self.vars = {}
self.cpu = cpu
self.consts = namespace
self.type_system = type_system
self.boxkinds = boxkinds or {}
+ self.jumps = []
+ self.jump_targets = jump_targets
def box_for_var(self, elem):
try:
@@ -170,6 +172,8 @@
def parse_op_no_result(self, line):
opnum, args, descr = self.parse_op(line)
res = ResOperation(opnum, args, None, descr)
+ if opnum == rop.JUMP:
+ self.jumps.append(res)
return res
def parse_next_op(self, line):
@@ -192,6 +196,15 @@
if num < len(newlines):
raise ParseError("unexpected dedent at line: %s" % newlines[num])
loop = ExtendedTreeLoop("loop")
+ if (self.jump_targets is not None and
+ len(self.jump_targets) != len(self.jumps)):
+ raise ParseError("Wrong number of jump targets")
+ if self.jump_targets is None:
+ for jump in self.jumps:
+ jump.jump_target = loop
+ else:
+ for jump, jump_target in zip(self.jumps, self.jump_targets):
+ jump.jump_target = jump_target
loop.operations = ops
loop.inputargs = inpargs
return loop
@@ -225,10 +238,10 @@
return base_indent, inpargs
def parse(descr, cpu=None, namespace=None, type_system='lltype',
- boxkinds=None):
+ boxkinds=None, jump_targets=None):
if namespace is None:
namespace = _default_namespace[type_system]
- return OpParser(descr, cpu, namespace, type_system, boxkinds).parse()
+ return OpParser(descr, cpu, namespace, type_system, boxkinds, jump_targets).parse()
def _box_counter_more_than(s):
if s.isdigit():
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_oparser.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_oparser.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_oparser.py Tue Aug 18 16:49:51 2009
@@ -111,3 +111,21 @@
NULL = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.nullptr(TP))
loop = parse(x, None, {'func_ptr' : NULL})
assert loop.operations[0].args[0].value == NULL
+
+def test_jump_target():
+ x = '''
+ []
+ jump()
+ '''
+ loop = parse(x)
+ assert loop.operations[0].jump_target is loop
+
+def test_jump_target_other():
+ x = '''
+ []
+ jump()
+ '''
+ obj = object()
+ loop = parse(x, jump_targets=[obj])
+ assert loop.operations[0].jump_target is obj
+
More information about the Pypy-commit
mailing list