[pypy-commit] pypy expose-jsonmap: move fields from JsonMap to JsonStrategy

cfbolz pypy.commits at gmail.com
Sun Nov 3 09:03:49 EST 2019


Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: expose-jsonmap
Changeset: r97946:b23978e0d3fb
Date: 2019-11-03 15:02 +0100
http://bitbucket.org/pypy/pypy/changeset/b23978e0d3fb/

Log:	move fields from JsonMap to JsonStrategy

diff --git a/pypy/module/_pypyjson/interp_decoder.py b/pypy/module/_pypyjson/interp_decoder.py
--- a/pypy/module/_pypyjson/interp_decoder.py
+++ b/pypy/module/_pypyjson/interp_decoder.py
@@ -1017,8 +1017,6 @@
         self.cache_hits = 0
 
         # for jsondict support
-        self.key_to_index = None
-        self.keys_in_order = None
         self.strategy_instance = None
 
     def __repr__(self):
@@ -1139,47 +1137,7 @@
         dict_w[self.w_key] = values_w[index]
         return index + 1
 
-    # _____________________________________________________
-    # methods for JsonDictStrategy
 
-    @jit.elidable
-    def get_index(self, w_key):
-        from pypy.objspace.std.unicodeobject import W_UnicodeObject
-        assert isinstance(w_key, W_UnicodeObject)
-        return self.get_key_to_index().get(w_key, -1)
-
-    def get_key_to_index(self):
-        from pypy.objspace.std.dictmultiobject import unicode_hash, unicode_eq
-        key_to_index = self.key_to_index
-        if key_to_index is None:
-            key_to_index = self.key_to_index = objectmodel.r_dict(unicode_eq, unicode_hash,
-                  force_non_null=True, simple_hash_eq=True)
-            # compute depth
-            curr = self
-            depth = 0
-            while True:
-                depth += 1
-                curr = curr.prev
-                if not isinstance(curr, JSONMap):
-                    break
-
-            curr = self
-            while depth:
-                depth -= 1
-                key_to_index[curr.w_key] = depth
-                curr = curr.prev
-                if not isinstance(curr, JSONMap):
-                    break
-        return key_to_index
-
-    def get_keys_in_order(self):
-        keys_in_order = self.keys_in_order
-        if keys_in_order is None:
-            key_to_index = self.get_key_to_index()
-            keys_in_order = self.keys_in_order = [None] * len(key_to_index)
-            for w_key, index in key_to_index.iteritems():
-                keys_in_order[index] = w_key
-        return keys_in_order
 
     # _____________________________________________________
 
diff --git a/pypy/module/_pypyjson/test/test__pypyjson.py b/pypy/module/_pypyjson/test/test__pypyjson.py
--- a/pypy/module/_pypyjson/test/test__pypyjson.py
+++ b/pypy/module/_pypyjson/test/test__pypyjson.py
@@ -42,24 +42,6 @@
         assert m4.key_repr == '"c"'
         assert m3.nextmap_first is m4
 
-    def test_json_map_get_index(self):
-        m = Terminator(self.space)
-        w_a = self.space.newutf8("a", 1)
-        w_b = self.space.newutf8("b", 1)
-        w_c = self.space.newutf8("c", 1)
-        m1 = m.get_next(w_a, 'a"', 0, 2, m)
-        assert m1.get_index(w_a) == 0
-        assert m1.get_index(w_b) == -1
-
-        m2 = m.get_next(w_b, 'b"', 0, 2, m)
-        assert m2.get_index(w_b) == 0
-        assert m2.get_index(w_a) == -1
-
-        m3 = m2.get_next(w_c, 'c"', 0, 2, m)
-        assert m3.get_index(w_b) == 0
-        assert m3.get_index(w_c) == 1
-        assert m3.get_index(w_a) == -1
-
     def test_jsonmap_fill_dict(self):
         from collections import OrderedDict
         m = Terminator(self.space)
diff --git a/pypy/objspace/std/jsondict.py b/pypy/objspace/std/jsondict.py
--- a/pypy/objspace/std/jsondict.py
+++ b/pypy/objspace/std/jsondict.py
@@ -11,13 +11,13 @@
 
 
 def from_values_and_jsonmap(space, values_w, jsonmap):
-    if not objectmodel.we_are_translated():
-        assert len(values_w) == len(jsonmap.get_keys_in_order())
-        assert len(values_w) != 0
     debug.make_sure_not_resized(values_w)
     strategy = jsonmap.strategy_instance
     if strategy is None:
         jsonmap.strategy_instance = strategy = JsonDictStrategy(space, jsonmap)
+    if not objectmodel.we_are_translated():
+        assert len(values_w) == len(strategy.get_keys_in_order())
+        assert len(values_w) != 0
     storage = strategy.erase(values_w)
     return W_DictObject(space, strategy, storage)
 
@@ -44,6 +44,9 @@
         DictStrategy.__init__(self, space)
         self.jsonmap = jsonmap
 
+        self.key_to_index = None
+        self.keys_in_order = None
+
     def wrap(self, w_key):
         return w_key
 
@@ -80,7 +83,7 @@
         storage_w = self.unerase(w_dict.dstorage)
         if jit.isconstant(w_key):
             jit.promote(self)
-        index = self.jsonmap.get_index(w_key)
+        index = self.get_index(w_key)
         if index == -1:
             return None
         return storage_w[index]
