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

nik at codespeak.net nik at codespeak.net
Fri Mar 17 14:27:13 CET 2006


Author: nik
Date: Fri Mar 17 14:27:01 2006
New Revision: 24517

Modified:
   pypy/dist/pypy/translator/squeak/codeformatter.py
   pypy/dist/pypy/translator/squeak/gensqueak.py
   pypy/dist/pypy/translator/squeak/node.py
   pypy/dist/pypy/translator/squeak/opformatter.py
   pypy/dist/pypy/translator/squeak/test/runtest.py
   pypy/dist/pypy/translator/squeak/test/test_llops.py
Log:
added implementation and test for bool_not llop. stumbled over the
camel_case mess and cleaned that up, camel_case is now defined in and
exclusively called from gensqueak.py. also, check uniqueness of
variable names as well, since there can be collisions, e.g. between
v19 and v1_9 (this one actually happened!).


Modified: pypy/dist/pypy/translator/squeak/codeformatter.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/codeformatter.py	(original)
+++ pypy/dist/pypy/translator/squeak/codeformatter.py	Fri Mar 17 14:27:01 2006
@@ -1,11 +1,6 @@
 from pypy.objspace.flow.model import Constant, Variable
 from pypy.rpython.ootypesystem import ootype 
 
-def camel_case(identifier):
-    identifier = identifier.replace(".", "_")
-    words = identifier.split('_')
-    return ''.join([words[0]] + [w.capitalize() for w in words[1:]])
-
 class AbstractCode:
 
     pass
@@ -13,7 +8,7 @@
 class Message(AbstractCode):
 
     def __init__(self, name):
-        self.name = camel_case(name) # XXX Should not use camel_case here
+        self.name = name
         self.infix = False
         if len(name) <= 2 and not name.isalnum():
             # Binary infix selector, e.g. "+"
@@ -82,7 +77,7 @@
     def format_arg(self, arg):
         """Formats Variables and Constants."""
         if isinstance(arg, Variable):
-            return camel_case(arg.name)
+            return self.gen.unique_var_name(arg)
         elif isinstance(arg, Constant):
             if isinstance(arg.concretetype, ootype.Instance):
                 # XXX fix this

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 17 14:27:01 2006
@@ -1,5 +1,4 @@
 from pypy.translator.gensupp import NameManager
-from pypy.translator.squeak.codeformatter import camel_case
 from pypy.translator.squeak.node import FunctionNode, ClassNode, SetupNode
 from pypy.translator.squeak.node import MethodNode, SetterNode, GetterNode
 try:
@@ -91,6 +90,9 @@
         return self.unique_name(
                 (INSTANCE, "field", field_name), field_name)
 
+    def unique_var_name(self, variable):
+        return self.unique_name(variable, variable.name)
+
     def unique_name(self, key, basename):
         # XXX should account for squeak keywords here
         if self.unique_name_mapping.has_key(key):
@@ -101,3 +103,9 @@
             self.unique_name_mapping[key] = unique
         return unique
 
+
+def camel_case(identifier):
+    identifier = identifier.replace(".", "_")
+    words = identifier.split('_')
+    return ''.join([words[0]] + [w.capitalize() for w in words[1:]])
+

Modified: pypy/dist/pypy/translator/squeak/node.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/node.py	(original)
+++ pypy/dist/pypy/translator/squeak/node.py	Fri Mar 17 14:27:01 2006
@@ -1,7 +1,7 @@
 import datetime
 from pypy.objspace.flow.model import Constant, Variable
 from pypy.translator.squeak.opformatter import OpFormatter
-from pypy.translator.squeak.codeformatter import CodeFormatter, Message, camel_case
+from pypy.translator.squeak.codeformatter import CodeFormatter, Message
 from pypy.translator.squeak.codeformatter import Field, Assignment, CustomVariable
 from pypy.rpython.ootypesystem.ootype import Instance, ROOT
 
@@ -269,7 +269,7 @@
                 codef.format(self.INSTANCE), "initializers")
         fields = self.INSTANCE._allfields()
         args = [CustomVariable("a%s" % i) for i in range(len(fields))]
-        message = Message("field_init").with_args(args)
+        message = Message("fieldInit").with_args(args)
         yield codef.format(message)
         for field_name, arg in zip(fields.keys(), args):
             unique_field = self.gen.unique_field_name(self.INSTANCE, field_name)
@@ -306,7 +306,7 @@
             field_names = INST._allfields().keys()
             field_values = [getattr(const.value, f) for f in field_names]
             new = Message("new").send_to(INST, [])
-            init_message = Message("field_init").send_to(new, field_values)
+            init_message = Message("fieldInit").send_to(new, field_values)
             yield "    Constants at: '%s' put: %s." \
                     % (const_id, codef.format(init_message))
         yield "! !"

Modified: pypy/dist/pypy/translator/squeak/opformatter.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/opformatter.py	(original)
+++ pypy/dist/pypy/translator/squeak/opformatter.py	Fri Mar 17 14:27:01 2006
@@ -30,6 +30,7 @@
         'runtimenew':  'new',
         'classof':     'class',
         'same_as':     'yourself', 
+        'bool_not':    'not',
     }
 
     number_ops = {
@@ -80,7 +81,10 @@
         if op_method is not None:
             return op_method(op)
         else:
-            name = self.ops.get(op.opname, op.opname)
+            if not self.ops.has_key(op.opname):
+                raise NotImplementedError(
+                        "operation not supported: %s" % op.opname)
+            name = self.ops[op.opname]
             sent = Message(name).send_to(op.args[0], op.args[1:])
             return self.codef.format(sent.assign_to(op.result))
 

Modified: pypy/dist/pypy/translator/squeak/test/runtest.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/test/runtest.py	(original)
+++ pypy/dist/pypy/translator/squeak/test/runtest.py	Fri Mar 17 14:27:01 2006
@@ -1,7 +1,7 @@
 import os
 import py
 from pypy.tool.udir import udir
-from pypy.translator.squeak.gensqueak import GenSqueak
+from pypy.translator.squeak.gensqueak import GenSqueak, camel_case
 from pypy.translator.translator import TranslationContext
 from pypy import conftest
 
@@ -67,7 +67,7 @@
         return startup_st
 
     def _symbol(self, arg_count):
-        name = self._func.__name__
+        name = camel_case(self._func.__name__)
         if arg_count == 0:
             return name
         else:

Modified: pypy/dist/pypy/translator/squeak/test/test_llops.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/test/test_llops.py	(original)
+++ pypy/dist/pypy/translator/squeak/test/test_llops.py	Fri Mar 17 14:27:01 2006
@@ -17,10 +17,12 @@
         return llop.%s(%s, %s)""" \
                 % (arg_signature, llopname, RESTYPE._name,
                    arg_signature)
+    llfunctest(lloptest, args)
 
+def llfunctest(llfunc, args):
     annotation = [type(a) for a in args]
-    sqfunc = compile_function(lloptest, annotation)
-    expected_res = interpret(lloptest, args, policy=LowLevelAnnotatorPolicy())
+    sqfunc = compile_function(llfunc, annotation)
+    expected_res = interpret(llfunc, args, policy=LowLevelAnnotatorPolicy())
     res = sqfunc(*args)
     assert res == str(expected_res).lower() # lowercasing for booleans
 
@@ -112,3 +114,12 @@
     for t in tests:
         yield optest, t
 
+def test_booloperations():
+    def bool_not(i):
+        if i == 1:
+            j = True
+        else:
+            j = False
+        return llop.bool_not(Bool, j)
+    llfunctest(bool_not, (1,))
+



More information about the Pypy-commit mailing list