[pypy-commit] pypy result-in-resops: work more on resoperation
fijal
noreply at buildbot.pypy.org
Tue Jul 24 16:17:52 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r56423:f60dbf49650f
Date: 2012-07-24 13:44 +0200
http://bitbucket.org/pypy/pypy/changeset/f60dbf49650f/
Log: work more on resoperation
diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -385,33 +385,36 @@
if func.resulttype not in ('i', 'r', 'f', None):
return None
argtypes = unrolling_iterable(func.argtypes)
+ if len(func.argtypes) <= 3:
+ create_resop_func = getattr(resoperation,
+ 'create_resop_%d' % len(func.argtypes))
#
- def do(cpu, _, *args):
- newargs = ()
- orig_args = args
- for argtype in argtypes:
- if argtype == 'cpu':
- value = cpu
- elif argtype == 'd':
- value = args[-1]
- assert isinstance(value, AbstractDescr)
- args = args[:-1]
- else:
- arg = args[0]
- args = args[1:]
- if argtype == 'i': value = arg.getint()
- elif argtype == 'r': value = arg.getref_base()
- elif argtype == 'f': value = arg.getfloatstorage()
- newargs = newargs + (value,)
- assert not args
+ def do(cpu, _, *args):
+ newargs = ()
+ orig_args = args
+ for argtype in argtypes:
+ if argtype == 'cpu':
+ value = cpu
+ elif argtype == 'd':
+ value = args[-1]
+ assert isinstance(value, AbstractDescr)
+ args = args[:-1]
+ else:
+ arg = args[0]
+ args = args[1:]
+ if argtype == 'i': value = arg.getint()
+ elif argtype == 'r': value = arg.getref_base()
+ elif argtype == 'f': value = arg.getfloatstorage()
+ newargs = newargs + (value,)
+ assert not args
+ #
+ result = func(*newargs)
+ return create_resop_func(opnum, result, *orig_args)
+ #
#
- result = func(*newargs)
- if has_descr:
- return create_resop(opnum, orig_args[:-1], result, orig_args[-1])
- else:
- return create_resop(opnum, orig_args, result)
- #
- #
+ else:
+ def do(*args):
+ xxx
do.func_name = 'do_' + name
return do
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -2180,7 +2180,7 @@
# FIXME: kill TerminatingLoopToken?
# FIXME: can we call compile_trace?
token = loop_tokens[0].finishdescr
- self.history.record(create_resop(rop.FINISH, exits, None, descr=token))
+ self.history.record(create_resop(rop.FINISH, None, exits, descr=token))
target_token = compile.compile_trace(self, self.resumekey)
if target_token is not token:
compile.giveup()
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -11,7 +11,7 @@
VOID = 'v'
@specialize.arg(0)
-def create_resop(opnum, args, result, descr=None):
+def create_resop(opnum, result, args, descr=None):
cls = opclasses[opnum]
assert cls.NUMARGS == -1
if cls.is_always_pure():
@@ -44,7 +44,7 @@
return op
@specialize.arg(0)
-def create_resop_1(opnum, arg0, result, descr=None):
+def create_resop_1(opnum, result, arg0, descr=None):
cls = opclasses[opnum]
assert cls.NUMARGS == 1
if cls.is_always_pure():
@@ -61,7 +61,7 @@
return op
@specialize.arg(0)
-def create_resop_2(opnum, arg0, arg1, result, descr=None):
+def create_resop_2(opnum, result, arg0, arg1, descr=None):
cls = opclasses[opnum]
assert cls.NUMARGS == 2
if cls.is_always_pure():
@@ -79,7 +79,7 @@
return op
@specialize.arg(0)
-def create_resop_3(opnum, arg0, arg1, arg2, result, descr=None):
+def create_resop_3(opnum, result, arg0, arg1, arg2, descr=None):
cls = opclasses[opnum]
assert cls.NUMARGS == 3
if cls.is_always_pure():
@@ -233,8 +233,9 @@
def repr(self, graytext=False):
# RPython-friendly version
- if self.result is not None:
- sres = '%s = ' % (self.result,)
+ resultrepr = self.getresultrepr()
+ if resultrepr is not None:
+ sres = '%s = ' % (resultrepr,)
else:
sres = ''
if self.name:
@@ -333,6 +334,9 @@
def getresult(self):
return None
+ def getresultrepr(self):
+ return None
+
class ResOpInt(object):
_mixin_ = True
type = INT
@@ -345,6 +349,9 @@
return self.intval
getresult = getint
+ def getresultrepr(self):
+ return str(self.intval)
+
@staticmethod
def wrap_constant(intval):
from pypy.jit.metainterp.history import ConstInt
@@ -359,6 +366,9 @@
# XXX not sure between float or float storage
self.floatval = floatval
+ def getresultrepr(self):
+ return str(self.floatval)
+
def getfloatstorage(self):
return self.floatval
getresult = getfloatstorage
@@ -380,6 +390,10 @@
return self.pval
getresult = getref_base
+ def getresultrepr(self):
+ # XXX what do we want to put in here?
+ return str(self.pval)
+
@staticmethod
def wrap_constant(pval):
from pypy.jit.metainterp.history import ConstPtr
@@ -497,7 +511,7 @@
func(self.getopnum(), 0, self._arg0)
def clone(self):
- r = create_resop_1(self.opnum, self._arg0, self.getresult(),
+ r = create_resop_1(self.opnum, self.getresult(), self._arg0,
self.getdescrclone())
if self.is_guard():
r.setfailargs(self.getfailargs())
@@ -542,8 +556,8 @@
func(self.getopnum(), 1, self._arg1)
def clone(self):
- r = create_resop_2(self.opnum, self._arg0, self._arg1,
- self.getresult(), self.getdescrclone())
+ r = create_resop_2(self.opnum, self.getresult(), self._arg0, self._arg1,
+ self.getdescrclone())
if self.is_guard():
r.setfailargs(self.getfailargs())
return r
@@ -595,8 +609,8 @@
def clone(self):
assert not self.is_guard()
- return create_resop_3(self.opnum, self._arg0, self._arg1, self._arg2,
- self.getresult(), self.getdescrclone())
+ return create_resop_3(self.opnum, self.getresult(), self._arg0,
+ self._arg1, self._arg2, self.getdescrclone())
class N_aryOp(object):
@@ -627,7 +641,7 @@
def clone(self):
assert not self.is_guard()
- return create_resop(self.opnum, self._args[:], self.getresult(),
+ return create_resop(self.opnum, self.getresult(), self._args[:],
self.getdescrclone())
diff --git a/pypy/jit/metainterp/test/test_resoperation.py b/pypy/jit/metainterp/test/test_resoperation.py
--- a/pypy/jit/metainterp/test/test_resoperation.py
+++ b/pypy/jit/metainterp/test/test_resoperation.py
@@ -11,10 +11,17 @@
def __ne__(self, other):
return not self == other
-
+
+ def __str__(self):
+ return self.v
+
def is_constant(self):
return False
+class FakeDescr(AbstractDescr):
+ def __repr__(self):
+ return 'descr'
+
def test_arity_mixins():
cases = [
(0, rop.NullaryOp),
@@ -68,19 +75,19 @@
def test_instantiate():
from pypy.rpython.lltypesystem import lltype, llmemory
- op = rop.create_resop_2(rop.rop.INT_ADD, FakeBox('a'), FakeBox('b'), 15)
+ op = rop.create_resop_2(rop.rop.INT_ADD, 15, FakeBox('a'), FakeBox('b'))
assert op.getarglist() == [FakeBox('a'), FakeBox('b')]
assert op.getint() == 15
mydescr = AbstractDescr()
- op = rop.create_resop(rop.rop.CALL_f, [FakeBox('a'),
- FakeBox('b')], 15.5, descr=mydescr)
+ op = rop.create_resop(rop.rop.CALL_f, 15.5, [FakeBox('a'),
+ FakeBox('b')], descr=mydescr)
assert op.getarglist() == [FakeBox('a'), FakeBox('b')]
assert op.getfloat() == 15.5
assert op.getdescr() is mydescr
- op = rop.create_resop(rop.rop.CALL_p, [FakeBox('a'), FakeBox('b')],
- lltype.nullptr(llmemory.GCREF.TO), descr=mydescr)
+ op = rop.create_resop(rop.rop.CALL_p, lltype.nullptr(llmemory.GCREF.TO),
+ [FakeBox('a'), FakeBox('b')], descr=mydescr)
assert op.getarglist() == [FakeBox('a'), FakeBox('b')]
assert not op.getref_base()
assert op.getdescr() is mydescr
@@ -91,14 +98,14 @@
mydescr = AbstractDescr()
p = lltype.malloc(llmemory.GCREF.TO)
assert rop.create_resop_0(rop.rop.NEW, p).can_malloc()
- call = rop.create_resop(rop.rop.CALL_i, [FakeBox('a'),
- FakeBox('b')], 3, descr=mydescr)
+ call = rop.create_resop(rop.rop.CALL_i, 3, [FakeBox('a'),
+ FakeBox('b')], descr=mydescr)
assert call.can_malloc()
- assert not rop.create_resop_2(rop.rop.INT_ADD, FakeBox('a'),
- FakeBox('b'), 3).can_malloc()
+ assert not rop.create_resop_2(rop.rop.INT_ADD, 3, FakeBox('a'),
+ FakeBox('b')).can_malloc()
def test_get_deep_immutable_oplist():
- ops = [rop.create_resop_2(rop.rop.INT_ADD, FakeBox('a'), FakeBox('b'), 3)]
+ ops = [rop.create_resop_2(rop.rop.INT_ADD, 3, FakeBox('a'), FakeBox('b'))]
newops = rop.get_deep_immutable_oplist(ops)
py.test.raises(TypeError, "newops.append('foobar')")
py.test.raises(TypeError, "newops[0] = 'foobar'")
@@ -113,28 +120,35 @@
assert not op2 is op
assert op2.getresult() is None
assert op2.getfailargs() is op.getfailargs()
- op = rop.create_resop_1(rop.rop.INT_IS_ZERO, FakeBox('a'), 1)
+ op = rop.create_resop_1(rop.rop.INT_IS_ZERO, 1, FakeBox('a'))
op2 = op.clone()
assert op2 is not op
assert op2._arg0 == FakeBox('a')
assert op2.getint() == 1
- op = rop.create_resop_2(rop.rop.INT_ADD, FakeBox('a'), FakeBox('b'), 1)
+ op = rop.create_resop_2(rop.rop.INT_ADD, 1, FakeBox('a'), FakeBox('b'))
op2 = op.clone()
assert op2 is not op
assert op2._arg0 == FakeBox('a')
assert op2._arg1 == FakeBox('b')
assert op2.getint() == 1
- op = rop.create_resop_3(rop.rop.STRSETITEM, FakeBox('a'), FakeBox('b'),
- FakeBox('c'), None)
+ op = rop.create_resop_3(rop.rop.STRSETITEM, None, FakeBox('a'),
+ FakeBox('b'), FakeBox('c'))
op2 = op.clone()
assert op2 is not op
assert op2._arg0 == FakeBox('a')
assert op2._arg1 == FakeBox('b')
assert op2._arg2 == FakeBox('c')
assert op2.getresult() is None
- op = rop.create_resop(rop.rop.CALL_i, [FakeBox('a'), FakeBox('b'),
- FakeBox('c')], 13, descr=mydescr)
+ op = rop.create_resop(rop.rop.CALL_i, 13, [FakeBox('a'), FakeBox('b'),
+ FakeBox('c')], descr=mydescr)
op2 = op.clone()
assert op2 is not op
assert op2._args == [FakeBox('a'), FakeBox('b'), FakeBox('c')]
assert op2.getint() == 13
+
+def test_repr():
+ mydescr = FakeDescr()
+ op = rop.create_resop_0(rop.rop.GUARD_NO_EXCEPTION, None, descr=mydescr)
+ assert repr(op) == 'guard_no_exception(, descr=descr)'
+ op = rop.create_resop_2(rop.rop.INT_ADD, 3, FakeBox("a"), FakeBox("b"))
+ assert repr(op) == '3 = int_add(a, b)'
More information about the pypy-commit
mailing list