[pypy-commit] pypy result-in-resops: a bit of random progress and moving stuff around. Now all Box/Const/ResOperation

fijal noreply at buildbot.pypy.org
Thu Sep 13 20:28:15 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57326:9357f1cff6b7
Date: 2012-09-13 20:27 +0200
http://bitbucket.org/pypy/pypy/changeset/9357f1cff6b7/

Log:	a bit of random progress and moving stuff around. Now all
	Box/Const/ResOperation live in resoperation.py, should be probably
	named model.py

diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -105,6 +105,7 @@
 def compile_loop(metainterp, greenkey, start,
                  inputargs, jumpargs,
                  resume_at_jump_descr, full_preamble_needed=True):
+    XXX # requires a rewrite
     """Try to compile a new procedure by closing the current history back
     to the first operation.
     """
@@ -498,7 +499,7 @@
         assert guard_value_op.getopnum() == rop.GUARD_VALUE
         box = guard_value_op.getarg(0)
         try:
-            i = guard_value_op.getfailargs().index(box)
+            i = guard_value_op.get_extra("failargs").index(box)
         except ValueError:
             return     # xxx probably very rare
         else:
diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -53,216 +53,6 @@
     def get_jitcode_for_class(self, oocls):
         return self.jitcodes[oocls]
 
