Author: Carl Friedrich Bolz <[email protected]>
Branch: value-profiling
Changeset: r81864:6e1f9f4ed3fa
Date: 2016-01-16 07:47 +0100
http://bitbucket.org/pypy/pypy/changeset/6e1f9f4ed3fa/
Log: do the same thing for write
diff --git a/pypy/objspace/std/mapdict.py b/pypy/objspace/std/mapdict.py
--- a/pypy/objspace/std/mapdict.py
+++ b/pypy/objspace/std/mapdict.py
@@ -59,14 +59,18 @@
if cls is W_IntObject:
# this means that the class stored in the storage is an
# IntMutableCell
+ assert isinstance(result, IntMutableCell)
return W_IntObject(result.intvalue)
if cls is W_FloatObject:
# ditto
+ assert isinstance(result, FloatMutableCell)
return W_FloatObject(result.floatvalue)
jit.record_exact_class(result, cls)
return attr._read_cell(result)
def write(self, obj, selector, w_value):
+ from pypy.objspace.std.intobject import W_IntObject
+ from pypy.objspace.std.floatobject import W_FloatObject
attr = self.find_map_attr(selector)
if attr is None:
return self.terminator._write_terminator(obj, selector, w_value)
@@ -80,6 +84,21 @@
attr.ever_mutated = True
self.see_write(w_value)
cell = obj._mapdict_read_storage(attr.storageindex)
+ if jit.we_are_jitted() and attr.class_is_known():
+ cls = attr.read_constant_cls()
+ if cls is W_IntObject:
+ # this means that the class stored in the storage is an
+ # IntMutableCell
+ assert isinstance(cell, IntMutableCell)
+ assert isinstance(w_value, W_IntObject)
+ cell.intvalue = w_value.intval
+ return True
+ if cls is W_FloatObject:
+ # ditto
+ assert isinstance(cell, FloatMutableCell)
+ assert isinstance(w_value, W_FloatObject)
+ cell.floatvalue = w_value.floatval
+ return True
w_value = attr._write_cell(cell, w_value)
if w_value is not None:
obj._mapdict_write_storage(attr.storageindex, w_value)
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
@@ -535,6 +535,10 @@
assert getattr(obj.getdictvalue(space, "a"), attrname) == val
assert getattr(obj.getdictvalue(space, "a"), attrname) == val
+ monkeypatch.setattr(obj.map, "_write_cell", None) # not needed for the
next write
+ obj.setdictvalue(space, "a", a1)
+ assert getattr(obj.getdictvalue(space, "a"), attrname) == val + 1
+
def test_value_profiling_elide_write(monkeypatch):
monkeypatch.setattr(jit, "we_are_jitted", lambda : True)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit