Author: Maciej Fijalkowski <[email protected]>
Branch: rdict-experiments-3
Changeset: r67287:86b9d18ca286
Date: 2013-10-10 12:21 +0200
http://bitbucket.org/pypy/pypy/changeset/86b9d18ca286/
Log: (fijal, arigo) dict.setdefault
diff --git a/rpython/rtyper/lltypesystem/rdict.py
b/rpython/rtyper/lltypesystem/rdict.py
--- a/rpython/rtyper/lltypesystem/rdict.py
+++ b/rpython/rtyper/lltypesystem/rdict.py
@@ -281,7 +281,7 @@
v_dict, v_key, v_default = hop.inputargs(self, self.key_repr,
self.value_repr)
hop.exception_cannot_occur()
- v_res = hop.gendirectcall(ll_setdefault, v_dict, v_key, v_default)
+ v_res = hop.gendirectcall(ll_dict_setdefault, v_dict, v_key, v_default)
return self.recast_value(hop.llops, v_res)
def rtype_method_copy(self, hop):
@@ -973,14 +973,14 @@
else:
return dict.entries[index].value
-def ll_setdefault(dict, key, default):
+def ll_dict_setdefault(dict, key, default):
hash = dict.keyhash(key)
- i = ll_dict_lookup(dict, key, hash)
- if not i & HIGHEST_BIT:
- return ll_get_value(dict, i)
+ index = dict.lookup_function(dict, key, dict.keyhash(key), FLAG_STORE)
+ if index == -1:
+ _ll_dict_setitem_lookup_done(dict, key, default, hash, -1)
+ return default
else:
- _ll_dict_setitem_lookup_done(dict, key, default, hash, i)
- return default
+ return dict.entries[index].value
def ll_copy(dict):
DICT = lltype.typeOf(dict).TO
diff --git a/rpython/rtyper/test/test_rdict.py
b/rpython/rtyper/test/test_rdict.py
--- a/rpython/rtyper/test/test_rdict.py
+++ b/rpython/rtyper/test/test_rdict.py
@@ -200,6 +200,15 @@
assert rdict.ll_dict_get(ll_d, llstr("k"), 32) == 1
assert rdict.ll_dict_get(ll_d, llstr("j"), 32) == 32
+ def test_setdefault(self):
+ DICT = self._get_str_dict()
+ ll_d = rdict.ll_newdict(DICT)
+ rdict.ll_dict_setitem(ll_d, llstr("k"), 1)
+ assert rdict.ll_dict_setdefault(ll_d, llstr("j"), 42) == 42
+ assert rdict.ll_dict_getitem(ll_d, llstr("j")) == 42
+ assert rdict.ll_dict_setdefault(ll_d, llstr("k"), 42) == 1
+ assert rdict.ll_dict_getitem(ll_d, llstr("k")) == 1
+
class TestRDictDirectDummyKey(TestRDictDirect):
class dummykeyobj:
ll_dummy_value = llstr("dupa")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit