[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