-
-class Box(AbstractValue):
-    __slots__ = ()
-    _extended_display = True
-    _counter = 0
-    is_box = True  # hint that we want to make links in graphviz from this
-
-    @staticmethod
-    def _new(x):
-        "NOT_RPYTHON"
-        kind = getkind(lltype.typeOf(x))
-        if kind == "int":
-            intval = lltype.cast_primitive(lltype.Signed, x)
-            return BoxInt(intval)
-        elif kind == "ref":
-            # XXX add ootype support?
-            ptrval = lltype.cast_opaque_ptr(llmemory.GCREF, x)
-            return BoxPtr(ptrval)
-        elif kind == "float":
-            return BoxFloat(longlong.getfloatstorage(x))
-        else:
-            raise NotImplementedError(kind)
-
-    def nonconstbox(self):
-        return self
-
-    def __repr__(self):
-        result = str(self)
-        if self._extended_display:
-            result += '(%s)' % self._getrepr_()
-        return result
-
-    def __str__(self):
-        if not hasattr(self, '_str'):
-            try:
-                if self.type == INT:
-                    t = 'i'
-                elif self.type == FLOAT:
-                    t = 'f'
-                else:
-                    t = 'p'
-            except AttributeError:
-                t = 'b'
-            self._str = '%s%d' % (t, Box._counter)
-            Box._counter += 1
-        return self._str
-
-    def _get_str(self):    # for debugging only
-        return self.constbox()._get_str()
-
-    def forget_value(self):
-        raise NotImplementedError
-
-    def is_constant(self):
-        return False
-
-class BoxInt(Box):
-    type = INT
-    _attrs_ = ('value',)
-
-    def __init__(self, value=0):
-        if not we_are_translated():
-            if is_valid_int(value):
-                value = int(value)    # bool -> int
-            else:
-                assert isinstance(value, Symbolic)
-        self.value = value
-
-    def forget_value(self):
-        self.value = 0
-
-    def clonebox(self):
-        return BoxInt(self.value)
-
-    def constbox(self):
-        return ConstInt(self.value)
-
-    def getint(self):
-        return self.value
-
-    def getaddr(self):
-        return heaptracker.int2adr(self.value)
-
-    def _get_hash_(self):
-        return make_hashable_int(self.value)
-
-    def nonnull(self):
-        return self.value != 0
-
-    def _getrepr_(self):
-        return self.value
-
-    def repr_rpython(self):
-        return repr_rpython(self, 'bi')
-
-class BoxFloat(Box):
-    type = FLOAT
-    _attrs_ = ('value',)
-
-    def __init__(self, valuestorage=longlong.ZEROF):
-        assert lltype.typeOf(valuestorage) is longlong.FLOATSTORAGE
-        self.value = valuestorage
-
-    def forget_value(self):
-        self.value = longlong.ZEROF
-
-    def clonebox(self):
-        return BoxFloat(self.value)
-
-    def constbox(self):
-        return ConstFloat(self.value)
-
-    def getfloatstorage(self):
-        return self.value
-
-    def _get_hash_(self):
-        return longlong.gethash(self.value)
-
-    def nonnull(self):
-        return self.value != longlong.ZEROF
-
-    def _getrepr_(self):
-        return self.getfloat()
-
-    def repr_rpython(self):
-        return repr_rpython(self, 'bf')
-
-class BoxPtr(Box):
-    type = REF
-    _attrs_ = ('value',)
-
-    def __init__(self, value=lltype.nullptr(llmemory.GCREF.TO)):
-        assert lltype.typeOf(value) == llmemory.GCREF
-        self.value = value
-
-    def forget_value(self):
-        self.value = lltype.nullptr(llmemory.GCREF.TO)
-
-    def clonebox(self):
-        return BoxPtr(self.value)
-
-    def constbox(self):
-        return ConstPtr(self.value)
-
-    def getref_base(self):
-        return self.value
-
-    def getref(self, PTR):
-        return lltype.cast_opaque_ptr(PTR, self.getref_base())
-    getref._annspecialcase_ = 'specialize:arg(1)'
-
-    def getaddr(self):
-        return llmemory.cast_ptr_to_adr(self.value)
-
-    def _get_hash_(self):
-        if self.value:
-            return lltype.identityhash(self.value)
-        else:
-            return 0
-
-    def nonnull(self):
-        return bool(self.value)
-
-    def repr_rpython(self):
-        return repr_rpython(self, 'bp')
-
-    _getrepr_ = repr_pointer
-
-NULLBOX = BoxPtr()
-
-
-class BoxObj(Box):
-    type = REF
-    _attrs_ = ('value',)
-
-    def __init__(self, value=ootype.NULL):
-        assert ootype.typeOf(value) is ootype.Object
-        self.value = value
-
-    def forget_value(self):
-        self.value = ootype.NULL
-
-    def clonebox(self):
-        return BoxObj(self.value)
-
-    def constbox(self):
-        return ConstObj(self.value)
-
-    def getref_base(self):
-        return self.value
-
-    def getref(self, OBJ):
-        return ootype.cast_from_object(OBJ, self.getref_base())
-    getref._annspecialcase_ = 'specialize:arg(1)'
-
-    def _get_hash_(self):
-        if self.value:
-            return ootype.identityhash(self.value)
-        else:
-            return 0
-
-    def nonnull(self):
-        return bool(self.value)
-
-    def repr_rpython(self):
-        return repr_rpython(self, 'bo')
-
-    _getrepr_ = repr_object
-
-
 # ____________________________________________________________
 
 
diff --git a/pypy/jit/metainterp/inliner.py b/pypy/jit/metainterp/inliner.py
--- a/pypy/jit/metainterp/inliner.py
+++ b/pypy/jit/metainterp/inliner.py
@@ -1,3 +1,4 @@
+
 from pypy.jit.metainterp.resoperation import Const
 from pypy.jit.metainterp.resume import Snapshot
 
diff --git a/pypy/jit/metainterp/optimize.py b/pypy/jit/metainterp/optimize.py
--- a/pypy/jit/metainterp/optimize.py
+++ b/pypy/jit/metainterp/optimize.py
@@ -11,3 +11,6 @@
         debug_print(msg)
         debug_stop("jit-abort")
         self.msg = msg