@@ -90,7 +93,7 @@
             if jit.isconstant(w_key):
                 jit.promote(self)
             storage_w = self.unerase(w_dict.dstorage)
-            index = self.jsonmap.get_index(w_key)
+            index = self.get_index(w_key)
             if index != -1:
                 storage_w[index] = w_value
                 return
@@ -118,7 +121,7 @@
         values_w = self.unerase(w_dict.dstorage)
         storage = strategy.get_empty_storage()
         d_new = strategy.unerase(storage)
-        keys_in_order = self.jsonmap.get_keys_in_order()
+        keys_in_order = self.get_keys_in_order()
         assert len(keys_in_order) == len(values_w)
         for index, w_key in enumerate(keys_in_order):
             assert w_key is not None
@@ -128,7 +131,7 @@
         w_dict.dstorage = storage
 
     def w_keys(self, w_dict):
-        return self.space.newlist(self.jsonmap.get_keys_in_order())
+        return self.space.newlist(self.get_keys_in_order())
 
     def values(self, w_dict):
         return self.unerase(w_dict.dstorage)[:]  # to make resizable
@@ -137,12 +140,12 @@
         space = self.space
         storage_w = self.unerase(w_dict.dstorage)
         res = [None] * len(storage_w)
-        for index, w_key in enumerate(self.jsonmap.get_keys_in_order()):
+        for index, w_key in enumerate(self.get_keys_in_order()):
             res[index] = space.newtuple([w_key, storage_w[index]])
         return res
 
     def getiterkeys(self, w_dict):
-        return iter(self.jsonmap.get_keys_in_order())
+        return iter(self.get_keys_in_order())
 
     def getitervalues(self, w_dict):
         storage_w = self.unerase(w_dict.dstorage)
@@ -150,7 +153,50 @@
 
     def getiteritems_with_hash(self, w_dict):
         storage_w = self.unerase(w_dict.dstorage)
-        return ZipItemsWithHash(self.jsonmap.get_keys_in_order(), storage_w)
+        return ZipItemsWithHash(self.get_keys_in_order(), storage_w)
+
+    # ____________________________________________________________
+    # methods for interpreting the jsonmaps
+
+    @jit.elidable
+    def get_index(self, w_key):
+        from pypy.objspace.std.unicodeobject import W_UnicodeObject
+        assert isinstance(w_key, W_UnicodeObject)
+        return self.get_key_to_index().get(w_key, -1)
+
+    def get_key_to_index(self):
+        from pypy.objspace.std.dictmultiobject import unicode_hash, unicode_eq
+        from pypy.module._pypyjson.interp_decoder import JSONMap
+        key_to_index = self.key_to_index
+        if key_to_index is None:
+            key_to_index = self.key_to_index = objectmodel.r_dict(unicode_eq, unicode_hash,
+                  force_non_null=True, simple_hash_eq=True)
+            # compute depth
+            curr = self.jsonmap
+            depth = 0
+            while True:
+                depth += 1
+                curr = curr.prev
+                if not isinstance(curr, JSONMap):
+                    break
+
+            curr = self.jsonmap
+            while depth:
+                depth -= 1
+                key_to_index[curr.w_key] = depth
+                curr = curr.prev
+                if not isinstance(curr, JSONMap):
+                    break
+        return key_to_index
+
+    def get_keys_in_order(self):
+        keys_in_order = self.keys_in_order
+        if keys_in_order is None:
+            key_to_index = self.get_key_to_index()
+            keys_in_order = self.keys_in_order = [None] * len(key_to_index)
+            for w_key, index in key_to_index.iteritems():
+                keys_in_order[index] = w_key
+        return keys_in_order
 
 
 class ZipItemsWithHash(object):
diff --git a/pypy/objspace/std/test/test_jsondict.py b/pypy/objspace/std/test/test_jsondict.py
--- a/pypy/objspace/std/test/test_jsondict.py
+++ b/pypy/objspace/std/test/test_jsondict.py
@@ -1,3 +1,33 @@
+
+class TestJsonDict(object):
+
+    def test_json_map_get_index(self):
+        from pypy.module._pypyjson import interp_decoder
+        from pypy.objspace.std.jsondict import JsonDictStrategy
+        space = self.space
+
+        m = interp_decoder.Terminator(self.space)
+        w_a = space.newutf8("a", 1)
+        w_b = space.newutf8("b", 1)
+        w_c = space.newutf8("c", 1)
+        m1 = m.get_next(w_a, 'a"', 0, 2, m)
+        dm1 = JsonDictStrategy(space, m1)
+        assert dm1.get_index(w_a) == 0
+        assert dm1.get_index(w_b) == -1
+
+        m2 = m.get_next(w_b, 'b"', 0, 2, m)
+        dm2 = JsonDictStrategy(space, m2)
+        assert dm2.get_index(w_b) == 0
+        assert dm2.get_index(w_a) == -1
+
+        m3 = m2.get_next(w_c, 'c"', 0, 2, m)
+        dm3 = JsonDictStrategy(space, m3)
+        assert dm3.get_index(w_b) == 0
+        assert dm3.get_index(w_c) == 1
+        assert dm3.get_index(w_a) == -1
+
+
+
 
 class AppTest(object):
     spaceconfig = {"objspace.usemodules._pypyjson": True}


More information about the pypy-commit mailing list