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

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


Author: nik
Date: Fri Mar 17 17:27:48 2006
New Revision: 24524

Modified:
   pypy/dist/pypy/translator/squeak/codeformatter.py
   pypy/dist/pypy/translator/squeak/opformatter.py
   pypy/dist/pypy/translator/squeak/test/test_llops.py
Log:
support some casts from bool and and chars in gensqueak.


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 17:27:48 2006
@@ -85,6 +85,9 @@
                         arg, "const_%s" % self.format_Instance(arg.value._TYPE))
                 self.gen.constant_insts[arg] = const_id
                 return "(PyConstants getConstant: '%s')" % const_id
+            elif arg.concretetype == ootype.Char or arg.concretetype == ootype.UniChar:
+                # XXX temporary
+                return str(ord(arg.value))
             else:
                 return self.name_constant(arg.value)
         else:

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 17:27:48 2006
@@ -60,7 +60,7 @@
         'xor':       'bitXor',
         # XXX need to support x_ovf ops
     }
-    
+
     number_opprefixes = "int", "uint", "llong", "ullong",\
             "float", "char", "unichar"
 
@@ -138,9 +138,11 @@
             # Public field access
             return Message(field_name).send_to(op.args[0], [field_value])
 
-    def op_oodowncast(self, op):
+    def noop(self, op):
         return Assignment(op.result, op.args[0])
 
+    op_oodowncast = noop
+
     def op_direct_call(self, op):
         # XXX how do i get rid of this import?
         from pypy.translator.squeak.node import FunctionNode
@@ -148,6 +150,15 @@
         msg = Message(function_name).send_to(FunctionNode.FUNCTIONS, op.args[1:])
         return msg.assign_to(op.result)
 
+    def op_cast_bool_to_int(self, op):
+        msg = Message("ifTrue: [1] ifFalse: [0]")
+        return msg.send_to(op.args[0], []).assign_to(op.result)
+
+    op_cast_bool_to_uint = op_cast_bool_to_int
+
+    op_cast_char_to_int = noop
+    op_cast_unichar_to_int = noop
+
     def op_cast_int_to_char(self, op):
         # XXX incomplete
         return Assignment(op.result, op.args[0])

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 17:27:48 2006
@@ -139,3 +139,25 @@
             return llop.unichar_%s(Bool, char1, char2)""" % llopname
         yield llfunctest, lloptest, (1, 2)
 
+def test_cast_bool():
+    tests = ("int", Signed), ("uint", Unsigned) # XXX missing float
+    for target_name, target_type in tests: 
+        exec """def lloptest(i):
+            b = llop.int_is_true(Bool, i)
+            return llop.cast_bool_to_%s(%s, b)""" \
+                    % (target_name, target_type._name)
+        yield llfunctest, lloptest, (3,)
+        yield llfunctest, lloptest, (0,)
+
+def test_cast_char():
+    tests = ("char", str), ("unichar", unicode)
+    for from_name, from_type in tests: 
+        exec """def lloptest(i):
+            if i == 1:
+                c = %s 
+            else:
+                c = %s 
+            return llop.cast_%s_to_int(Signed, c)""" \
+                    % (repr(from_type("a")), repr(from_type("b")), from_name)
+        yield llfunctest, lloptest, (1,)
+



More information about the Pypy-commit mailing list