[pypy-commit] pypy jit-cleanup: Move new_ref_dict() to rpython.jit.metainterp.history

rlamy pypy.commits at gmail.com
Wed Apr 3 19:01:43 EDT 2019


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: jit-cleanup
Changeset: r96413:e6ca265bbc8a
Date: 2019-04-03 20:28 +0100
http://bitbucket.org/pypy/pypy/changeset/e6ca265bbc8a/

Log:	Move new_ref_dict() to rpython.jit.metainterp.history

diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -1,18 +1,15 @@
 from rpython.rlib import rgc
-from rpython.rlib.objectmodel import we_are_translated, r_dict, always_inline
+from rpython.rlib.objectmodel import we_are_translated, always_inline
 from rpython.rlib.rarithmetic import ovfcheck, highest_bit
 from rpython.rtyper.lltypesystem import llmemory, lltype, rstr
 from rpython.rtyper.annlowlevel import cast_instance_to_gcref
-from rpython.jit.metainterp import history
-from rpython.jit.metainterp.history import ConstInt, ConstPtr
+from rpython.jit.metainterp.history import (
+    ConstInt, ConstPtr, JitCellToken, new_ref_dict)
 from rpython.jit.metainterp.resoperation import ResOperation, rop, OpHelpers
-from rpython.jit.metainterp.typesystem import rd_eq, rd_hash
 from rpython.jit.codewriter import heaptracker
 from rpython.jit.backend.llsupport.symbolic import (WORD,
         get_field_token, get_array_token)
-from rpython.jit.backend.llsupport.descr import SizeDescr, ArrayDescr,\
-     FLAG_POINTER
-from rpython.jit.metainterp.history import JitCellToken
+from rpython.jit.backend.llsupport.descr import SizeDescr, ArrayDescr
 from rpython.jit.backend.llsupport.descr import (unpack_arraydescr,
         unpack_fielddescr, unpack_interiorfielddescr)
 from rpython.rtyper.lltypesystem.lloperation import llop
@@ -608,11 +605,11 @@
     def handle_call_assembler(self, op):
         descrs = self.gc_ll_descr.getframedescrs(self.cpu)
         loop_token = op.getdescr()
-        assert isinstance(loop_token, history.JitCellToken)
+        assert isinstance(loop_token, JitCellToken)
         jfi = loop_token.compiled_loop_token.frame_info
         llfi = heaptracker.adr2int(llmemory.cast_ptr_to_adr(jfi))
         frame = self.gen_malloc_frame(llfi)
