[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