[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