[pypy-svn] r24183 - in pypy/dist/pypy/translator/squeak: . test
nik at codespeak.net
nik at codespeak.net
Thu Mar 9 17:38:15 CET 2006
Author: nik
Date: Thu Mar 9 17:38:14 2006
New Revision: 24183
Modified:
pypy/dist/pypy/translator/squeak/gensqueak.py
pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py
Log:
made a test for accessing instance variables pass.
Modified: pypy/dist/pypy/translator/squeak/gensqueak.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/gensqueak.py (original)
+++ pypy/dist/pypy/translator/squeak/gensqueak.py Thu Mar 9 17:38:14 2006
@@ -258,6 +258,8 @@
if op.opname == "oosend":
name = op.args[0].value
receiver = args[1]
+ if hasattr(self, "self") and op.args[1] == self.self:
+ receiver = "self"
# For now, send nil as the explicit self. XXX will probably have
# to do something more intelligent.
args = ["nil"] + args[2:]
@@ -267,8 +269,13 @@
receiver = args[0]
name = op.args[1].value
args = args[2:]
+ # XXX should only generate getter if field is set from outside
+ self.gen.schedule_node(
+ GetterNode(self.gen, op.args[0].concretetype, name))
elif op.opname == "oosetfield":
receiver = args[0]
+ if hasattr(self, "self") and op.args[0] == self.self:
+ receiver = "self"
name = op.args[1].value
args = args[2:]
# XXX should only generate setter if field is set from outside
@@ -364,6 +371,7 @@
yield self.render_fileout_header(
self.gen.nameof(self.INSTANCE), "methods")
graph = self.INSTANCE._methods[self.name].graph
+ self.self = graph.startblock.inputargs[0]
for line in self.render_body(graph.startblock):
yield line
@@ -385,17 +393,19 @@
for line in self.render_body(self.graph.startblock):
yield line
-class SetterNode(CodeNode):
+class AccessorNode(CodeNode):
def __init__(self, gen, INSTANCE, field_name):
self.gen = gen
self.INSTANCE = INSTANCE
self.field_name = field_name
- self.hash_key = (INSTANCE, field_name)
+ self.hash_key = (INSTANCE, field_name, self.__class__)
def dependencies(self):
return [ClassNode(self.gen, self.INSTANCE)]
+class SetterNode(AccessorNode):
+
def render(self):
yield self.render_fileout_header(
self.gen.nameof_Instance(self.INSTANCE), "accessors")
@@ -403,3 +413,12 @@
yield " %s := value" % self.field_name
yield "! !"
+class GetterNode(AccessorNode):
+
+ def render(self):
+ yield self.render_fileout_header(
+ self.gen.nameof_Instance(self.INSTANCE), "accessors")
+ yield self.field_name
+ yield " ^%s" % self.field_name
+ yield "! !"
+
Modified: pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py (original)
+++ pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py Thu Mar 9 17:38:14 2006
@@ -115,15 +115,6 @@
return A().m(i, j=3)
assert self.run_on_squeak(simplemethod, 1) == "6"
- def test_direct_call(self):
- def h(i):
- return g(i) + 1 # another call to g to try to trap GenSqueak
- def g(i):
- return i + 1
- def f(i):
- return h(i) + g(i)
- assert self.run_on_squeak(f, 1) == "5"
-
def test_nameclash_classes(self):
from pypy.translator.squeak.test.support import A as A2
class A:
@@ -160,6 +151,25 @@
return f(0) + f2(0)
assert self.run_on_squeak(g) == "3"
+ def test_direct_call(self):
+ def h(i):
+ return g(i) + 1 # another call to g to try to trap GenSqueak
+ def g(i):
+ return i + 1
+ def f(i):
+ return h(i) + g(i)
+ assert self.run_on_squeak(f, 1) == "5"
+
+ def test_getfield_setfield(self):
+ class A:
+ def m(self, i):
+ self.i = i
+ def f(i):
+ a = A()
+ a.m(i)
+ return a.i
+ assert self.run_on_squeak(f, 2) == "2"
+
class TestSelector:
More information about the Pypy-commit
mailing list