[pypy-svn] r65510 - in pypy/branch/io-lang/pypy/lang/io: . test

david at codespeak.net david at codespeak.net
Sat May 30 17:14:44 CEST 2009


Author: david
Date: Sat May 30 17:14:42 2009
New Revision: 65510

Modified:
   pypy/branch/io-lang/pypy/lang/io/map.py
   pypy/branch/io-lang/pypy/lang/io/model.py
   pypy/branch/io-lang/pypy/lang/io/test/test_map.py
Log:
Implemented Builtin Map CFunction methods

Modified: pypy/branch/io-lang/pypy/lang/io/map.py
==============================================================================
--- pypy/branch/io-lang/pypy/lang/io/map.py	(original)
+++ pypy/branch/io-lang/pypy/lang/io/map.py	Sat May 30 17:14:42 2009
@@ -1,5 +1,6 @@
 from pypy.lang.io.register import register_method
-from pypy.lang.io.model import W_ImmutableSequence
+from pypy.lang.io.model import W_ImmutableSequence, W_Number, W_List
+
 @register_method('Map', 'atPut', unwrap_spec=[object, object, object])
 def map_at_put(space, w_target, w_key, w_value):
     assert isinstance(w_key, W_ImmutableSequence)
@@ -9,4 +10,57 @@
 @register_method('Map', 'at', unwrap_spec=[object, object])
 def map_at(space, w_target, w_key):
     assert isinstance(w_key, W_ImmutableSequence)
-    return w_target.at(w_key)
\ No newline at end of file
+    return w_target.at(w_key)
+    
+ at register_method('Map', 'empty')
+def map_empty(space, w_target, w_message, w_context):
+    w_target.empty()
+    return w_target
+    
+ at register_method('Map', 'atIfAbsentPut', unwrap_spec=[object, object, object])
+def map_at_if_absent_put(space, w_target, w_key, w_value):
+    assert isinstance(w_key, W_ImmutableSequence)
+    if w_target.has_key(w_key):
+        return w_target.at(w_key)
+    w_target.at_put(w_key, w_value)
+    return w_value
+        
+ at register_method('Map', 'hasKey', unwrap_spec=[object, object])
+def map_has_key(space, w_target, w_key):
+    assert isinstance(w_key, W_ImmutableSequence)
+    if w_target.has_key(w_key):
+        return space.w_true
+    return space.w_false
+    
+ at register_method('Map', 'size')
+def map_size(space, w_target, w_message, w_context):
+    return W_Number(space, w_target.size())
+    
+ at register_method('Map', 'removeAt', unwrap_spec=[object, object])
+def map_has_key(space, w_target, w_key):
+    assert isinstance(w_key, W_ImmutableSequence)
+    w_target.remove_at(w_key)
+    return w_target
+
+ at register_method('Map', 'hasValue', unwrap_spec=[object, object])
+def map_has_value(space, w_target, w_value):
+    if w_target.has_value(w_value):
+        return space.w_true
+    return space.w_false
+
+ at register_method('Map', 'values')
+def map_values(space, w_target, w_message, w_context):
+    return space.w_list.clone_and_init(space, w_target.values())
+
+ at register_method('Map', 'foreach')
+def map_foreach(space, w_target, w_message, w_context):
+    argcount = len(w_message.arguments)
+    assert argcount == 3
+    key = w_message.arguments[0].name
+    value = w_message.arguments[1].name
+    
+    return w_target.foreach(space, key, value, w_message.arguments[2], w_context)
+    
+ at register_method('Map', 'keys')
+def map_keys(space, w_target, w_message, w_context):
+    return space.w_list.clone_and_init(space, w_target.keys())
\ No newline at end of file

Modified: pypy/branch/io-lang/pypy/lang/io/model.py
==============================================================================
--- pypy/branch/io-lang/pypy/lang/io/model.py	(original)
+++ pypy/branch/io-lang/pypy/lang/io/model.py	Sat May 30 17:14:42 2009
@@ -112,6 +112,40 @@
     def at_put(self, w_key, w_value):
         self.items[w_key.hash()] = MapEntry(w_key, w_value)
         
+    def empty(self):
+        self.items.clear()
+    
+    def has_key(self, w_key):
+        return w_key.hash() in self.items
+        
+    def size(self):
+        return len(self.items)
+    
+    def remove_at(self, w_key):
+        try:
+            del(self.items[w_key.hash()])
+        except Exception, e:
+            pass
+            
+    def has_value(self, w_value):
+        for x in self.items.values():
+            if x.value == x:
+                return True
+        return False
+        
+    def values(self):
+        return [x.value for x in self.items.values()]
+        
+    def foreach(self, space, key_name, value_name, w_body, w_context):
+        for item in self.items.values():
+            w_context.slots[key_name] = item.key
+            w_context.slots[value_name] = item.value
+            t = w_body.eval(space, w_context, w_context)
+        return t 
+        
+    def keys(self):
+        return [x.key for x in self.items.values()]
+        
 class MapEntry(object):
     def __init__(self, w_key, w_value):
         self.key = w_key

