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

Reply via email to