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

nik at codespeak.net nik at codespeak.net
Fri Mar 17 15:03:03 CET 2006


Author: nik
Date: Fri Mar 17 15:03:02 2006
New Revision: 24521

Modified:
   pypy/dist/pypy/translator/squeak/opformatter.py
   pypy/dist/pypy/translator/squeak/test/test_llops.py
Log:
implement all char and unichar operations for gensqueak.


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 15:03:02 2006
@@ -61,7 +61,8 @@
         # XXX need to support x_ovf ops
     }
     
-    number_opprefixes = "int", "uint", "llong", "ullong", "float"
+    number_opprefixes = "int", "uint", "llong", "ullong",\
+            "float", "char", "unichar"
 
     wrapping_ops = "neg", "invert", "add", "sub", "mul", "lshift"
 
@@ -79,7 +80,7 @@
                     op, opname_parts[0], "_".join(opname_parts[1:]))
         op_method = getattr(self, "op_%s" % op.opname, None)
         if op_method is not None:
-            return op_method(op)
+            return self.codef.format(op_method(op))
         else:
             if not self.ops.has_key(op.opname):
                 raise NotImplementedError(
@@ -110,7 +111,7 @@
         else:
             receiver = op.args[1]
         sent_message = Message(message_name).send_to(receiver, op.args[2:])
-        return  self.codef.format(sent_message.assign_to(op.result))
+        return sent_message.assign_to(op.result)
 
     def op_oogetfield(self, op):
         INST = op.args[0].concretetype
@@ -123,7 +124,7 @@
         else:
             # Public field access
             rvalue = Message(field_name).send_to(op.args[0], [])
-        return self.codef.format(Assignment(op.result, rvalue))
+        return Assignment(op.result, rvalue)
 
     def op_oosetfield(self, op):
         # Note that the result variable is never used
@@ -132,19 +133,24 @@
         field_value = op.args[2]
         if op.args[0] == self.node.self:
             # Private field access
-            return self.codef.format(Assignment(Field(field_name), field_value))
+            return Assignment(Field(field_name), field_value)
         else:
             # Public field access
-            setter = Message(field_name).send_to(op.args[0], [field_value])
-            return self.codef.format(setter)
+            return Message(field_name).send_to(op.args[0], [field_value])
 
     def op_oodowncast(self, op):
-        return self.codef.format(Assignment(op.result, op.args[0]))
+        return Assignment(op.result, op.args[0])
 
     def op_direct_call(self, op):
         # XXX how do i get rid of this import?
         from pypy.translator.squeak.node import FunctionNode
         function_name = self.gen.unique_func_name(op.args[0].value.graph)
         msg = Message(function_name).send_to(FunctionNode.FUNCTIONS, op.args[1:])
-        return self.codef.format(msg.assign_to(op.result))
+        return msg.assign_to(op.result)
+
+    def op_cast_int_to_char(self, op):
+        # XXX incomplete
+        return Assignment(op.result, op.args[0])
+
+    op_cast_int_to_unichar = op_cast_int_to_char
 

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 15:03:02 2006
@@ -3,7 +3,7 @@
 from pypy.rpython.rarithmetic import r_uint, r_longlong, r_ulonglong
 from pypy.rpython.annlowlevel import LowLevelAnnotatorPolicy
 from pypy.rpython.lltypesystem.lloperation import llop
-from pypy.rpython.lltypesystem.lltype import Signed, Unsigned, Bool
+from pypy.rpython.lltypesystem.lltype import Signed, Unsigned, Bool, Char, UniChar
 from pypy.rpython.lltypesystem.lltype import SignedLongLong, UnsignedLongLong
 from pypy.rpython.test.test_llinterp import interpret
 
@@ -123,3 +123,19 @@
         return llop.bool_not(Bool, j)
     llfunctest(bool_not, (1,))
 
+def test_charoperations():
+    for llopname in "eq", "ne", "lt", "gt", "le", "ge":
+        exec """def lloptest(i1, i2):
+            char1 = llop.cast_int_to_char(Char, i1)
+            char2 = llop.cast_int_to_char(Char, i2)
+            return llop.char_%s(Bool, char1, char2)""" % llopname
+        yield llfunctest, lloptest, (1, 2)
+
+def test_unicharoperations():
+    for llopname in "eq", "ne":
+        exec """def lloptest(i1, i2):
+            char1 = llop.cast_int_to_unichar(UniChar, i1)
+            char2 = llop.cast_int_to_unichar(UniChar, i2)
+            return llop.unichar_%s(Bool, char1, char2)""" % llopname
+        yield llfunctest, lloptest, (1, 2)
+



More information about the Pypy-commit mailing list