[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