[pypy-commit] lang-io default: implemented special version of updateSlot for Locals objects
bivab
noreply at buildbot.pypy.org
Thu Sep 22 18:01:22 CEST 2011
Author: David Schneider <david.schneider at picle.org>
Branch:
Changeset: r44:666653c3a8e7
Date: 2011-09-22 15:04 +0200
http://bitbucket.org/pypy/lang-io/changeset/666653c3a8e7/
Log: implemented special version of updateSlot for Locals objects
diff --git a/io/locals.py b/io/locals.py
new file mode 100644
--- /dev/null
+++ b/io/locals.py
@@ -0,0 +1,14 @@
+from io.register import register_method
+
+ at register_method('Locals', 'updateSlot')
+def locals_update_slot(space, w_target, w_message, w_context):
+ slotname = w_message.arguments[0].eval(space, w_target, w_context).value
+ assert w_target.lookup(slotname) is not None
+
+ if slotname in w_target.slots:
+ w_value = w_message.arguments[1].eval(space, w_target, w_context)
+ w_target.slots[slotname] = w_value
+ return w_value
+ else:
+ w_self = w_target.lookup('self')
+ return w_message.eval(space, w_self, w_context)
diff --git a/io/model.py b/io/model.py
--- a/io/model.py
+++ b/io/model.py
@@ -47,7 +47,7 @@
def __repr__(self):
"""NOT RPYTHON"""
- return "<W_Object slots=%s>" % (self.slots.keys(),)
+ return "<%s slots=%s>" % (self.__class__.__name__, self.slots.keys(),)
class W_Number(W_Object):
"""Number"""
@@ -297,10 +297,10 @@
w_locals.slots[args[i]] = space.w_nil
if self.activateable:
- w_locals.protos = [w_receiver]
+ w_locals.protos.append(w_receiver)
w_locals.slots['self'] = w_receiver
else:
- w_locals.protos = [w_context]
+ w_locals.protos.append(w_context)
w_locals.slots['self'] = w_context
w_locals.slots['call'] = w_call
diff --git a/io/objspace.py b/io/objspace.py
--- a/io/objspace.py
+++ b/io/objspace.py
@@ -13,6 +13,7 @@
import io.coroutine
import io.sequence
import io.compiler
+import io.locals
class ObjSpace(object):
"""docstring for ObjSpace"""
@@ -79,6 +80,8 @@
self.init_w_compiler()
+ self.init_w_locals()
+
def init_w_map(self):
for key, function in cfunction_definitions['Map'].items():
self.w_map.slots[key] = W_CFunction(self, function)
@@ -99,6 +102,10 @@
for key, function in cfunction_definitions['List'].items():
self.w_list.slots[key] = W_CFunction(self, function)
+ def init_w_locals(self):
+ for key, function in cfunction_definitions['Locals'].items():
+ self.w_locals.slots[key] = W_CFunction(self, function)
+
def init_w_core(self):
self.w_core.protos.append(self.w_object)
self.w_core.slots['Locals'] = self.w_locals
diff --git a/io/test/test_locals.py b/io/test/test_locals.py
new file mode 100644
--- /dev/null
+++ b/io/test/test_locals.py
@@ -0,0 +1,22 @@
+from io.interpreter import parse, interpret
+
+def test_updateSlot_in_self():
+ inp = """a := Object clone
+ a foo := 5
+ a bar := method(foo = 10)
+ a bar
+ a foo
+ """
+ res, space = interpret(inp)
+ assert res.number_value == 10
+ assert space.w_lobby.slots['a'].slots['foo'].number_value == 10
+
+def test_updateSlot_in_locals():
+ inp = """a := Object clone
+ a foo := 5
+ a bar := method(foo := foo; foo = 10)
+ a bar
+ """
+ res, space = interpret(inp)
+ assert res.number_value == 10
+ assert space.w_lobby.slots['a'].slots['foo'].number_value == 5
More information about the pypy-commit
mailing list