+
+def unroll_and_optimize_loop(loop, call_pure_results=None):
+    xxx
diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py b/pypy/jit/metainterp/optimizeopt/__init__.py
--- a/pypy/jit/metainterp/optimizeopt/__init__.py
+++ b/pypy/jit/metainterp/optimizeopt/__init__.py
@@ -32,9 +32,7 @@
     'please fix rlib/jit.py to say ENABLE_ALL_OPTS = %r' % (ALL_OPTS_NAMES,))
 
 def build_opt_chain(metainterp_sd, enable_opts):
-    config = metainterp_sd.config
     optimizations = []
-    enable_opts = {} # XXX
     unroll = 'unroll' in enable_opts    # 'enable_opts' is normally a dict
     for name, opt in unroll_all_opts:
         if name in enable_opts:
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -405,6 +405,7 @@
         if constbox is None:
             return box
         if constbox.type == REF:
+            xxx
             value = constbox.getref_base()
             if not value:
                 return box
@@ -419,9 +420,10 @@
     def getvalue(self, box):
         box = self.getinterned(box)
         try:
-            value = self.values[box]
+            value = box.get_extra("optimize_value")
         except KeyError:
-            value = self.values[box] = OptValue(box)
+            value = OptValue(box)
+            box.set_extra("optimize_value", value)
         self.ensure_imported(value)
         return value
 
@@ -433,7 +435,7 @@
         if isinstance(box, Const):
             return box
         try:
-            value = self.values[box]
+            value = box.get_extra("optimize_value")
             self.ensure_imported(value)
         except KeyError:
             return None
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -24,8 +24,7 @@
             sb.add_potential(op)
 
     def propagate_forward(self, op):
-        args = self.optimizer.make_args_key(op)
-        if self.find_rewritable_bool(op, args):
+        if self.find_rewritable_bool(op):
             return
 
         dispatch_opt(self, op)
@@ -45,25 +44,16 @@
         return False
 
 
-    def find_rewritable_bool(self, op, args):
-        # XXXX
-        return False
-        
-        try:
-            oldopnum = opboolinvers[op.getopnum()]
-        except KeyError:
-            pass
-        else:
+    def find_rewritable_bool(self, op):
+        oldopnum = opboolinvers[op.getopnum()]
+        if oldopnum != -1:
             targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[0], args[1]],
                                                               None))
             if self.try_boolinvers(op, targs):
                 return True
 
-        try:
-            oldopnum = opboolreflex[op.getopnum()] # FIXME: add INT_ADD, INT_MUL
-        except KeyError:
-            pass
-        else:
+        oldopnum = opboolreflex[op.getopnum()] # FIXME: add INT_ADD, INT_MUL
+        if oldopnum != -1:
             targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[1], args[0]],
                                                               None))
             oldop = self.get_pure_result(targs)
@@ -71,11 +61,8 @@
                 self.make_equal_to(op, self.getvalue(oldop))
                 return True
 
-        try:
-            oldopnum = opboolinvers[opboolreflex[op.getopnum()]]
-        except KeyError:
-            pass
-        else:
+        oldopnum = opboolinvers[opboolreflex[op.getopnum()]]
+        if oldopnum != -1:
             targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[1], args[0]],
                                                               None))
             if self.try_boolinvers(op, targs):
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -359,7 +359,7 @@
         self.metainterp_sd = metainterp_sd
         self.original_greenkey = original_greenkey
     def store_final_boxes(self, op, boxes):
-        op.setfailargs(boxes)
+        op.set_extra("failargs", boxes)
     def __eq__(self, other):
         return type(self) is type(other)      # xxx obscure
     def clone_if_mutable(self):
@@ -397,15 +397,15 @@
         assert equaloplists(optimized.operations,
                             expected.operations, False, remap, text_right)
 
-    def _do_optimize_loop(self, loop, call_pure_results):
+    def _do_optimize_loop(self, loop):
         from pypy.jit.metainterp.optimizeopt import optimize_trace
-        from pypy.jit.metainterp.optimizeopt.util import args_dict
+        #from pypy.jit.metainterp.optimizeopt.util import args_dict
 
         self.loop = loop