Modified: pypy/branch/io-lang/pypy/lang/io/test/test_map.py
==============================================================================
--- pypy/branch/io-lang/pypy/lang/io/test/test_map.py	(original)
+++ pypy/branch/io-lang/pypy/lang/io/test/test_map.py	Sat May 30 17:14:42 2009
@@ -1,5 +1,5 @@
 from pypy.lang.io.parserhack import parse, interpret
-from pypy.lang.io.model import W_Map, W_Number, W_ImmutableSequence
+from pypy.lang.io.model import W_Map, W_Number, W_ImmutableSequence, W_List
 import py.test
 
 def test_map_proto():
@@ -31,4 +31,88 @@
 def test_key_hashing():
     inp = 'Map clone atPut("1", "bar") atPut("nil", "ipsum") atPut("foo", 123) at("nil")'
     res, space = interpret(inp)
-    assert res.value == 'ipsum'
\ No newline at end of file
+    assert res.value == 'ipsum'
+    
+def test_empty():
+    inp = 'Map clone atPut("1", "bar") atPut("nil", "ipsum") atPut("foo", 123) empty'
+    res, space = interpret(inp)
+    assert res.items == {}
+    
+def test_atIfAbsentPut():
+    inp = 'Map clone atPut("1", nil) atIfAbsentPut("1", "lorem")'
+    res, space = interpret(inp)
+    assert res == space.w_nil
+    
+    inp = 'Map clone atPut("2", "bar") atIfAbsentPut("1", "lorem")'
+    res, space = interpret(inp)
+    assert res.value == 'lorem'
+    
+def test_has_key():
+    inp = 'Map clone atPut("1", nil) atPut("2", "lorem") hasKey("1")'
+    res, space = interpret(inp)
+    assert res == space.w_true
+    
+    inp = 'Map clone atPut("1", nil) atPut("2", "lorem") hasKey("99")'
+    res, space = interpret(inp)
+    assert res == space.w_false
+    
+def test_size():
+    inp = 'Map clone size'
+    res, space = interpret(inp)
+    assert res.value == 0
+    
+    inp = 'Map clone atPut("1", nil) atPut("2", "lorem") size'
+    res, space = interpret(inp)
+    assert res.value == 2
+    
+def test_remve_at():
+    inp = 'Map clone atPut("1", "nil") atPut("2", "lorem") atPut("3", 3) atPut("4", 234) removeAt("2")'
+    res, space = interpret(inp)
+    keys = [(entry.key.value) for entry in res.items.values()]
+    assert keys == ['1', '3', '4']
+    values = [(entry.value.value) for entry in res.items.values()]
+    assert values == ['nil', 3, 234]
+    
+def test_has_value():
+    inp = 'Map clone atPut("1", "nil") atPut("2", "lorem") atPut("3", 3) atPut("4", 234) hasValue("234")'
+    res, space = interpret(inp)
+    assert res == space.w_true
+    
+    inp = 'Map clone atPut("1", "nil") atPut("2", "lorem") atPut("3", 3) atPut("4", 234) hasValue("1234567890")'
+    res, space = interpret(inp)
+    assert res == space.w_false
+    
+def test_values():
+    inp = 'Map clone atPut("1", 12345) atPut("2", 99) atPut("3", 3) atPut("4", 234) values'
+    res, space = interpret(inp)
+    assert isinstance(res, W_List)
+    values = [x.value for x in res.items]
+    should = [12345, 99, 3, 234]
+    assert len(should) == len(values)
+    for x in values:
+        assert x in should
+
+def test_foreach():
+    inp = """b := Map clone do(
+        atPut("1", 12345) 
+        atPut("2", 99) 
+        atPut("3", 3) 
+        atPut("4", 234)
+    )
+    c := list()
+    b foreach(key, value, c append(list(key, value))); c"""
+    res,space = interpret(inp)
+    value = sorted([(x.items[0].value, x.items[1].value) for x in res.items])
+    assert value == [('1', 12345), ('2', 99), ('3', 3), ('4', 234)]
+    
+def test_keys():
+    inp = """b := Map clone do(
+        atPut("1", 12345) 
+        atPut("2", 99) 
+        atPut("3", 3) 
+        atPut("4", 234)
+    )
+    b keys"""
+    res, space = interpret(inp)
+    keys = sorted([x.value for x in res.items])
+    assert keys == ['1', '2', '3', '4']
\ No newline at end of file



More information about the Pypy-commit mailing list