[pypy-svn] r24220 - in pypy/dist/pypy/translator/squeak: . test

nik at codespeak.net nik at codespeak.net
Fri Mar 10 13:41:32 CET 2006


Author: nik
Date: Fri Mar 10 13:41:30 2006
New Revision: 24220

Modified:
   pypy/dist/pypy/translator/squeak/gensqueak.py
   pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py
Log:
slightly adapt a test to use instance variables with underscores. fix
stuff to make underscores go away in squeak code. a problem remains with
possible nameclashes.


Modified: pypy/dist/pypy/translator/squeak/gensqueak.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/gensqueak.py	(original)
+++ pypy/dist/pypy/translator/squeak/gensqueak.py	Fri Mar 10 13:41:30 2006
@@ -174,6 +174,12 @@
                 class_name, category,
                 datetime.datetime.now().strftime("%m/%d/%Y %H:%M"))
 
+    def unique_field(self, INSTANCE, field_name):
+        # XXX for now we ignore the issue of nameclashes between
+        # field names. It's not so simple because superclasses must
+        # be considered, too.
+        return camel_case(field_name)
+
 class ClassNode(CodeNode):
 
     def __init__(self, gen, INSTANCE):
@@ -191,8 +197,9 @@
         yield "%s subclass: #%s" % (
             self.gen.nameof_Instance(self.INSTANCE._superclass), 
             self.gen.nameof_Instance(self.INSTANCE))
-        yield "    instanceVariableNames: '%s'" % \
-            ' '.join(self.INSTANCE._fields.iterkeys())
+        fields = [self.unique_field(self.INSTANCE, f) for f in
+            self.INSTANCE._fields.iterkeys()]
+        yield "    instanceVariableNames: '%s'" % ' '.join(fields)
         yield "    classVariableNames: ''"
         yield "    poolDictionaries: ''"
         yield "    category: 'PyPy-Test'!"
@@ -283,30 +290,30 @@
         return self.assignment(op, receiver, message, args)
 
     def op_oogetfield(self, op):
+        INST = op.args[0].concretetype
         receiver = self.expr(op.args[0])
-        field_name = op.args[1].value
+        field_name = self.unique_field(INST, op.args[1].value)
         if hasattr(self, "self") and op.args[0] == self.self:
             # Private field access
             # Could also directly substitute op.result with name
             # everywhere for optimization.
-            return "%s := %s." % (self.expr(op.result), field_name) 
+            return "%s := %s." % (self.expr(op.result), camel_case(field_name))
         else:
             # Public field access
-            self.gen.schedule_node(GetterNode(
-                self.gen, op.args[0].concretetype, field_name))
+            self.gen.schedule_node(GetterNode(self.gen, INST, field_name))
             return self.assignment(op, receiver, field_name, [])
 
     def op_oosetfield(self, op):
         # Note that the result variable is never used
-        field_name = op.args[1].value
+        INST = op.args[0].concretetype
+        field_name = self.unique_field(INST, op.args[1].value)
         field_value = self.expr(op.args[2])
         if hasattr(self, "self") and op.args[0] == self.self:
             # Private field access
             return "%s := %s." % (field_name, field_value)
         else:
             # Public field access
-            self.gen.schedule_node(SetterNode(
-                self.gen, op.args[0].concretetype, field_name))
+            self.gen.schedule_node(SetterNode(self.gen, INST, field_name))
             receiver = self.expr(op.args[0])
             return "%s %s: %s." % (receiver, field_name, field_value)
 

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	Fri Mar 10 13:41:30 2006
@@ -163,16 +163,16 @@
     def test_getfield_setfield(self):
         class A:
             def set(self, i):
-                self.i = i
+                self.i_var = i
             def inc(self):
-                self.i = self.i + 1
+                self.i_var = self.i_var + 1
         def f(i):
             a = A()
             a.set(i)
-            i = a.i
-            a.i = 3
+            i = a.i_var
+            a.i_var = 3
             a.inc()
-            return i + a.i
+            return i + a.i_var
         assert self.run_on_squeak(f, 2) == "6"
 
     def dont_test_classvars(self):



More information about the Pypy-commit mailing list