[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