[pypy-svn] r26251 - in pypy/dist/pypy/rpython: ootypesystem test
antocuni at codespeak.net
antocuni at codespeak.net
Mon Apr 24 11:56:27 CEST 2006
Author: antocuni
Date: Mon Apr 24 11:56:21 2006
New Revision: 26251
Modified:
pypy/dist/pypy/rpython/ootypesystem/rdict.py
pypy/dist/pypy/rpython/test/test_rdict.py
Log:
Added support for methods 'values' and 'items'
Modified: pypy/dist/pypy/rpython/ootypesystem/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rdict.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/rdict.py Mon Apr 24 11:56:21 2006
@@ -3,12 +3,15 @@
from pypy.objspace.flow.model import Constant
from pypy.rpython.rdict import AbstractDictRepr, rtype_newdict
from pypy.rpython.ootypesystem import ootype
+from pypy.rpython.ootypesystem.rlist import ll_newlist
from pypy.rpython.rarithmetic import r_uint
from pypy.rpython.objectmodel import hlinvoke
from pypy.rpython import robject
from pypy.rpython import objectmodel
from pypy.rpython import rmodel
+def dum_values(): pass
+def dum_items():pass
class DictRepr(AbstractDictRepr):
def __init__(self, rtyper, key_repr, value_repr, dictkey, dictvalue,
@@ -89,6 +92,26 @@
hop.exception_cannot_occur()
return self.send_message(hop, 'll_keys')
+ def rtype_method_values(self, hop):
+ return self._rtype_method_vi(hop, dum_values)
+
+ def rtype_method_items(self, hop):
+ return self._rtype_method_vi(hop, dum_items)
+
+ def _rtype_method_vi(self, hop, spec):
+ v_dict, = hop.inputargs(self)
+ r_list = hop.r_result
+ cLIST = hop.inputconst(ootype.Void, r_list.lowleveltype)
+ c_func = hop.inputconst(ootype.Void, spec)
+ c_dummy_default = hop.inputconst(self.value_repr.lowleveltype,
+ self.value_repr.ll_dummy_value)
+ return hop.gendirectcall(ll_dict_values_items, v_dict, cLIST, c_func, c_dummy_default)
+
+## def rtype_method_items(self, hop):
+## v_dict, = hop.inputargs(self)
+## return hop.gendirectcall(ll_dict_items, v_dict)
+
+
class __extend__(pairtype(DictRepr, rmodel.Repr)):
@@ -147,3 +170,22 @@
except KeyError:
d.ll_set(key, default)
return default
+
+def ll_dict_values_items(d, LIST, func, dummy_default):
+ keys = d.ll_keys()
+ length = keys.ll_length()
+ result = ll_newlist(LIST, length)
+ i = 0
+ while i < length:
+ key = keys.ll_getitem_fast(i)
+ value = d.ll_get(key, dummy_default) # dummy_default is never returned
+ if func is dum_items:
+ r = ootype.new(LIST._ITEMTYPE)
+ r.item0 = key # TODO: do we need casting?
+ r.item1 = value
+ result.ll_setitem_fast(i, r)
+ elif func is dum_values:
+ result.ll_setitem_fast(i, value)
+
+ i += 1
+ return result
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 Mon Apr 24 11:56:21 2006
@@ -729,6 +729,10 @@
def ll_to_list(self, l):
return l._list[:]
+ def ll_to_tuple(self, t, num):
+ lst = [getattr(t, 'item%d' % i) for i in range(num)]
+ return tuple(lst)
+
# these tests are similar to those above, but they don't use strings
def test_dict_creation(self):
def createdict(i):
@@ -799,3 +803,19 @@
return d.keys()
res = self.ll_to_list(self.interpret(func, [42, 13]))
assert res == [42, 13] or res == [13, 42]
+
+ def test_values(self):
+ def func(x, y):
+ d = {x: x+1, y: y+1}
+ return d.values()
+ res = self.ll_to_list(self.interpret(func, [42, 13]))
+ assert res == [43, 14] or res == [14, 43]
+
+ def test_items(self):
+ def func(x, y):
+ d = {x: x+1, y: y+1}
+ return d.items()
+ res = self.ll_to_list(self.interpret(func, [42, 13]))
+ res = [self.ll_to_tuple(item, 2) for item in res]
+ assert res == [(42, 43), (13, 14)] or res == [(13, 14), (42, 43)]
+
More information about the Pypy-commit
mailing list