[pypy-svn] r26138 - in pypy/dist/pypy: rpython/ootypesystem rpython/test translator/cli/test
antocuni at codespeak.net
antocuni at codespeak.net
Sat Apr 22 13:36:52 CEST 2006
Author: antocuni
Date: Sat Apr 22 13:36:32 2006
New Revision: 26138
Modified:
pypy/dist/pypy/rpython/ootypesystem/ootype.py
pypy/dist/pypy/rpython/ootypesystem/rdict.py
pypy/dist/pypy/rpython/test/test_rdict.py
pypy/dist/pypy/translator/cli/test/compile.py
Log:
More rdict support.
Modified: pypy/dist/pypy/rpython/ootypesystem/ootype.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/ootype.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/ootype.py Sat Apr 22 13:36:32 2006
@@ -283,8 +283,11 @@
self._GENERIC_METHODS = frozendict({
"ll_length": Meth([], Signed),
- "ll_getitem": Meth([self.KEYTYPE_T], self.VALUETYPE_T),
- "ll_setitem": Meth([self.KEYTYPE_T, self.VALUETYPE_T], Void),
+ "ll_get": Meth([self.KEYTYPE_T, self.VALUETYPE_T], self.VALUETYPE_T), # ll_get(key, default)
+ "ll_set": Meth([self.KEYTYPE_T, self.VALUETYPE_T], Void),
+ "ll_remove": Meth([self.KEYTYPE_T], Bool), # return False is key was not present
+ "ll_contains": Meth([self.KEYTYPE_T], Bool),
+ #"ll_keys": Meth([], List(self.KEYTYPE_T)),
})
self._setup_methods(generic_types)
@@ -643,15 +646,32 @@
# NOT_RPYTHON
return len(self._dict)
- def ll_getitem(self, key):
+ def ll_get(self, key, default):
+ # NOT_RPYTHON
assert typeOf(key) == self._TYPE._KEYTYPE
- return self._dict[key]
+ assert typeOf(key) == self._TYPE._VALUETYPE
+ return self._dict.get(key, default)
- def ll_setitem(self, key, value):
+ def ll_set(self, key, value):
+ # NOT_RPYTHON
assert typeOf(key) == self._TYPE._KEYTYPE
assert typeOf(value) == self._TYPE._VALUETYPE
self._dict[key] = value
+ def ll_remove(self, key):
+ # NOT_RPYTHON
+ assert typeOf(key) == self._TYPE._KEYTYPE
+ try:
+ del self._dict[key]
+ return True
+ except KeyError:
+ return False
+
+ def ll_contains(self, key):
+ # NOT_RPYTHON
+ assert typeOf(key) == self._TYPE._KEYTYPE
+ return key in self._dict
+
class _null_dict(_null_mixin(_dict), _dict):
def __init__(self, DICT):
Modified: pypy/dist/pypy/rpython/ootypesystem/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rdict.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/rdict.py Sat Apr 22 13:36:32 2006
@@ -62,6 +62,29 @@
return hop.genop("oosend", [c_name] + v_args,
resulttype=hop.r_result.lowleveltype)
+ def rtype_len(self, hop):
+ v_dict, = hop.inputargs(self)
+ return self.send_message(hop, 'll_length')
+
+ def rtype_is_true(self, hop):
+ v_dict, = hop.inputargs(self)
+ return hop.gendirectcall(ll_dict_is_true, v_dict)
+
+ def rtype_method_get(self, hop):
+ v_dict, v_key, v_default = hop.inputargs(self, self.key_repr,
+ self.value_repr)
+ hop.exception_cannot_occur()
+ v_res = self.send_message(hop, 'll_get')
+ #v_res = hop.gendirectcall(ll_get, v_dict, v_key, v_default)
+ 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)
+ hop.exception_cannot_occur()
+ v_res = hop.gendirectcall(ll_dict_setdefault, v_dict, v_key, v_default)
+ return self.recast_value(hop.llops, v_res)
+
class __extend__(pairtype(DictRepr, rmodel.Repr)):
@@ -70,15 +93,16 @@
if not r_dict.custom_eq_hash: # TODO: why only in this case?
hop.has_implicit_exception(KeyError) # record that we know about it
hop.exception_is_here()
- v_res = r_dict.send_message(hop, 'll_getitem', can_raise=True)
+ c_dummy_default = hop.inputconst(r_dict.value_repr.lowleveltype, r_dict.value_repr.ll_dummy_value)
+ v_res = hop.gendirectcall(ll_dict_getitem, v_dict, v_key, c_dummy_default)
return r_dict.recast_value(hop.llops, v_res)
-## def rtype_delitem((r_dict, r_key), hop):
-## v_dict, v_key = hop.inputargs(r_dict, r_dict.key_repr)
-## if not r_dict.custom_eq_hash:
-## hop.has_implicit_exception(KeyError) # record that we know about it
-## hop.exception_is_here()
-## return hop.gendirectcall(ll_dict_delitem, v_dict, v_key)
+ def rtype_delitem((r_dict, r_key), hop):
+ v_dict, v_key = hop.inputargs(r_dict, r_dict.key_repr)
+ if not r_dict.custom_eq_hash: # TODO: why only in this case?
+ hop.has_implicit_exception(KeyError) # record that we know about it
+ hop.exception_is_here()
+ return hop.gendirectcall(ll_dict_delitem, v_dict, v_key)
def rtype_setitem((r_dict, r_key), hop):
v_dict, v_key, v_value = hop.inputargs(r_dict, r_dict.key_repr, r_dict.value_repr)
@@ -87,8 +111,35 @@
## else:
## hop.exception_cannot_occur()
hop.exception_is_here()
- return r_dict.send_message(hop, 'll_setitem', can_raise=True)
+ return r_dict.send_message(hop, 'll_set', can_raise=True)
+
+ def rtype_contains((r_dict, r_key), hop):
+ v_dict, v_key = hop.inputargs(r_dict, r_dict.key_repr)
+ return r_dict.send_message(hop, 'll_contains')
+
def ll_newdict(DICT):
return ootype.new(DICT)
+
+def ll_dict_is_true(d):
+ # check if a dict is True, allowing for None
+ return bool(d) and d.ll_length() != 0
+
+def ll_dict_getitem(d, key, dummy_default):
+ # TODO: this is inefficient because it does two lookups
+ if d.ll_contains(key):
+ return d.ll_get(key, dummy_default) # dummy_default is never returned
+ else:
+ raise KeyError
+
+def ll_dict_delitem(d, key):
+ if not d.ll_remove(key):
+ raise KeyError
+
+def ll_dict_setdefault(d, key, default):
+ try:
+ return ll_dict_getitem(d, key, default)
+ except KeyError:
+ d.ll_set(key, default)
+ return default
Modified: pypy/dist/pypy/rpython/test/test_rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rdict.py (original)
+++ pypy/dist/pypy/rpython/test/test_rdict.py Sat Apr 22 13:36:32 2006
@@ -1,6 +1,6 @@
from pypy.translator.translator import TranslationContext
from pypy.rpython.lltypesystem import lltype
-from pypy.rpython.test.test_llinterp import interpret
+from pypy.rpython.test.test_llinterp import interpret, interpret_raises
from pypy.rpython import rstr, rint
from pypy.rpython.lltypesystem import rdict
@@ -15,13 +15,6 @@
return interpret_raises(exc, fn, args, type_system=self.ts)
- def test_dict_creation(self):
- def createdict(i):
- d = {i: i+1}
- return d[i]
- res = self.interpret(createdict, [42])
- assert res == 43
-
# XXX: most tests doesn't works because ootypesystem doesn't support strings, yet
def test_dict_creation():
def createdict(i):
@@ -732,3 +725,68 @@
class TestOotypeRtyping(BaseTestDictRtyping):
ts = "ootype"
+
+ # these tests are similar to those above, but they don't use strings
+ def test_dict_creation(self):
+ def createdict(i):
+ d = {i: i+1}
+ return d[i]
+ res = self.interpret(createdict, [42])
+ assert res == 43
+
+ def test_dict_getitem_setitem(self):
+ def func(i):
+ d = {i: i+1}
+ d[i] = i+2
+ return d[i]
+ res = self.interpret(func, [42])
+
+ def test_dict_is_true(self):
+ def func(i):
+ if i:
+ d = {}
+ else:
+ d = {i: i+1}
+ if d:
+ return i
+ else:
+ return i+1
+ assert self.interpret(func, [42]) == 43
+ assert self.interpret(func, [0]) == 0
+
+ def test_contains(self):
+ def func(x, y):
+ d = {x: x+1}
+ return y in d
+ assert self.interpret(func, [42, 0]) == False
+ assert self.interpret(func, [42, 42]) == True
+
+ def test_delitem(self):
+ def func(x, y):
+ d = {x: x+1}
+ del d[y]
+ self.interpret(func, [42, 42]) # don't raise anything
+ self.interpret_raises(KeyError, func, [42, 0])
+
+ def test_length(self):
+ def func(num):
+ d = {}
+ for i in range(num):
+ d[i] = i+1
+ return len(d)
+ assert self.interpret(func, [0]) == 0
+ assert self.interpret(func, [2]) == 2
+
+ def test_get(self):
+ def func(x, y):
+ d = {x: x+1}
+ return d.get(x, y) + d.get(x+1, y)
+ assert self.interpret(func, [42, 13]) == 56
+
+ def test_setdefault(self):
+ def func(x, y):
+ d = {}
+ d.setdefault(x, y)
+ return d[x]
+ assert self.interpret(func, [42, 13]) == 13
+
Modified: pypy/dist/pypy/translator/cli/test/compile.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/compile.py (original)
+++ pypy/dist/pypy/translator/cli/test/compile.py Sat Apr 22 13:36:32 2006
@@ -26,10 +26,8 @@
def bar(x, y):
- lst = [1,2]
- lst.append(x)
- return lst[2]
-
+ d = {x: y}
+ return d[x]
f = compile_function(bar, [int, int])
More information about the Pypy-commit
mailing list