[pypy-svn] r29846 - in pypy/dist/pypy/translator/cli: . src test

antocuni at codespeak.net antocuni at codespeak.net
Sat Jul 8 17:34:27 CEST 2006


Author: antocuni
Date: Sat Jul  8 17:34:24 2006
New Revision: 29846

Modified:
   pypy/dist/pypy/translator/cli/cts.py
   pypy/dist/pypy/translator/cli/database.py
   pypy/dist/pypy/translator/cli/src/pypylib.cs
   pypy/dist/pypy/translator/cli/test/test_dict.py
Log:
Added support for empty dicts.



Modified: pypy/dist/pypy/translator/cli/cts.py
==============================================================================
--- pypy/dist/pypy/translator/cli/cts.py	(original)
+++ pypy/dist/pypy/translator/cli/cts.py	Sat Jul  8 17:34:24 2006
@@ -18,6 +18,7 @@
 PYPY_LIST_OF_VOID = '[pypylib]pypy.runtime.ListOfVoid'
 PYPY_DICT = '[pypylib]pypy.runtime.Dict`2<%s, %s>'
 PYPY_DICT_OF_VOID = '[pypylib]pypy.runtime.DictOfVoid`1<%s>'
+PYPY_DICT_VOID_VOID = '[pypylib]pypy.runtime.DictVoidVoid'
 PYPY_DICT_ITEMS_ITERATOR = '[pypylib]pypy.runtime.DictItemsIterator`2<%s, %s>'
 PYPY_STRING_BUILDER = '[pypylib]pypy.runtime.StringBuilder'
 
@@ -101,12 +102,17 @@
         elif isinstance(t, ootype.Dict):
             key_type = self.lltype_to_cts(t._KEYTYPE)
             value_type = self.lltype_to_cts(t._VALUETYPE)
-            if value_type == 'void': # special case: Dict of Void
-                return self.__class(PYPY_DICT_OF_VOID % key_type, include_class)
+            if value_type == 'void': # special cases: Dict with voids
+                if key_type == 'void':
+                    return self.__class(PYPY_DICT_VOID_VOID, include_class)
+                else:
+                    return self.__class(PYPY_DICT_OF_VOID % key_type, include_class)
             return self.__class(PYPY_DICT % (key_type, value_type), include_class)
         elif isinstance(t, ootype.DictItemsIterator):
             key_type = self.lltype_to_cts(t._KEYTYPE)
             value_type = self.lltype_to_cts(t._VALUETYPE)
+            if value_type == 'void' or key_type == 'void':
+                assert False, 'iteration on dicts of voids is not supported, yet'
             return self.__class(PYPY_DICT_ITEMS_ITERATOR % (key_type, value_type), include_class)
 
         return _get_from_dict(_lltype_to_cts, t, 'Unknown type %s' % t)

Modified: pypy/dist/pypy/translator/cli/database.py
==============================================================================
--- pypy/dist/pypy/translator/cli/database.py	(original)
+++ pypy/dist/pypy/translator/cli/database.py	Sat Jul  8 17:34:24 2006
@@ -419,7 +419,9 @@
         valuetype_T = self.cts.lltype_to_cts(self.value._TYPE.VALUETYPE_T)
 
         if KEYTYPE is ootype.Void:
-            assert False, "gencli doesn't support dict with void keys"
+            assert VALUETYPE is ootype.Void
+            ilasm.opcode('pop')
+            return
 
         # special case: dict of void, ignore the values
         if VALUETYPE is ootype.Void:

Modified: pypy/dist/pypy/translator/cli/src/pypylib.cs
==============================================================================
--- pypy/dist/pypy/translator/cli/src/pypylib.cs	(original)
+++ pypy/dist/pypy/translator/cli/src/pypylib.cs	Sat Jul  8 17:34:24 2006
@@ -360,6 +360,23 @@
         */
     }
 
+    public class DictVoidVoid
+    {
+        public int ll_length() { return 0; }
+        public void ll_get() { }
+        public void ll_set() { }
+        public bool ll_remove() { return false; } // should it be true?
+        public bool ll_contains() { return false; }
+        public void ll_clear() { }
+
+        //XXX ll_get_items_iterator is not supported, yet
+        /*
+        public DictVoidVoidItemsIterator ll_get_items_iterator()
+        {
+            return new DictVoidVoidItemsIterator();
+        }
+        */
+    }
 
     public class DictItemsIterator<TKey, TValue>
     {

Modified: pypy/dist/pypy/translator/cli/test/test_dict.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/test_dict.py	(original)
+++ pypy/dist/pypy/translator/cli/test/test_dict.py	Sat Jul  8 17:34:24 2006
@@ -1,6 +1,7 @@
 import py
 from pypy.translator.cli.test.runtest import CliTest
 from pypy.rpython.test.test_rdict import BaseTestRdict
+from pypy.rpython.test.test_remptydict import BaseTestRemptydict
 
 class TestCliDict(CliTest, BaseTestRdict):
     def test_dict_of_void(self):
@@ -13,3 +14,8 @@
 
     def test_dict_of_dict(self):
         py.test.skip("CLI doesn't support recursive dicts")
+
+
+class TestCliEmptyDict(CliTest, BaseTestRemptydict):
+    def test_iterate_over_empty_dict(self):
+        py.test.skip("Iteration over empty dict is not supported, yet")



More information about the Pypy-commit mailing list