[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