index c063e2fc7fcc03ddd8c2150e03cca24c2220a96a..e4ea3833027a6d27cd502cf3be21e98191cfc4b7 100644 (file)
#include <gc.h>
-#include "../../../include/oberon.h"
#include "../../oberon-internals.h"
#include "generator-jvm.h"
#include "generator-jvm-abi.h"
@@ -1207,6 +1206,45 @@ jvm_generate_cast_type(gen_proc_t * p, oberon_type_t * from, oberon_type_t * to)
}
}
+static void
+jvm_generate_hard_cast_type(gen_proc_t * p, oberon_type_t * from, oberon_type_t * to)
+{
+ if(from -> class == OBERON_TYPE_REAL
+ && (to -> class == OBERON_TYPE_INTEGER || to -> class == OBERON_TYPE_SYSTEM_BYTE))
+ {
+ char postfix = jvm_get_postfix(to);
+ if(from -> size <= 4)
+ {
+ jvm_generate(p, 1, 1, "invokestatic java/lang/Float/floatToIntBits(F)I");
+ jvm_generate_cast_prefix(p, 'i', postfix);
+ }
+ else
+ {
+ jvm_generate(p, 2, 2, "invokestatic java/lang/Double/doubleToIntBits(D)J");
+ jvm_generate_cast_prefix(p, 'l', postfix);
+ }
+ }
+ else if((from -> class == OBERON_TYPE_INTEGER || from -> class == OBERON_TYPE_SYSTEM_BYTE)
+ && to -> class == OBERON_TYPE_REAL)
+ {
+ char prefix = jvm_get_prefix(from);
+ if(to -> size <= 4)
+ {
+ jvm_generate_cast_prefix(p, prefix, 'i');
+ jvm_generate(p, 1, 1, "invokestatic java/lang/Float/intBitsToFloat(I)F");
+ }
+ else
+ {
+ jvm_generate_cast_prefix(p, prefix, 'l');
+ jvm_generate(p, 2, 2, "invokestatic java/lang/Double/longBitsToDouble(J)D");
+ }
+ }
+ else
+ {
+ jvm_generate_cast_type(p, from, to);
+ }
+}
+
static void
push_item(gen_proc_t * p, oberon_item_t * item)
{
push_expr(p, oper -> left);
jvm_generate_cast_type(p, oper -> left -> result, oper -> result);
break;
+ case OP_HARDCAST:
+ push_expr(p, oper -> left);
+ jvm_generate_hard_cast_type(p, oper -> left -> result, oper -> result);
+ break;
case OP_COMPLEMENTATION:
case OP_UNARY_MINUS:
case OP_LOGIC_NOT: