[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