-        loop.call_pure_results = args_dict()
-        if call_pure_results is not None:
-            for k, v in call_pure_results.items():
-                loop.call_pure_results[list(k)] = v
+        #loop.call_pure_results = args_dict()
+        #if call_pure_results is not None:
+        #    for k, v in call_pure_results.items():
+        #        loop.call_pure_results[list(k)] = v
         metainterp_sd = FakeMetaInterpStaticData(self.cpu)
         if hasattr(self, 'vrefinfo'):
             metainterp_sd.virtualref_info = self.vrefinfo
@@ -414,32 +414,35 @@
         #
         optimize_trace(metainterp_sd, loop, self.enable_opts)
 
-    def unroll_and_optimize(self, loop, call_pure_results=None):
+    def unroll_and_optimize(self, loop):#, call_pure_results=None):
         operations =  loop.operations
         jumpop = operations[-1]
         assert jumpop.getopnum() == rop.JUMP
         inputargs = loop.inputargs
 
-        jump_args = jumpop.getarglist()[:]
+        jump_args = jumpop.getarglist()
         operations = operations[:-1]
-        cloned_operations = [op.clone() for op in operations]
 
         preamble = TreeLoop('preamble')
         preamble.inputargs = inputargs
         preamble.resume_at_jump_descr = FakeDescrWithSnapshot()
 
-        token = JitCellToken() 
-        preamble.operations = [ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(token))] + \
-                              operations +  \
-                              [ResOperation(rop.LABEL, jump_args, None, descr=token)]
-        self._do_optimize_loop(preamble, call_pure_results)
+        token = JitCellToken()
+        preamble.operations = [create_resop(rop.LABEL, None, inputargs,
+                                            descr=TargetToken(token))] + \
+                                            operations +  \
+                              [create_resop(rop.LABEL, None, jump_args,
+                                            descr=token)]
+        self._do_optimize_loop(preamble)#, call_pure_results)
 
         assert preamble.operations[-1].getopnum() == rop.LABEL
 
+        import pdb
+        pdb.set_trace()
         inliner = Inliner(inputargs, jump_args)
         loop.resume_at_jump_descr = preamble.resume_at_jump_descr
         loop.operations = [preamble.operations[-1]] + \
-                          [inliner.inline_op(op, clone=False) for op in cloned_operations] + \
+                          [inliner.inline_op(op) for op in cloned_operations] + \
                           [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a in jump_args],
                                         None, descr=token)] 
                           #[inliner.inline_op(jumpop)]
diff --git a/pypy/jit/metainterp/optimizeopt/util.py b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -85,37 +85,50 @@
 
 # ____________________________________________________________
 
-def args_eq(args1, args2):
-    make_sure_not_resized(args1)
-    make_sure_not_resized(args2)
-    if len(args1) != len(args2):
-        return False
-    for i in range(len(args1)):
-        arg1 = args1[i]
-        arg2 = args2[i]
-        if arg1 is None:
-            if arg2 is not None:
-                return False
-        elif not arg1.same_box(arg2):
-            return False
-    return True
+BUCKET_SIZE = 1000
 
-def args_hash(args):
-    make_sure_not_resized(args)
-    res = 0x345678
-    for arg in args:
-        if arg is None:
-            y = 17
-        else:
-            y = arg._get_hash_()
-        res = intmask((1000003 * res) ^ y)
-    return res
+class ArgsDict(object):
+    """ An imprecise dict. If you look it up and it's there, it's correct,
+    however we don't care about collisions, so a colliding element can
+    kick someone else out
+    """
+    def __init__(self):
+        self.buckets = [None] * BUCKET_SIZE
 
-def args_dict():
-    return r_dict(args_eq, args_hash)
+    def get(self, op):
+        hash = op.get_hash()
 
