Index: annotation/unaryop.py =================================================================== --- annotation/unaryop.py (revision 44664) +++ annotation/unaryop.py (working copy) @@ -370,6 +370,11 @@ method_setdefault = method_get + def method_get_fast(dct, key, dfl, hash): + dct.dictdef.generalize_key(key) + dct.dictdef.generalize_value(dfl) + return dct.dictdef.read_value() + def method_copy(dct): return SomeDict(dct.dictdef) Index: rpython/lltypesystem/rdict.py =================================================================== --- rpython/lltypesystem/rdict.py (revision 44664) +++ rpython/lltypesystem/rdict.py (working copy) @@ -250,6 +250,14 @@ v_res = hop.gendirectcall(ll_get, v_dict, v_key, v_default) return self.recast_value(hop.llops, v_res) + def rtype_method_get_fast(self, hop): + v_dict, v_key, v_default, v_hash = hop.inputargs(self, self.key_repr, + self.value_repr, + lltype.Signed) + hop.exception_cannot_occur() + v_res = hop.gendirectcall(ll_get_fast, v_dict, v_key, v_default, v_hash) + return self.recast_value(hop.llops, v_res) + def rtype_method_setdefault(self, hop): v_dict, v_key, v_default = hop.inputargs(self, self.key_repr, self.value_repr) @@ -666,6 +674,13 @@ else: return default +def ll_get_fast(dict, key, default, hash): + entry = ll_dict_lookup(dict, key, hash) + if entry.valid(): + return entry.value + else: + return default + def ll_setdefault(dict, key, default): entry = ll_dict_lookup(dict, key, dict.keyhash(key)) if entry.valid(): Index: rpython/test/test_rdict.py =================================================================== --- rpython/test/test_rdict.py (revision 44664) +++ rpython/test/test_rdict.py (working copy) @@ -30,6 +30,13 @@ res = self.interpret(createdict, [42]) assert res == 42 + def test_dict_get_fast(self): + def fn(): + d = {'hello': 42, 'foo': 43} + return d.get_fast('hello', -1, hash('hello')) + res = self.interpret(fn, []) + assert res == 42 + def test_dict_getitem_setitem(self): def func(i): d = {'hello' : i}