[pypy-commit] pypy virtual-arguments: a special strategy for the especially common case of an empty kwargs dict
cfbolz
noreply at buildbot.pypy.org
Mon Apr 23 11:54:35 CEST 2012
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: virtual-arguments
Changeset: r54661:57a4fb6a5b6a
Date: 2012-04-22 20:09 +0200
http://bitbucket.org/pypy/pypy/changeset/57a4fb6a5b6a/
Log: a special strategy for the especially common case of an empty kwargs
dict
diff --git a/pypy/objspace/std/dictmultiobject.py b/pypy/objspace/std/dictmultiobject.py
--- a/pypy/objspace/std/dictmultiobject.py
+++ b/pypy/objspace/std/dictmultiobject.py
@@ -48,8 +48,8 @@
elif kwargs:
assert w_type is None
- from pypy.objspace.std.kwargsdict import KwargsDictStrategy
- strategy = space.fromcache(KwargsDictStrategy)
+ from pypy.objspace.std.kwargsdict import EmptyKwargsDictStrategy
+ strategy = space.fromcache(EmptyKwargsDictStrategy)
else:
strategy = space.fromcache(EmptyDictStrategy)
if w_type is None:
diff --git a/pypy/objspace/std/kwargsdict.py b/pypy/objspace/std/kwargsdict.py
--- a/pypy/objspace/std/kwargsdict.py
+++ b/pypy/objspace/std/kwargsdict.py
@@ -3,11 +3,20 @@
from pypy.rlib import rerased, jit
from pypy.objspace.std.dictmultiobject import (DictStrategy,
+ EmptyDictStrategy,
IteratorImplementation,
ObjectDictStrategy,
StringDictStrategy)
+class EmptyKwargsDictStrategy(EmptyDictStrategy):
+ def switch_to_string_strategy(self, w_dict):
+ strategy = self.space.fromcache(KwargsDictStrategy)
+ storage = strategy.get_empty_storage()
+ w_dict.strategy = strategy
+ w_dict.dstorage = storage
+
+
class KwargsDictStrategy(DictStrategy):
erase, unerase = rerased.new_erasing_pair("kwargsdict")
erase = staticmethod(erase)
diff --git a/pypy/objspace/std/test/test_kwargsdict.py b/pypy/objspace/std/test/test_kwargsdict.py
--- a/pypy/objspace/std/test/test_kwargsdict.py
+++ b/pypy/objspace/std/test/test_kwargsdict.py
@@ -100,6 +100,14 @@
d = W_DictMultiObject(space, strategy, storage)
assert (space.view_as_kwargs(d) == [], [])
+def test_from_empty_to_kwargs():
+ strategy = EmptyKwargsDictStrategy(space)
+ storage = strategy.get_empty_storage()
+ d = W_DictMultiObject(space, strategy, storage)
+ d.setitem_str("a", 3)
+ assert isinstance(d.strategy, KwargsDictStrategy)
+
+
from pypy.objspace.std.test.test_dictmultiobject import BaseTestRDictImplementation, BaseTestDevolvedDictImplementation
def get_impl(self):
storage = strategy.erase(([], []))
@@ -130,4 +138,6 @@
return args
d = f(a=1)
assert "KwargsDictStrategy" in self.get_strategy(d)
+ d = f()
+ assert "EmptyKwargsDictStrategy" in self.get_strategy(d)
More information about the pypy-commit
mailing list