-def args_dict_box():
-    return r_dict(args_eq, args_hash)
+# def args_eq(args1, args2):
+#     make_sure_not_resized(args1)
+#     make_sure_not_resized(args2)
+#     if len(args1) != len(args2):
+#         return False
+#     for i in range(len(args1)):
+#         arg1 = args1[i]
+#         arg2 = args2[i]
+#         if arg1 is None:
+#             if arg2 is not None:
+#                 return False
+#         elif not arg1.same_box(arg2):
+#             return False
+#     return True
+
+# def args_hash(args):
+#     make_sure_not_resized(args)
+#     res = 0x345678
+#     for arg in args:
+#         if arg is None:
+#             y = 17
+#         else:
+#             y = arg._get_hash_()
+#         res = intmask((1000003 * res) ^ y)
+#     return res
+
+# def args_dict():
+#     return r_dict(args_eq, args_hash)
+
+# def args_dict_box():
+#     return r_dict(args_eq, args_hash)
 
 
 # ____________________________________________________________
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
@@ -143,11 +143,6 @@
     def _get_hash_(self):
         return compute_identity_hash(self)
 
-    # XXX the interface below has to be revisited
-
-    def clonebox(self):
-        raise NotImplementedError
-
     def constbox(self):
         raise NotImplementedError
 
@@ -223,27 +218,161 @@
         raise NotImplementedError("type %s not supported" % TYPE)
 getkind._annspecialcase_ = 'specialize:memo'
 
+def repr_pointer(box):
+    from pypy.rpython.lltypesystem import rstr
+    try:
+        T = box.value._obj.container._normalizedcontainer(check=False)._TYPE
+        if T is rstr.STR:
+            return repr(box._get_str())
+        return '*%s' % (T._name,)
+    except AttributeError:
+        return box.value
+
+class Box(AbstractValue):
+    __slots__ = ()
+    _counter = 0
+
+    def nonconstbox(self):
+        return self
+
+    def __repr__(self):
+        result = str(self)
+        if self._extended_display:
+            result += '(%s)' % self._getrepr_()
+        return result
+
+    def __str__(self):
+        if not hasattr(self, '_str'):
+            try:
+                if self.type == INT:
+                    t = 'i'
+                elif self.type == FLOAT:
+                    t = 'f'
+                else:
+                    t = 'p'
+            except AttributeError:
+                t = 'b'
+            self._str = '%s%d' % (t, Box._counter)
+            Box._counter += 1
+        return self._str
+
+    def _get_str(self):    # for debugging only
+        return self.constbox()._get_str()
+
+    def forget_value(self):
+        raise NotImplementedError
+
+    def is_constant(self):
+        return False
+
+class BoxInt(Box):
+    type = INT
+    _attrs_ = ('value',)
+
+    def __init__(self, value=0):
+        if not we_are_translated():
+            if is_valid_int(value):
+                value = int(value)    # bool -> int
+            else:
+                assert isinstance(value, Symbolic)
+        self.value = value
+
+    def forget_value(self):
+        self.value = 0
+
+    def constbox(self):
+        return ConstInt(self.value)
+
+    def getint(self):
+        return self.value
+
+    def getaddr(self):
+        return heaptracker.int2adr(self.value)
+
+    def _get_hash_(self):
+        return make_hashable_int(self.value)
+
+    def nonnull(self):
+        return self.value != 0
+
+    def _getrepr_(self):
+        return self.value
+
+    def repr_rpython(self):
+        return repr_rpython(self, 'bi')
+
+class BoxFloat(Box):
+    type = FLOAT
+    _attrs_ = ('value',)
+
+    def __init__(self, valuestorage=longlong.ZEROF):
+        assert lltype.typeOf(valuestorage) is longlong.FLOATSTORAGE
+        self.value = valuestorage
+
+    def forget_value(self):
+        self.value = longlong.ZEROF
+
+    def constbox(self):
+        return ConstFloat(self.value)
+
+    def getfloatstorage(self):
+        return self.value
+
+    def _get_hash_(self):
+        return longlong.gethash(self.value)
+
+    def nonnull(self):
+        return self.value != longlong.ZEROF
+
+    def _getrepr_(self):
+        return self.getfloat()
+
+    def repr_rpython(self):
+        return repr_rpython(self, 'bf')
+
+class BoxPtr(Box):
+    type = REF
+    _attrs_ = ('value',)
+
+    def __init__(self, value=lltype.nullptr(llmemory.GCREF.TO)):
+        assert lltype.typeOf(value) == llmemory.GCREF
+        self.value = value
+
+    def forget_value(self):
+        self.value = lltype.nullptr(llmemory.GCREF.TO)
+
+    def constbox(self):
+        return ConstPtr(self.value)
+
+    def getref_base(self):
+        return self.value
+
+    def getref(self, PTR):
+        return lltype.cast_opaque_ptr(PTR, self.getref_base())
+    getref._annspecialcase_ = 'specialize:arg(1)'
+
+    def getaddr(self):
+        return llmemory.cast_ptr_to_adr(self.value)
+
+    def _get_hash_(self):
+        if self.value:
+            return lltype.identityhash(self.value)
+        else:
+            return 0
+
+    def nonnull(self):
+        return bool(self.value)
+
+    def repr_rpython(self):
+        return repr_rpython(self, 'bp')
+
+    _getrepr_ = repr_pointer
+
+NULLBOX = BoxPtr()
+
 class Const(AbstractValue):
     __slots__ = ()
 
