[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