[pypy-svn] r26343 - in pypy/dist/pypy/rpython: . ootypesystem test
antocuni at codespeak.net
antocuni at codespeak.net
Tue Apr 25 19:02:13 CEST 2006
Author: antocuni
Date: Tue Apr 25 19:02:03 2006
New Revision: 26343
Modified:
pypy/dist/pypy/rpython/ootypesystem/ootype.py
pypy/dist/pypy/rpython/ootypesystem/rdict.py
pypy/dist/pypy/rpython/rdict.py
pypy/dist/pypy/rpython/test/test_rdict.py
Log:
Added support for copy(), clear() and update() methods.
Modified: pypy/dist/pypy/rpython/ootypesystem/ootype.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/ootype.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/ootype.py Tue Apr 25 19:02:03 2006
@@ -358,6 +358,7 @@
"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_clear": Meth([], Void),
"ll_get_items_iterator": Meth([], DictItemsIterator(self.KEYTYPE_T, self.VALUETYPE_T)),
})
@@ -795,6 +796,9 @@
assert typeOf(key) == self._TYPE._KEYTYPE
return key in self._dict
+ def ll_clear(self):
+ self._dict.clear()
+
def ll_get_items_iterator(self):
# NOT_RPYTHON
ITER = DictItemsIterator(self._TYPE._KEYTYPE, self._TYPE._VALUETYPE)
Modified: pypy/dist/pypy/rpython/ootypesystem/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rdict.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/rdict.py Tue Apr 25 19:02:03 2006
@@ -69,6 +69,7 @@
def rtype_len(self, hop):
v_dict, = hop.inputargs(self)
+ hop.exception_cannot_occur()
return self.send_message(hop, 'll_length')
def rtype_is_true(self, hop):
@@ -89,6 +90,17 @@
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):
+ v_dict, = hop.inputargs(self)
+ cDICT = hop.inputconst(ootype.Void, self.lowleveltype)
+ hop.exception_cannot_occur()
+ return hop.gendirectcall(ll_dict_copy, cDICT, v_dict)
+
+ def rtype_method_update(self, hop):
+ v_dict1, v_dict2 = hop.inputargs(self, self)
+ hop.exception_cannot_occur()
+ return hop.gendirectcall(ll_dict_update, v_dict1, v_dict2)
+
def rtype_method_keys(self, hop):
return self._rtype_method_kvi(hop, dum_keys)
@@ -118,6 +130,10 @@
hop.exception_cannot_occur()
return DictIteratorRepr(self, "items").newiter(hop)
+ def rtype_method_clear(self, hop):
+ v_dict, = hop.inputargs(self)
+ hop.exception_cannot_occur()
+ return self.send_message(hop, 'll_clear')
class __extend__(pairtype(DictRepr, rmodel.Repr)):
@@ -147,9 +163,12 @@
def rtype_contains((r_dict, r_key), hop):
v_dict, v_key = hop.inputargs(r_dict, r_dict.key_repr)
+ hop.exception_cannot_occur()
return r_dict.send_message(hop, 'll_contains')
+def rtype_r_dict(hop):
+ pass # TODO
def ll_newdict(DICT):
return ootype.new(DICT)
@@ -158,6 +177,19 @@
# check if a dict is True, allowing for None
return bool(d) and d.ll_length() != 0
+def ll_dict_copy(DICT, d):
+ res = ootype.new(DICT)
+ ll_dict_update(res, d)
+ return res
+
+def ll_dict_update(d1, d2):
+ it = d2.ll_get_items_iterator()
+ while it.ll_go_next():
+ key = it.ll_current_key()
+ value = it.ll_current_value()
+ d1.ll_set(key, value)
+
+
def ll_dict_getitem(d, key):
# TODO: this is inefficient because it does two lookups
if d.ll_contains(key):
Modified: pypy/dist/pypy/rpython/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/rdict.py (original)
+++ pypy/dist/pypy/rpython/rdict.py Tue Apr 25 19:02:03 2006
@@ -81,6 +81,7 @@
class AbstractDictIteratorRepr(rmodel.IteratorRepr):
+
def newiter(self, hop):
v_dict, = hop.inputargs(self.r_dict)
citerptr = hop.inputconst(lltype.Void, self.lowleveltype)
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 Tue Apr 25 19:02:03 2006
@@ -857,3 +857,38 @@
return tot1, tot2
res = self.ll_to_tuple(self.interpret(func, [42, 13]), 2)
assert res == (55, 57)
+
+ def test_copy(self):
+ def func(x, y):
+ d = {x: x+1, y: y+1}
+ d2 = d.copy()
+ d[x] = 0
+ d[y] = 0
+ tot1 = 0
+ tot2 = 0
+ for key, value in d2.iteritems():
+ tot1 += key
+ tot2 += value
+ return tot1, tot2
+ res = self.ll_to_tuple(self.interpret(func, [42, 13]), 2)
+ assert res == (55, 57)
+
+ def test_update(self):
+ def func():
+ dic = {1:1000, 2:200}
+ d2 = {2:30, 3:4}
+ dic.update(d2)
+ ok = len(dic) == 3
+ sum = ok
+ for key in dic:
+ sum += dic[key]
+ return sum
+ res = self.interpret(func, ())
+ assert res == 1035
+
+ def test_clear(self):
+ def func():
+ dic = {1: 2, 3:4}
+ dic.clear()
+ return len(dic)
+ assert self.interpret(func, ()) == 0
More information about the Pypy-commit
mailing list