[pypy-commit] pypy record-exact-value: ( yodada )
yodada
pypy.commits at gmail.com
Sat Jun 29 12:36:42 EDT 2019
Author: Lin Cheng <lc873 at cornell.edu>
Branch: record-exact-value
Changeset: r96883:5d48dd8c5279
Date: 2019-05-27 10:15 -0400
http://bitbucket.org/pypy/pypy/changeset/5d48dd8c5279/
Log: ( yodada )
Added tests related to the value_type in PlainAttribute class. Note
that Terminator's does not need to have value_type field.
diff --git a/pypy/objspace/std/test/test_mapdict.py b/pypy/objspace/std/test/test_mapdict.py
--- a/pypy/objspace/std/test/test_mapdict.py
+++ b/pypy/objspace/std/test/test_mapdict.py
@@ -529,6 +529,47 @@
obj.setdictvalue(space, a, 50)
assert c.terminator.size_estimate() in [(i + 10) // 2, (i + 11) // 2]
+def test_value_type():
+ c = Class()
+ obj = c.instantiate()
+ obj.setdictvalue(space, "a", 10)
+ # Added an integer, so the outter most attribute
+ # has type 'int'
+ assert obj.map.value_type is type(10)
+ obj.setdictvalue(space, "a", "cornell")
+ # Since we are storing both a string and an int into
+ # slot "a", the value_type should be mutated_type
+ assert obj.map.value_type is w_mutated_type.__class__
+
+def test_value_type_reordering():
+ c = Class()
+ obj1 = c.instantiate()
+ obj2 = c.instantiate()
+
+ obj1.setdictvalue(space, "a", 10)
+ obj1.setdictvalue(space, "b", 10)
+ # now obj1's map is
+ # < b: int < a: int < terminal
+ obj2.setdictvalue(space, "b", "cornell")
+ # now obj2's map is
+ # < b: string < terminal
+ # Both of them should have well-behaving value_type
+ assert obj1.map.value_type is type(10)
+ assert obj1.map.back.value_type is type(10)
+ assert obj2.map.value_type is type("cornell")
+ assert obj1.map.terminator is obj2.map.terminator
+
+ # Now we add an "a" attribute into obj2, then during
+ # reordering, the type mismatch should be caught
+ obj2.setdictvalue(space, "a", 10)
+ assert obj1.map.value_type is w_mutated_type.__class__
+ assert obj2.map.value_type is w_mutated_type.__class__
+ assert obj1.map is obj2.map
+ # However, the "a" attribute should be intact
+ assert obj1.map.back is obj2.map.back
+ assert obj1.map.back.value_type is type(10)
+ assert obj2.map.back.value_type is type(10)
+
# ___________________________________________________________
# dict tests
More information about the pypy-commit
mailing list