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

Reply via email to