[pypy-svn] r39827 - in pypy/dist/pypy/translator: cli cli/src cli/test oosupport

antocuni at codespeak.net antocuni at codespeak.net
Sat Mar 3 17:32:35 CET 2007


Author: antocuni
Date: Sat Mar  3 17:32:33 2007
New Revision: 39827

Modified:
   pypy/dist/pypy/translator/cli/cts.py
   pypy/dist/pypy/translator/cli/function.py
   pypy/dist/pypy/translator/cli/metavm.py
   pypy/dist/pypy/translator/cli/src/pypylib.cs
   pypy/dist/pypy/translator/cli/test/test_dict.py
   pypy/dist/pypy/translator/oosupport/metavm.py
Log:
make iteration over dict of voids working



Modified: pypy/dist/pypy/translator/cli/cts.py
==============================================================================
--- pypy/dist/pypy/translator/cli/cts.py	(original)
+++ pypy/dist/pypy/translator/cli/cts.py	Sat Mar  3 17:32:33 2007
@@ -28,7 +28,6 @@
 PYPY_DICT_OF_VOID = '[pypylib]pypy.runtime.DictOfVoid`2<%s, int32>'
 PYPY_DICT_VOID_VOID = '[pypylib]pypy.runtime.DictVoidVoid'
 PYPY_DICT_ITEMS_ITERATOR = '[pypylib]pypy.runtime.DictItemsIterator`2<%s, %s>'
-PYPY_DICT_VOID_ITEMS_ITERATOR = '[pypylib]pypy.runtime.DictOfVoidItemsIterator`1<%s>'
 PYPY_STRING_BUILDER = '[pypylib]pypy.runtime.StringBuilder'
 
 _lltype_to_cts = {
@@ -177,10 +176,9 @@
             key_type = self.lltype_to_cts(t._KEYTYPE)
             value_type = self.lltype_to_cts(t._VALUETYPE)
             if key_type == 'void':
-                assert False, 'iteration on dicts with void keys is not supported, yet'
+                key_type = 'int32' # placeholder
             if value_type == 'void':
                 value_type = 'int32' # placeholder
-
             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)
@@ -248,8 +246,13 @@
             else:
                 METH = oopspec.get_method(TYPE, name)                
             class_name = self.lltype_to_cts(TYPE)
-            ret_type = self.lltype_to_cts(METH.RESULT)
-            ret_type = dict_of_void_ll_copy_hack(TYPE, ret_type)
+            if isinstance(TYPE, ootype.Dict) and TYPE._KEYTYPE is ootype.Void and \
+                   TYPE._VALUETYPE is ootype.Void and name_or_desc == 'll_get_items_iterator':
+                # ugly, ugly special case
+                ret_type = 'class ' + PYPY_DICT_ITEMS_ITERATOR % ('int32', 'int32')
+            else:
+                ret_type = self.lltype_to_cts(METH.RESULT)
+                ret_type = dict_of_void_ll_copy_hack(TYPE, ret_type)
             generic_types = getattr(TYPE, '_generic_types', {})
             arg_types = [self.lltype_to_cts(arg) for arg in METH.ARGS if
                          arg is not ootype.Void and \

Modified: pypy/dist/pypy/translator/cli/function.py
==============================================================================
--- pypy/dist/pypy/translator/cli/function.py	(original)
+++ pypy/dist/pypy/translator/cli/function.py	Sat Mar  3 17:32:33 2007
@@ -259,6 +259,8 @@
 
     def load(self, v):
         if isinstance(v, flowmodel.Variable):
+            if v.concretetype is ootype.Void:
+                return # ignore it
             if v.name in self.argset:
                 selftype, selfname = self.args[0]
                 if self.is_method and v.name == selfname:

Modified: pypy/dist/pypy/translator/cli/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/cli/metavm.py	(original)
+++ pypy/dist/pypy/translator/cli/metavm.py	Sat Mar  3 17:32:33 2007
@@ -85,8 +85,10 @@
             # be a value on the stack, and we need to explicitly pop
             # it.
             if isinstance(this.concretetype, ootype.DictItemsIterator) and \
-               this.concretetype._VALUETYPE is ootype.Void and \
-               method_name == 'll_current_value':
+                   ((this.concretetype._VALUETYPE is ootype.Void and \
+                     method_name == 'll_current_value') or \
+                    (this.concretetype._KEYTYPE is ootype.Void and \
+                     method_name == 'll_current_key')):
                 generator.ilasm.pop()
 
     def _render_primitive_function(self, generator, callee, op):

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 Mar  3 17:32:33 2007
@@ -509,13 +509,11 @@
         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()
+        public DictItemsIterator<int, int> ll_get_items_iterator()
         {
-            return new DictVoidVoidItemsIterator();
+            List<KeyValuePair<int, int>> foo = new List<KeyValuePair<int, int>>();
+            return new DictItemsIterator<int, int>(foo.GetEnumerator());
         }
-        */
     }
 
     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 Mar  3 17:32:33 2007
@@ -11,8 +11,7 @@
 
 
 class TestCliEmptyDict(CliTest, oodict.BaseTestEmptyDict):
-    def test_iterate_over_empty_dict(self):
-        py.test.skip("Iteration over empty dict is not supported, yet")
+    pass
 
 class TestCliConstantDict(CliTest, oodict.BaseTestConstantDict):
     pass

Modified: pypy/dist/pypy/translator/oosupport/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/oosupport/metavm.py	(original)
+++ pypy/dist/pypy/translator/oosupport/metavm.py	Sat Mar  3 17:32:33 2007
@@ -356,6 +356,8 @@
             op.args[0].value._hints['_suggested_external']
             generator.ilasm.new(op.args[0].value._name.split('.')[-1])
         except (KeyError, AttributeError):
+            if op.args[0].value is ootype.Void:
+                return
             generator.new(op.args[0].value)
 
 class BranchUnconditionally(MicroInstruction):



More information about the Pypy-commit mailing list