[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