[pypy-svn] r13893 - in pypy/dist/pypy: annotation rpython rpython/test
tismer at codespeak.net
tismer at codespeak.net
Sat Jun 25 19:39:38 CEST 2005
Author: tismer
Date: Sat Jun 25 19:39:36 2005
New Revision: 13893
Modified:
pypy/dist/pypy/annotation/unaryop.py
pypy/dist/pypy/rpython/rdict.py
pypy/dist/pypy/rpython/test/test_rdict.py
Log:
(arre + chris)
implemented strdict's get(), keys(), values(), items()
Modified: pypy/dist/pypy/annotation/unaryop.py
==============================================================================
--- pypy/dist/pypy/annotation/unaryop.py (original)
+++ pypy/dist/pypy/annotation/unaryop.py Sat Jun 25 19:39:36 2005
@@ -272,14 +272,15 @@
return dct.dictdef.read_key()
def method_get(dct, key, dfl):
- return unionof(dct.dictdef.read_value(), dfl)
+ dct.dictdef.generalize_key(key)
+ dct.dictdef.generalize_value(dfl)
+ return dct.dictdef.read_value()
def method_copy(dct):
return dct
def method_update(dct1, dct2):
- dct1.dictdef.generalize_key(dct2.dictdef.read_key())
- dct1.dictdef.generalize_value(dct2.dictdef.read_value())
+ dct1.dictdef.union(dct2.dictdef)
def method_keys(dct):
return getbookkeeper().newlist(dct.dictdef.read_key())
Modified: pypy/dist/pypy/rpython/rdict.py
==============================================================================
--- pypy/dist/pypy/rpython/rdict.py (original)
+++ pypy/dist/pypy/rpython/rdict.py Sat Jun 25 19:39:36 2005
@@ -3,7 +3,8 @@
from pypy.objspace.flow.model import Constant
from pypy.rpython import rmodel, lltype, rstr
from pypy.rpython.rstr import STR, string_repr
-from pypy.rpython.rarithmetic import r_uint
+from pypy.rpython.rarithmetic import r_uint
+from pypy.rpython import rlist
# ____________________________________________________________
#
@@ -97,19 +98,36 @@
self.value_repr)
return hop.gendirectcall(ll_get, v_dict, v_key, v_default)
-"""
- rdict: (easy) method_get (?)
- (easy) method_copy
- (easy) method_update (?)
- (easy) method_keys (?)
- (easy) method_values (?)
- (easy) method_items (?)
-"""
+ def rtype_method_copy(self, hop):
+ v_dict, = hop.inputargs(self)
+ return hop.gendirectcall(ll_copy, v_dict)
+
+ def rtype_method_update(self, hop):
+ v_dic1, v_dic2 = hop.inputargs(self, self)
+ return hop.gendirectcall(ll_update, v_dic1, v_dic2)
+
+ def rtype_method_keys(self, hop):
+ v_dic, = hop.inputargs(self)
+ r_list = hop.r_result
+ c1 = hop.inputconst(lltype.Void, r_list.lowleveltype)
+ return hop.gendirectcall(ll_keys, v_dic, c1)
+
+ def rtype_method_values(self, hop):
+ v_dic, = hop.inputargs(self)
+ r_list = hop.r_result
+ c1 = hop.inputconst(lltype.Void, r_list.lowleveltype)
+ return hop.gendirectcall(ll_values, v_dic, c1)
+
+ def rtype_method_items(self, hop):
+ v_dic, = hop.inputargs(self)
+ r_list = hop.r_result
+ c1 = hop.inputconst(lltype.Void, r_list.lowleveltype)
+ return hop.gendirectcall(ll_items, v_dic, c1)
class __extend__(pairtype(StrDictRepr, rmodel.StringRepr)):
def rtype_getitem((r_dict, r_string), hop):
- v_dict, v_key = hop.inputargs(r_dict, string_repr)
+ v_dict, v_key = hop.inputargs(r_dict, string_repr)
return hop.gendirectcall(ll_strdict_getitem, v_dict, v_key)
def rtype_delitem((r_dict, r_string), hop):
@@ -311,4 +329,75 @@
else:
return v_default
+def ll_copy(v_dict):
+ DICTPTR = lltype.typeOf(v_dict)
+ d = lltype.malloc(DICTPTR.TO)
+ d.entries = lltype.malloc(DICTPTR.TO.entries.TO, len(v_dict.entries))
+ d.num_items = v_dict.num_items
+ d.num_pristine_entries = v_dict.num_pristine_entries
+ i = 0
+ dictlen = len(d.entries)
+ while i < dictlen:
+ d_entry = d.entries[i]
+ v_entry = v_dict.entries[i]
+ d_entry.key = v_entry.key
+ d_entry.value = v_entry.value
+ i += 1
+ return d
+
+def ll_update(v_dic1, v_dic2):
+ d2len =len(v_dic2.entries)
+ entries = v_dic2.entries
+ i = 0
+ while i < d2len:
+ entry = entries[i]
+ if entry.key and entry.key != deleted_entry_marker:
+ ll_strdict_setitem(v_dic1, entry.key, entry.value)
+ i += 1
+
+def ll_keys(v_dic, LISTPTR):
+ res = rlist.ll_newlist(LISTPTR, v_dic.num_items)
+ dlen = len(v_dic.entries)
+ entries = v_dic.entries
+ i = 0
+ p = 0
+ while i < dlen:
+ key = entries[i].key
+ if key and key != deleted_entry_marker:
+ res.items[p] = key
+ p += 1
+ i += 1
+ return res
+def ll_values(v_dic, LISTPTR):
+ res = rlist.ll_newlist(LISTPTR, v_dic.num_items)
+ dlen = len(v_dic.entries)
+ entries = v_dic.entries
+ i = 0
+ p = 0
+ while i < dlen:
+ key = entries[i].key
+ value = entries[i].value
+ if key and key != deleted_entry_marker:
+ res.items[p] = value
+ p += 1
+ i += 1
+ return res
+
+def ll_items(v_dic, LISTPTR):
+ res = rlist.ll_newlist(LISTPTR, v_dic.num_items)
+ dlen = len(v_dic.entries)
+ entries = v_dic.entries
+ i = 0
+ p = 0
+ while i < dlen:
+ key = entries[i].key
+ value = entries[i].value
+ if key and key != deleted_entry_marker:
+ r = lltype.malloc(LISTPTR.TO.items.TO.OF.TO)
+ r.item0 = key
+ r.item1 = value
+ res.items[p] = r
+ p += 1
+ i += 1
+ return res
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 Jun 25 19:39:36 2005
@@ -163,8 +163,78 @@
def test_dict_get():
def func():
- # XXX shouldn't the get imply the type by its default?
- dic = {'blah': 1}
- return dic.get('hi', 42) * 10 + dic.get('blah', 2)
+ dic = {}
+ x1 = dic.get('hi', 42)
+ dic['blah'] = 1 # XXX this triggers type determination
+ x2 = dic.get('blah', 2)
+ return x1 * 10 + x2
res = interpret(func, ())
assert res == 421
+
+def test_dict_get_empty():
+ def func():
+ # this time without writing to the dict
+ dic = {}
+ x1 = dic.get('hi', 42)
+ x2 = dic.get('blah', 2)
+ return x1 * 10 + x2
+ res = interpret(func, ())
+ assert res == 422
+
+def test_dict_copy():
+ def func():
+ # XXX this does not work if we use chars, only!
+ dic = {'ab':1, 'b':2}
+ d2 = dic.copy()
+ ok = 1
+ for key in d2:
+ if dic[key] != d2[key]:
+ ok = 0
+ ok &= len(dic) == len(d2)
+ d2['c'] = 3
+ ok &= len(dic) == len(d2) - 1
+ return ok
+ res = interpret(func, ())
+ assert res == 1
+
+def test_dict_update():
+ def func():
+ dic = {'ab':1000, 'b':200}
+ d2 = {'b':30, 'cb':4}
+ dic.update(d2)
+ ok = len(dic) == 3
+ sum = ok
+ for key in dic:
+ sum += dic[key]
+ return sum
+ res = interpret(func, ())
+ assert res == 1035
+
+def test_dict_keys():
+ def func():
+ dic = {' 4':1000, ' 8':200}
+ keys = dic.keys()
+ return ord(keys[0][1]) + ord(keys[1][1]) - 2*ord('0') + len(keys)
+ res = interpret(func, ())
+ assert res == 14
+
+def test_dict_values():
+ def func():
+ dic = {' 4':1000, ' 8':200}
+ values = dic.values()
+ return values[0] + values[1] + len(values)
+ res = interpret(func, ())
+ assert res == 1202
+
+def test_dict_items():
+ def func():
+ dic = {' 4':1000, ' 8':200}
+ items = dic.items()
+ res = len(items)
+ for key, value in items:
+ res += ord(key[1]) - ord('0') + value
+ return res
+ res = interpret(func, ())
+ assert res == 1214
+
+
More information about the Pypy-commit
mailing list