Author: Maciej Fijalkowski <[email protected]>
Branch: result-in-resops
Changeset: r58076:c2a22f88e26a
Date: 2012-10-12 19:01 +0200
http://bitbucket.org/pypy/pypy/changeset/c2a22f88e26a/
Log: Add optmodel
diff --git a/pypy/jit/metainterp/optmodel.py b/pypy/jit/metainterp/optmodel.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/metainterp/optmodel.py
@@ -0,0 +1,18 @@
+
+""" Mutable subclasses for each of ResOperation.
+"""
+
+from pypy.jit.metainterp.resoperation import opclasses, opclasses_mutable
+
+def create_mutable_subclasses():
+ for i, cls in enumerate(opclasses):
+ if cls is None:
+ Mutable = None
+ else:
+ class Mutable(cls):
+ is_mutable = True
+ Mutable.__name__ = cls.__name__ + '_mutable'
+ assert len(opclasses_mutable) == i
+ opclasses_mutable.append(Mutable)
+
+create_mutable_subclasses()
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
@@ -43,11 +43,18 @@
else:
return create_resop(opnum, result, args, descr)
[email protected](0)
-def create_resop(opnum, result, args, descr=None):
[email protected]()
+def _getcls(opnum, mutable):
+ if mutable:
+ return opclasses_mutable[opnum]
+ else:
+ return opclasses[opnum]
+
[email protected](0, 4)
+def create_resop(opnum, result, args, descr=None, mutable=False):
""" Create an N-args resop with given opnum and args
"""
- cls = opclasses[opnum]
+ cls = _getcls(opnum, mutable)
assert cls.NUMARGS == -1
if cls.is_always_pure():
for arg in args:
@@ -68,11 +75,11 @@
op.setdescr(descr)
return op
[email protected](0)
-def create_resop_0(opnum, result, descr=None):
[email protected](0, 3)
+def create_resop_0(opnum, result, descr=None, mutable=False):
""" Create an 0-arg resop with given opnum and args
"""
- cls = opclasses[opnum]
+ cls = _getcls(opnum, mutable)
assert cls.NUMARGS == 0
if result is None:
op = cls()
@@ -84,11 +91,11 @@
op.setdescr(descr)
return op
[email protected](0)
-def create_resop_1(opnum, result, arg0, descr=None):
[email protected](0, 4)
+def create_resop_1(opnum, result, arg0, descr=None, mutable=False):
""" Create a 1-arg resop with given opnum and args
"""
- cls = opclasses[opnum]
+ cls = _getcls(opnum, mutable)
assert cls.NUMARGS == 1
if (cls.is_always_pure() and
opnum not in (rop.SAME_AS_i, rop.SAME_AS_f, rop.SAME_AS_r)):
@@ -106,11 +113,11 @@
op.setdescr(descr)
return op
[email protected](0)
-def create_resop_2(opnum, result, arg0, arg1, descr=None):
[email protected](0, 5)
+def create_resop_2(opnum, result, arg0, arg1, descr=None, mutable=False):
""" Create a 2-arg resop with given opnum and args
"""
- cls = opclasses[opnum]
+ cls = _getcls(opnum, mutable)
assert cls.NUMARGS == 2
if cls.is_always_pure():
if arg0.is_constant() and arg1.is_constant():
@@ -129,11 +136,11 @@
op.setdescr(descr)
return op
[email protected](0)
-def create_resop_3(opnum, result, arg0, arg1, arg2, descr=None):
[email protected](0, 6)
+def create_resop_3(opnum, result, arg0, arg1, arg2, descr=None, mutable=False):
""" Create a 3-arg resop with given opnum and args
"""
- cls = opclasses[opnum]
+ cls = _getcls(opnum, mutable)
assert cls.NUMARGS == 3
if cls.is_always_pure():
if arg0.is_constant() and arg1.is_constant() and arg2.is_constant():
@@ -474,9 +481,13 @@
# debug
name = ""
pc = 0
+
_hash = 0
opnum = 0
+ is_mutable = False
+ _forwarded = None
+
@classmethod
def getopnum(cls):
return cls.opnum
@@ -862,11 +873,11 @@
pass
@specialize.arg(1)
- def copy_and_change(self, newopnum=-1, descr=None):
+ def mutable_copy(self, newopnum=-1, descr=None):
if newopnum == -1:
newopnum = self.getopnum()
res = create_resop_0(newopnum, self.getresult(),
- descr or self.getdescr())
+ descr or self.getdescr(), mutable=True)
if self.is_guard():
res.set_rd_frame_info_list(self.get_rd_frame_info_list())
res.set_rd_snapshot(self.get_rd_snapshot())
@@ -912,11 +923,11 @@
return res
@specialize.arg(1)
- def copy_and_change(self, newopnum=-1, arg0=None, descr=None):
+ def mutable_copy(self, newopnum=-1, arg0=None, descr=None):
if newopnum == -1:
newopnum = self.getopnum()
res = create_resop_1(newopnum, self.getresult(), arg0 or self._arg0,
- descr or self.getdescr())
+ descr or self.getdescr(), mutable=True)
if self.is_guard():
res.set_rd_frame_info_list(self.get_rd_frame_info_list())
res.set_rd_snapshot(self.get_rd_snapshot())
@@ -965,12 +976,13 @@
new_arg0, new_arg1, self.getdescr())
@specialize.arg(1)
- def copy_and_change(self, newopnum=-1, arg0=None, arg1=None, descr=None):
+ def mutable_copy(self, newopnum=-1, arg0=None, arg1=None, descr=None):
if newopnum == -1:
newopnum = self.getopnum()
res = create_resop_2(newopnum, self.getresult(), arg0 or self._arg0,
arg1 or self._arg1,
- descr or self.getdescr())
+ descr or self.getdescr(),
+ mutable=True)
if self.is_guard():
res.set_rd_frame_info_list(self.get_rd_frame_info_list())
res.set_rd_snapshot(self.get_rd_snapshot())
@@ -1026,13 +1038,13 @@
new_arg0, new_arg1, new_arg2, self.getdescr())
@specialize.arg(1)
- def copy_and_change(self, newopnum=-1, arg0=None, arg1=None, arg2=None,
- descr=None):
+ def mutable_copy(self, newopnum=-1, arg0=None, arg1=None, arg2=None,
+ descr=None):
if newopnum == -1:
newopnum = self.getopnum()
r = create_resop_3(newopnum, self.getresult(), arg0 or self._arg0,
arg1 or self._arg1, arg2 or self._arg2,
- descr or self.getdescr())
+ descr or self.getdescr(), mutable=True)
assert not r.is_guard()
return r
@@ -1085,12 +1097,12 @@
newargs, self.getdescr())
@specialize.arg(1)
- def copy_and_change(self, newopnum=-1, newargs=None, descr=None):
+ def mutable_copy(self, newopnum=-1, newargs=None, descr=None):
if newopnum == -1:
newopnum = self.getopnum()
r = create_resop(newopnum, self.getresult(),
newargs or self.getarglist(),
- descr or self.getdescr())
+ descr or self.getdescr(), mutable=True)
assert not r.is_guard()
return r
@@ -1284,6 +1296,8 @@
pass # for convinience
opclasses = [] # mapping numbers to the concrete ResOp class
+ # mapping numbers to the concrete ResOp, mutable version
+opclasses_mutable = []
opname = {} # mapping numbers to the original names, for debugging
oparity = [] # mapping numbers to the arity of the operation or -1
opwithdescr = [] # mapping numbers to a flag "takes a descr"
@@ -1366,7 +1380,7 @@
is_guard = name.startswith('GUARD')
if is_guard:
- assert withdescr
+ assert not withdescr
baseclass = GuardResOp
elif withdescr:
baseclass = ResOpWithDescr
diff --git a/pypy/jit/metainterp/test/test_optmodel.py
b/pypy/jit/metainterp/test/test_optmodel.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/metainterp/test/test_optmodel.py
@@ -0,0 +1,38 @@
+
+""" Direct tests of optmodel.py
+"""
+
+from pypy.jit.metainterp.test.test_resoperation import FakeBox, FakeDescr
+from pypy.jit.metainterp import resoperation as rop
+from pypy.jit.metainterp import optmodel
+
+def test_mutable_copy():
+ op = rop.create_resop_1(rop.rop.INT_IS_ZERO, 1, FakeBox('a'))
+ assert not op.is_mutable
+ op2 = op.mutable_copy(rop.rop.INT_IS_TRUE)
+ assert op2.opnum == rop.rop.INT_IS_TRUE
+ assert op2.getarg(0) == FakeBox('a')
+ op2 = op.mutable_copy(rop.rop.INT_IS_TRUE, FakeBox('b'))
+ assert op2.is_mutable
+ assert op2.opnum == rop.rop.INT_IS_TRUE
+ assert op2.getarg(0) == FakeBox('b')
+ assert op2 is not op
+ op = rop.create_resop_2(rop.rop.INT_ADD, 3, FakeBox("a"), FakeBox("b"))
+ op2 = op.mutable_copy(rop.rop.INT_SUB)
+ assert op2.opnum == rop.rop.INT_SUB
+ assert op2.getarglist() == [FakeBox("a"), FakeBox("b")]
+ op2 = op.mutable_copy(rop.rop.INT_SUB, None, FakeBox("c"))
+ assert op2.opnum == rop.rop.INT_SUB
+ assert op2.getarglist() == [FakeBox("a"), FakeBox("c")]
+ op = rop.create_resop_3(rop.rop.STRSETITEM, None, FakeBox('a'),
+ FakeBox('b'), FakeBox('c'))
+ op2 = op.mutable_copy(rop.rop.UNICODESETITEM, None, FakeBox("c"))
+ assert op2.opnum == rop.rop.UNICODESETITEM
+ assert op2.getarglist() == [FakeBox("a"), FakeBox("c"), FakeBox("c")]
+ mydescr = FakeDescr()
+ op = rop.create_resop(rop.rop.CALL_PURE_i, 13, [FakeBox('a'), FakeBox('b'),
+ FakeBox('c')], descr=mydescr)
+ op2 = op.mutable_copy(rop.rop.CALL_i)
+ assert op2.getarglist() == ['a', 'b', 'c']
+ op2 = op.mutable_copy(rop.rop.CALL_i, [FakeBox('a')])
+ assert op2.getarglist() == ['a']
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
@@ -95,10 +95,8 @@
FakeBox('b')).can_malloc()
def test_repr():
- mydescr = FakeDescr()
op = rop.create_resop_0(rop.rop.GUARD_NO_EXCEPTION, None)
- op.setdescr(mydescr)
- assert repr(op) == 'guard_no_exception(, descr=descr)'
+ assert repr(op) == 'guard_no_exception()'
op = rop.create_resop_2(rop.rop.INT_ADD, 3, FakeBox("a"), FakeBox("b"))
assert repr(op) == '3 = int_add(a, b)'
# XXX more tests once we decide what we actually want to print
@@ -112,35 +110,6 @@
return FakeBox('rrr')
return None
-def test_copy_and_change():
- op = rop.create_resop_1(rop.rop.INT_IS_ZERO, 1, FakeBox('a'))
- op2 = op.copy_and_change(rop.rop.INT_IS_TRUE)
- assert op2.opnum == rop.rop.INT_IS_TRUE
- assert op2.getarg(0) == FakeBox('a')
- op2 = op.copy_and_change(rop.rop.INT_IS_TRUE, FakeBox('b'))
- assert op2.opnum == rop.rop.INT_IS_TRUE
- assert op2.getarg(0) == FakeBox('b')
- assert op2 is not op
- op = rop.create_resop_2(rop.rop.INT_ADD, 3, FakeBox("a"), FakeBox("b"))
- op2 = op.copy_and_change(rop.rop.INT_SUB)
- assert op2.opnum == rop.rop.INT_SUB
- assert op2.getarglist() == [FakeBox("a"), FakeBox("b")]
- op2 = op.copy_and_change(rop.rop.INT_SUB, None, FakeBox("c"))
- assert op2.opnum == rop.rop.INT_SUB
- assert op2.getarglist() == [FakeBox("a"), FakeBox("c")]
- op = rop.create_resop_3(rop.rop.STRSETITEM, None, FakeBox('a'),
- FakeBox('b'), FakeBox('c'))
- op2 = op.copy_and_change(rop.rop.UNICODESETITEM, None, FakeBox("c"))
- assert op2.opnum == rop.rop.UNICODESETITEM
- assert op2.getarglist() == [FakeBox("a"), FakeBox("c"), FakeBox("c")]
- mydescr = FakeDescr()
- op = rop.create_resop(rop.rop.CALL_PURE_i, 13, [FakeBox('a'), FakeBox('b'),
- FakeBox('c')], descr=mydescr)
- op2 = op.copy_and_change(rop.rop.CALL_i)
- assert op2.getarglist() == ['a', 'b', 'c']
- op2 = op.copy_and_change(rop.rop.CALL_i, [FakeBox('a')])
- assert op2.getarglist() == ['a']
-
def test_hashes_eq():
arg1 = rop.create_resop_1(rop.rop.FLOAT_NEG, 12.5,
rop.create_resop_0(rop.rop.INPUT_f, 3.5))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit