[pypy-svn] r77130 - in pypy/branch/resoperation-refactoring/pypy/jit/metainterp: . optimizeopt

antocuni at codespeak.net antocuni at codespeak.net
Fri Sep 17 13:20:04 CEST 2010


Author: antocuni
Date: Fri Sep 17 13:20:02 2010
New Revision: 77130

Modified:
   pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/optimizer.py
   pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/rewrite.py
   pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/virtualize.py
   pypy/branch/resoperation-refactoring/pypy/jit/metainterp/resoperation.py
Log:
(david, antocuni) 

- make ResOperation a factory function: in the future, it will select the right class to instantiate

- add a copy_and_change method to "replace" the op with a new one. Start doing it in few places



Modified: pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/optimizer.py	(original)
+++ pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/optimizer.py	Fri Sep 17 13:20:02 2010
@@ -331,7 +331,7 @@
         self.metainterp_sd.profiler.count(jitprof.OPT_OPS)
         if op.is_guard():
             self.metainterp_sd.profiler.count(jitprof.OPT_GUARDS)
-            self.store_final_boxes_in_guard(op)
+            op = self.store_final_boxes_in_guard(op)
         elif op.can_raise():
             self.exception_might_have_happened = True
         elif op.returns_bool_result():
@@ -361,12 +361,13 @@
                     opnum = rop.GUARD_TRUE
                 else:
                     raise AssertionError("uh?")
-                op.opnum = opnum
-                # XXX XXX: fix me when the refactoring is complete
-                op._args = [op.getarg(0)]
+                newop = ResOperation(opnum, [op.getarg(0)], op.result, descr)
+                newop.fail_args = op.getfailargs()
+                return newop
             else:
                 # a real GUARD_VALUE.  Make it use one counter per value.
                 descr.make_a_counter_per_value(op)
+        return op
 
     def make_args_key(self, op):
         args = []

Modified: pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/rewrite.py
==============================================================================
--- pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/rewrite.py	(original)
+++ pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/rewrite.py	Fri Sep 17 13:20:02 2010
@@ -178,17 +178,16 @@
             # guard_nonnull_class on this value, which is rather silly.
             # replace the original guard with a guard_value
             old_guard_op = self.optimizer.newoperations[value.last_guard_index]
-            old_opnum = old_guard_op.opnum
-            old_guard_op.opnum = rop.GUARD_VALUE
-            # XXX XXX: implement it when the refactoring is complete
-            old_guard_op._args = [old_guard_op.getarg(0), op.getarg(1)]
+            new_guard_op = old_guard_op.copy_and_change(rop.GUARD_VALUE,
+                                             args = [old_guard_op.getarg(0), op.getarg(1)])
+            self.optimizer.newoperations[value.last_guard_index] = new_guard_op
             # hack hack hack.  Change the guard_opnum on
-            # old_guard_op.descr so that when resuming,
+            # new_guard_op.descr so that when resuming,
             # the operation is not skipped by pyjitpl.py.
-            descr = old_guard_op.descr
+            descr = new_guard_op.descr
             assert isinstance(descr, compile.ResumeGuardDescr)
             descr.guard_opnum = rop.GUARD_VALUE
-            descr.make_a_counter_per_value(old_guard_op)
+            descr.make_a_counter_per_value(new_guard_op)
             emit_operation = False
         constbox = op.getarg(1)
         assert isinstance(constbox, Const)
@@ -219,13 +218,13 @@
             if old_guard_op.opnum == rop.GUARD_NONNULL:
                 # it was a guard_nonnull, which we replace with a
                 # guard_nonnull_class.
-                old_guard_op.opnum = rop.GUARD_NONNULL_CLASS
-                # XXX XXX: implement it when the refactoring is complete
-                old_guard_op._args = [old_guard_op.getarg(0), op.getarg(1)]
+                new_guard_op = old_guard_op.copy_and_change (rop.GUARD_NONNULL_CLASS,
+                                         args = [old_guard_op.getarg(0), op.getarg(1)])
+                self.optimizer.newoperations[value.last_guard_index] = new_guard_op
                 # hack hack hack.  Change the guard_opnum on
-                # old_guard_op.descr so that when resuming,
+                # new_guard_op.descr so that when resuming,
                 # the operation is not skipped by pyjitpl.py.
-                descr = old_guard_op.descr
+                descr = new_guard_op.descr
                 assert isinstance(descr, compile.ResumeGuardDescr)
                 descr.guard_opnum = rop.GUARD_NONNULL_CLASS
                 emit_operation = False

Modified: pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/virtualize.py
==============================================================================
--- pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/virtualize.py	(original)
+++ pypy/branch/resoperation-refactoring/pypy/jit/metainterp/optimizeopt/virtualize.py	Fri Sep 17 13:20:02 2010
@@ -324,7 +324,7 @@
         vrefinfo = self.optimizer.metainterp_sd.virtualref_info
         # op.getarg(1) should really never point to null here
         # - set 'forced' to point to the real object
-        op1 = ResOperation(rop.SETFIELD_GC, op._args, None,
+        op1 = ResOperation(rop.SETFIELD_GC, op.getarglist(), None,
                           descr = vrefinfo.descr_forced)
         self.optimize_SETFIELD_GC(op1)
         # - set 'virtual_token' to TOKEN_NONE

Modified: pypy/branch/resoperation-refactoring/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/resoperation-refactoring/pypy/jit/metainterp/resoperation.py	(original)
+++ pypy/branch/resoperation-refactoring/pypy/jit/metainterp/resoperation.py	Fri Sep 17 13:20:02 2010
@@ -1,7 +1,10 @@
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rlib.debug import make_sure_not_resized
 
-class ResOperation(object):
+def ResOperation(opnum, args, result, descr=None):
+    return BaseResOperation(opnum, args, result, descr)
+
+class BaseResOperation(object):
     """The central ResOperation class, representing one operation."""
 
     # for 'guard_*'
@@ -27,6 +30,19 @@
             import pdb;pdb.set_trace()
         object.__setattr__(self, attr, value)
 
+    def copy_and_change(self, opnum, args=None, result=None, descr=None):
+        "shallow copy: the returned operation is meant to be used in place of self"
+        if args is None:
+            args = self.getarglist()
+        if result is None:
+            result = self.result
+        if descr is None:
+            descr = self.getdescr()
+        newop = ResOperation(opnum, args, result, descr)
+        #if isinstance(self, GuardOperation)
+        newop.setfailargs(self.getfailargs())
+        return newop
+
     def getarg(self, i):
         return self._args[i]
 
@@ -42,6 +58,15 @@
     def getarglist(self):
         return self._args
 
+    def getfailargs(self):
+        return self.fail_args
+
+    def setfailargs(self, fail_args):
+        self.fail_args = fail_args
+
+    def getdescr(self):
+        return self.descr
+
     def setdescr(self, descr):
         # for 'call', 'new', 'getfield_gc'...: the descr is a prebuilt
         # instance provided by the backend holding details about the type



More information about the Pypy-commit mailing list