-    @staticmethod
-    def _new(x):
-        "NOT_RPYTHON"
-        T = lltype.typeOf(x)
-        kind = getkind(T)
-        if kind == "int":
-            if isinstance(T, lltype.Ptr):
-                intval = heaptracker.adr2int(llmemory.cast_ptr_to_adr(x))
-            else:
-                intval = lltype.cast_primitive(lltype.Signed, x)
-            return ConstInt(intval)
-        elif kind == "ref":
-            return cpu.ts.new_ConstRef(x)
-        elif kind == "float":
-            return ConstFloat(longlong.getfloatstorage(x))
-        else:
-            raise NotImplementedError(kind)
-
     def constbox(self):
         return self
 
@@ -264,16 +393,6 @@
                         compute_unique_id(box))
 
 
-def repr_pointer(box):
-    from pypy.rpython.lltypesystem import rstr
-    try:
-        T = box.value._obj.container._normalizedcontainer(check=False)._TYPE
-        if T is rstr.STR:
-            return repr(box._get_str())
-        return '*%s' % (T._name,)
-    except AttributeError:
-        return box.value
-
 def repr_object(box):
     try:
         TYPE = box.value.obj._TYPE
@@ -312,12 +431,9 @@
                 assert isinstance(value, Symbolic)
         self.value = value
 
-    def clonebox(self):
-        from pypy.jit.metainterp.history import BoxInt
+    def nonconstbox(self):
         return BoxInt(self.value)
 
-    nonconstbox = clonebox
-
     def getint(self):
         return self.value
 
@@ -353,12 +469,9 @@
         assert lltype.typeOf(valuestorage) is longlong.FLOATSTORAGE
         self.value = valuestorage
 
-    def clonebox(self):
-        from pypy.jit.metainterp.history import BoxFloat
+    def nonconstbox(self):
         return BoxFloat(self.value)
 
-    nonconstbox = clonebox
-
     def getfloatstorage(self):
         return self.value
 
@@ -390,12 +503,9 @@
         assert lltype.typeOf(value) == llmemory.GCREF
         self.value = value
 
-    def clonebox(self):
-        from pypy.jit.metainterp.history import BoxPtr
+    def nonconstbox(self):
         return BoxPtr(self.value)
 
-    nonconstbox = clonebox
-
     def getref_base(self):
         return self.value
 