-        self.emit_setfield(frame, history.ConstInt(llfi),
+        self.emit_setfield(frame, ConstInt(llfi),
                            descr=descrs.jf_frame_info)
         arglist = op.getarglist()
         index_list = loop_token.compiled_loop_token._ll_initial_locs
@@ -948,7 +945,7 @@
 
     def _gcref_index(self, gcref):
         if self.gcrefs_map is None:
-            self.gcrefs_map = r_dict(rd_eq, rd_hash)
+            self.gcrefs_map = new_ref_dict()
         try:
             return self.gcrefs_map[gcref]
         except KeyError:
diff --git a/rpython/jit/backend/test/jitlog_test.py b/rpython/jit/backend/test/jitlog_test.py
--- a/rpython/jit/backend/test/jitlog_test.py
+++ b/rpython/jit/backend/test/jitlog_test.py
@@ -3,7 +3,6 @@
 from rpython.rlib import debug
 from rpython.jit.tool.oparser import pure_parse
 from rpython.jit.metainterp import logger
-from rpython.jit.metainterp.typesystem import llhelper
 from rpython.rlib.rjitlog import rjitlog as jl
 from StringIO import StringIO
 from rpython.jit.metainterp.optimizeopt.util import equaloplists
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -3,8 +3,8 @@
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
 from rpython.rtyper.annlowlevel import (
     cast_gcref_to_instance, cast_instance_to_gcref)
-from rpython.rlib.objectmodel import we_are_translated, Symbolic
-from rpython.rlib.objectmodel import compute_unique_id, specialize
+from rpython.rlib.objectmodel import (
+    we_are_translated, Symbolic, compute_unique_id, specialize, r_dict)
 from rpython.rlib.rarithmetic import r_int64, is_valid_int
 from rpython.rlib.rarithmetic import LONG_BIT, intmask, r_uint
 from rpython.rlib.jit import Counters
@@ -386,6 +386,20 @@
     return result
 _const_ptr_for_unicode = {}
 
+# A dict whose keys are refs (like the .value of ConstPtr).
+# It is an r_dict. Note that NULL is not allowed as a key.
+ at specialize.call_location()
+def new_ref_dict():
+    return r_dict(rd_eq, rd_hash, simple_hash_eq=True)
+
+def rd_eq(ref1, ref2):
+    return ref1 == ref2
+
+def rd_hash(ref):
+    assert ref
+    return lltype.identityhash(ref)
+
+
 # ____________________________________________________________
 
 # The JitCellToken class is the root of a tree of traces.  Each branch ends
diff --git a/rpython/jit/metainterp/opencoder.py b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -6,14 +6,14 @@
 Snapshot index for guards points to snapshot stored in _snapshots of trace
 """
 
-from rpython.jit.metainterp.history import ConstInt, Const, ConstFloat, ConstPtr
+from rpython.jit.metainterp.history import (
+    ConstInt, Const, ConstFloat, ConstPtr, new_ref_dict)
 from rpython.jit.metainterp.resoperation import AbstractResOp, AbstractInputArg,\
     ResOperation, oparity, rop, opwithdescr, GuardResOp, IntOp, FloatOp, RefOp,\
     opclasses
 from rpython.rlib.rarithmetic import intmask, r_uint
 from rpython.rlib.objectmodel import we_are_translated, specialize
 from rpython.rtyper.lltypesystem import rffi, lltype, llmemory
-from rpython.jit.metainterp.typesystem import llhelper
 
 TAGINT, TAGCONSTPTR, TAGCONSTOTHER, TAGBOX = range(4)
 TAGMASK = 0x3
@@ -179,7 +179,7 @@
         if opwithdescr[opnum]:
             descr_index = self._next()
             if rop.is_guard(opnum):
-                update_liveranges(self.trace._snapshots[descr_index], index, 
+                update_liveranges(self.trace._snapshots[descr_index], index,
                                   liveranges)
         if opclasses[opnum].type != 'v':
             return index + 1
@@ -274,7 +274,7 @@
         self._consts_ptr = 0
         self._descrs = [None]
         self._refs = [lltype.nullptr(llmemory.GCREF.TO)]
-        self._refs_dict = llhelper.new_ref_dict_3()
+        self._refs_dict = new_ref_dict()
         self._bigints = []
         self._bigints_dict = {}
         self._floats = []
@@ -304,7 +304,7 @@
         assert not self.tag_overflow
 
         self._bigints_dict = {}
-        self._refs_dict = llhelper.new_ref_dict_3()
+        self._refs_dict = new_ref_dict()
         debug_start("jit-trace-done")
         debug_print("trace length: " + str(self._pos))
         debug_print(" total snapshots: " + str(self._total_snapshots))
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -3,7 +3,7 @@
 
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.jit.metainterp.optimizeopt.util import args_dict
-from rpython.jit.metainterp.history import Const, ConstInt
+from rpython.jit.metainterp.history import Const, ConstInt, new_ref_dict
 from rpython.jit.metainterp.jitexc import JitException
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimization, REMOVED
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
@@ -14,7 +14,7 @@
      GuardResOp
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.jit.metainterp.optimizeopt import info
-        
+
 
 
 class BogusImmutableField(JitException):
@@ -97,7 +97,7 @@
             # need any _lazy_set: the heap value is already right.
             # Note that this may reset to None a non-None lazy_set,
             # cancelling its previous effects with no side effect.
-            
+
             # Now, we have to force the item in the short preamble
             self._getfield(structinfo, op.getdescr(), optheap)
             self._lazy_set = None
@@ -251,7 +251,7 @@
     def setup(self):
         self.optimizer.optheap = self
         # mapping const value -> info corresponding to it's heap cache
-        self.const_infos = self.optimizer.cpu.ts.new_ref_dict()
+        self.const_infos = new_ref_dict()
 
     def flush(self):
         self.cached_dict_reads.clear()
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -1,7 +1,7 @@
 from rpython.jit.metainterp import jitprof, resume, compile
 from rpython.jit.metainterp.executor import execute_nonspec_const
 from rpython.jit.metainterp.history import (
-    Const, ConstInt, ConstPtr, CONST_NULL)
+    Const, ConstInt, ConstPtr, CONST_NULL, new_ref_dict)
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound,\
      ConstIntBound, MININT, MAXINT, IntUnbounded
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
@@ -9,7 +9,6 @@
      OpHelpers
 from rpython.jit.metainterp.optimizeopt import info
 from rpython.jit.metainterp.optimize import InvalidLoop
-from rpython.jit.metainterp.typesystem import llhelper
 from rpython.rlib.objectmodel import specialize, we_are_translated
 from rpython.rlib.debug import debug_print
 from rpython.rtyper import rclass
@@ -272,7 +271,7 @@
         self.metainterp_sd = metainterp_sd
         self.jitdriver_sd = jitdriver_sd
         self.cpu = metainterp_sd.cpu
-        self.interned_refs = self.cpu.ts.new_ref_dict()
+        self.interned_refs = new_ref_dict()
         self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
         self.pendingfields = None # set temporarily to a list, normally by
                                   # heap.py, as we're about to generate a guard
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -2,9 +2,8 @@
 from rpython.jit.metainterp.history import (Const, ConstInt, ConstPtr,
     get_const_ptr_for_string, get_const_ptr_for_unicode, REF, INT,
     DONT_CHANGE, CONST_NULL)
-from rpython.jit.metainterp.optimizeopt import optimizer
-from rpython.jit.metainterp.optimizeopt.optimizer import CONST_0, CONST_1
-from rpython.jit.metainterp.optimizeopt.optimizer import llhelper, REMOVED
+from rpython.jit.metainterp.optimizeopt.optimizer import (
+    CONST_0, CONST_1, REMOVED, Optimization)
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from rpython.jit.metainterp.resoperation import rop, ResOperation
 from rpython.jit.metainterp.optimizeopt import info
@@ -47,7 +46,6 @@
 # ____________________________________________________________
 
 
-
 class StrPtrInfo(info.AbstractVirtualPtrInfo):
     #_attrs_ = ('length', 'lenbound', 'lgtop', 'mode', '_cached_vinfo', '_is_virtual')
 
@@ -72,7 +70,7 @@
 
     @specialize.arg(2)
     def get_constant_string_spec(self, string_optimizer, mode):
-        return None # can't be constant
+        return None  # can't be constant
 
     def force_box(self, op, optforce):
         if not self.is_virtual():
@@ -196,8 +194,8 @@
     def initialize_forced_string(self, op, string_optimizer, targetbox,
                                  offsetbox, mode):
         for i in range(len(self._chars)):
-            assert not isinstance(targetbox, Const) # ConstPtr never makes sense
-            charbox = self.strgetitem(i) # can't be virtual
+            assert not isinstance(targetbox, Const)  # ConstPtr never makes sense
+            charbox = self.strgetitem(i)  # can't be virtual
             if charbox is not None:
                 op = ResOperation(mode.STRSETITEM, [targetbox,
                                                     offsetbox,
@@ -247,7 +245,7 @@
             length = vlength.getint()
             assert start >= 0
             assert length >= 0
-            return s1[start : start + length]
+            return s1[start: start + length]
         return None
 
     def getstrlen(self, op, string_optimizer, mode):
@@ -353,7 +351,7 @@
             charbox = string_optimizer.strgetitem(None, srcbox, srcoffsetbox,
                                                   mode)
             srcoffsetbox = _int_add(string_optimizer, srcoffsetbox, CONST_1)
-            assert not isinstance(targetbox, Const)# ConstPtr never makes sense
+            assert not isinstance(targetbox, Const)  # ConstPtr never makes sense
             string_optimizer.emit_extra(ResOperation(mode.STRSETITEM,
                     [targetbox, offsetbox, charbox]))
             offsetbox = _int_add(string_optimizer, offsetbox, CONST_1)
@@ -412,7 +410,7 @@
     return resbox
 
 
-class OptString(optimizer.Optimization):
+class OptString(Optimization):
     "Handling of strings and unicodes."
 
     def setup(self):
@@ -444,6 +442,7 @@
 
     def optimize_NEWSTR(self, op):
         return self._optimize_NEWSTR(op, mode_string)
+
     def optimize_NEWUNICODE(self, op):
         return self._optimize_NEWSTR(op, mode_unicode)
 
@@ -480,6 +479,7 @@
 
     def optimize_STRGETITEM(self, op):
         return self._optimize_STRGETITEM(op, mode_string)
+
     def optimize_UNICODEGETITEM(self, op):
         return self._optimize_STRGETITEM(op, mode_unicode)
 
@@ -522,6 +522,7 @@
 
     def optimize_STRLEN(self, op):
         return self._optimize_STRLEN(op, mode_string)
+
     def optimize_UNICODELEN(self, op):
         return self._optimize_STRLEN(op, mode_unicode)
 
@@ -537,6 +538,7 @@
 
     def optimize_STRHASH(self, op):
         return self._optimize_STRHASH(op, mode_string)
+
     def optimize_UNICODEHASH(self, op):
         return self._optimize_STRHASH(op, mode_unicode)
 
@@ -761,18 +763,15 @@
                     l1box = i1.getstrlen(arg1, self, mode)
                 if isinstance(l1box, ConstInt) and l1box.value == 1:
                     # comparing two single chars
-                    vchar1 = self.strgetitem(None, arg1, optimizer.CONST_0,
-                                             mode)
-                    vchar2 = self.strgetitem(None, arg2, optimizer.CONST_0,
-                                             mode)
+                    vchar1 = self.strgetitem(None, arg1, CONST_0, mode)
+                    vchar2 = self.strgetitem(None, arg2, CONST_0, mode)
                     seo = self.optimizer.send_extra_operation
                     op = self.optimizer.replace_op_with(resultop, rop.INT_EQ,
                                 [vchar1, vchar2], descr=DONT_CHANGE)
                     seo(op)
                     return True, None
                 if isinstance(i1, VStringSliceInfo):
-                    vchar = self.strgetitem(None, arg2, optimizer.CONST_0,
-                                            mode)
+                    vchar = self.strgetitem(None, arg2, CONST_0, mode)
                     do = EffectInfo.OS_STREQ_SLICE_CHAR
                     return True, self.generate_modified_call(do, [i1.s, i1.start,
                                                                   i1.lgtop, vchar],
@@ -801,7 +800,7 @@
             l2info = self.getintbound(l2box)
             if l2info.is_constant():
                 if l2info.getint() == 1:
-                    vchar = self.strgetitem(None, arg2, optimizer.CONST_0, mode)
+                    vchar = self.strgetitem(None, arg2, CONST_0, mode)
                     if i1 and i1.is_nonnull():
                         do = EffectInfo.OS_STREQ_NONNULL_CHAR
                     else:
@@ -832,8 +831,8 @@
             isinstance(l2box, ConstInt) and
             l1box.getint() == l2box.getint() == 1):
             # comparing two single chars
-            char1 = self.strgetitem(None, op.getarg(1), optimizer.CONST_0, mode)
-            char2 = self.strgetitem(None, op.getarg(2), optimizer.CONST_0, mode)
+            char1 = self.strgetitem(None, op.getarg(1), CONST_0, mode)
+            char2 = self.strgetitem(None, op.getarg(2), CONST_0, mode)
             seo = self.optimizer.send_extra_operation
             op = self.replace_op_with(op, rop.INT_SUB, [char1, char2],
                                       descr=DONT_CHANGE)
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -2,7 +2,8 @@
 from rpython.jit.metainterp import jitprof
 from rpython.jit.metainterp.history import (
     Const, ConstInt, ConstPtr, getkind, INT, REF, FLOAT, CONST_NULL,
-    AbstractDescr, IntFrontendOp, RefFrontendOp, FloatFrontendOp)
+    AbstractDescr, IntFrontendOp, RefFrontendOp, FloatFrontendOp,
+    new_ref_dict)
 from rpython.jit.metainterp.resoperation import rop
 from rpython.rlib import rarithmetic, rstack
 from rpython.rlib.objectmodel import (we_are_translated, specialize,
@@ -177,7 +178,7 @@
         self.cpu = metainterp_sd.cpu
         self.consts = []
         self.large_ints = {}
-        self.refs = self.cpu.ts.new_ref_dict_2()
+        self.refs = new_ref_dict()
         self.cached_boxes = {}
         self.cached_virtuals = {}
 
diff --git a/rpython/jit/metainterp/test/test_history.py b/rpython/jit/metainterp/test/test_history.py
--- a/rpython/jit/metainterp/test/test_history.py
+++ b/rpython/jit/metainterp/test/test_history.py
@@ -70,6 +70,30 @@
     f.set_position(6519)
     assert f.get_position() == 6519
 
+def fresh_ref():
+    S = lltype.GcStruct('S')
+    s = lltype.malloc(S)
+    return lltype.cast_opaque_ptr(llmemory.GCREF, s)
+
+def duplicate_ref(x):
+    s = x._obj.container._as_ptr()
+    return lltype.cast_opaque_ptr(llmemory.GCREF, s)
+
+def test_ref_dict():
+    d = new_ref_dict()
+    ref1 = fresh_ref()
+    ref2 = fresh_ref()
+    ref3 = fresh_ref()
+    d[ref1] = 123
+    d[ref2] = 456
+    d[ref3] = 789
+    ref1b = duplicate_ref(ref1)
+    ref2b = duplicate_ref(ref2)
+    ref3b = duplicate_ref(ref3)
+    assert d[ref1b] == 123
+    assert d[ref2b] == 456
+    assert d[ref3b] == 789
+
 class TestZTranslated(StandaloneTests):
     def test_ztranslated_same_constant_float(self):
         def fn(args):
diff --git a/rpython/jit/metainterp/test/test_typesystem.py b/rpython/jit/metainterp/test/test_typesystem.py
deleted file mode 100644
--- a/rpython/jit/metainterp/test/test_typesystem.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from rpython.jit.metainterp import typesystem
-from rpython.rtyper.lltypesystem import lltype, llmemory
-
-
-class TypeSystemTests(object):
-
-    def test_ref_dict(self):
-        d = self.helper.new_ref_dict()
-        ref1 = self.fresh_ref()
-        ref2 = self.fresh_ref()
-        ref3 = self.fresh_ref()
-        d[ref1] = 123
-        d[ref2] = 456
-        d[ref3] = 789
-        ref1b = self.duplicate_ref(ref1)
-        ref2b = self.duplicate_ref(ref2)
-        ref3b = self.duplicate_ref(ref3)
-        assert d[ref1b] == 123
-        assert d[ref2b] == 456
-        assert d[ref3b] == 789
-
-
-class TestLLtype(TypeSystemTests):
-    helper = typesystem.llhelper
-
-    def fresh_ref(self):
-        S = lltype.GcStruct('S')
-        s = lltype.malloc(S)
-        return lltype.cast_opaque_ptr(llmemory.GCREF, s)
-
-    def duplicate_ref(self, x):
-        s = x._obj.container._as_ptr()
-        return lltype.cast_opaque_ptr(llmemory.GCREF, s)
-
-    def null_ref(self):
-        return lltype.nullptr(llmemory.GCREF.TO)
diff --git a/rpython/jit/metainterp/typesystem.py b/rpython/jit/metainterp/typesystem.py
--- a/rpython/jit/metainterp/typesystem.py
+++ b/rpython/jit/metainterp/typesystem.py
@@ -19,23 +19,4 @@
         cls = llmemory.cast_ptr_to_adr(obj.typeptr)
         return history.ConstInt(heaptracker.adr2int(cls))
 
-    # A dict whose keys are refs (like the .value of BoxPtr).
-    # It is an r_dict on lltype.  Two copies, to avoid conflicts with
-    # the value type.  Note that NULL is not allowed as a key.
-    def new_ref_dict(self):
-        return r_dict(rd_eq, rd_hash, simple_hash_eq=True)
-
-    def new_ref_dict_2(self):
-        return r_dict(rd_eq, rd_hash, simple_hash_eq=True)
-
-    def new_ref_dict_3(self):
-        return r_dict(rd_eq, rd_hash, simple_hash_eq=True)
-
-def rd_eq(ref1, ref2):
-    return ref1 == ref2
-
-def rd_hash(ref):
-    assert ref
-    return lltype.identityhash(ref)
-
 llhelper = LLTypeHelper()


More information about the pypy-commit mailing list