@@ -436,57 +546,6 @@
 
 CONST_NULL = ConstPtr(ConstPtr.value)
 
-class ConstObj(Const):
-    type = REF
-    value = ootype.NULL
-    _attrs_ = ('value',)
-
-    def __init__(self, value):
-        assert ootype.typeOf(value) is ootype.Object
-        self.value = value
-
-    def clonebox(self):
-        from pypy.jit.metainterp.history import BoxObj
-        return BoxObj(self.value)
-
-    nonconstbox = clonebox
-
-    def getref_base(self):
-       return self.value
-
-    def getref(self, OBJ):
-        return ootype.cast_from_object(OBJ, self.getref_base())
-    getref._annspecialcase_ = 'specialize:arg(1)'
-
-    def _get_hash_(self):
-        if self.value:
-            return ootype.identityhash(self.value)
-        else:
-            return 0
-
-##    def getaddr(self):
-##        # so far this is used only when calling
-##        # CodeWriter.IndirectCallset.bytecode_for_address.  We don't need a
-##        # real addr, but just a key for the dictionary
-##        return self.value
-
-    def same_constant(self, other):
-        if isinstance(other, ConstObj):
-            return self.value == other.value
-        return False
-
-    def nonnull(self):
-        return bool(self.value)
-
-    _getrepr_ = repr_object
-
-    def repr_rpython(self):
-        return repr_rpython(self, 'co')
-
-    def _get_str(self):    # for debugging only
-        from pypy.rpython.annlowlevel import hlstr
-        return hlstr(ootype.cast_from_object(ootype.String, self.value))
-
 class AbstractResOp(AbstractValue):
     """The central ResOperation class, representing one operation."""
 
@@ -500,6 +559,8 @@
                     'valid from optimizations (store_final_args) until '
                     'the backend',
         'llgraph_var2index': 'llgraph internal attribute',
+        'optimize_value': 'value replacement for the optimizer. only valid for'
+                          ' the length of optimization pass',
     }
 
     extras = None
@@ -529,6 +590,9 @@
         return cls.opnum
 
     def __hash__(self):
+        import sys
+        if sys._getframe(1).f_code.co_filename.endswith('resume.py'):
+            return object.__hash__(self)
         raise Exception("Should not hash resops, use get/set extra instead")
 
     # methods implemented by the arity mixins
@@ -1308,7 +1372,7 @@
 setup(__name__ == '__main__')   # print out the table when run directly
 del _oplist
 
-opboolinvers = {
+_opboolinvers = {
     rop.INT_EQ: rop.INT_NE,
     rop.INT_NE: rop.INT_EQ,
     rop.INT_LT: rop.INT_GE,
@@ -1332,7 +1396,7 @@
     rop.PTR_NE: rop.PTR_EQ,
     }
 
-opboolreflex = {
+_opboolreflex = {
     rop.INT_EQ: rop.INT_EQ,
     rop.INT_NE: rop.INT_NE,
     rop.INT_LT: rop.INT_GT,
@@ -1355,3 +1419,10 @@
     rop.PTR_EQ: rop.PTR_EQ,
     rop.PTR_NE: rop.PTR_NE,
     }
+
+opboolinvers = [-1] * len(opclasses)
+opboolreflex = [-1] * len(opclasses)
+for k, v in _opboolreflex.iteritems():
+    opboolreflex[k] = v
+for k, v in _opboolinvers.iteritems():
+    opboolinvers[k] = v
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -23,11 +23,9 @@
         self.initarglist(args)
         self.setdescr(descr)
 
-    def getopnum(self):
-        return self.OPNUM
-
-    def clone(self):
-        return ESCAPE_OP(self.OPNUM, self.getarglist()[:], self.result, self.getdescr())
+    @classmethod
+    def getopnum(cls):
+        return cls.OPNUM
 
 class FORCE_SPILL(UnaryOp, ResOpNone, PlainResOp):
 


More information about the pypy-commit mailing list