DEADSOFTWARE

Поправлены объявления типов наперёд
[dsw-obn.git] / src / backends / jvm / generator-jvm.c
index 1281c19426745d43a4982a24e92a26c834445bb7..be8c9292dd0444f3f50c0ce116baee2ad660f254 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <gc.h>
 
-#include "../../../include/oberon.h"
 #include "../../oberon-internals.h"
 #include "generator-jvm.h"
 #include "generator-jvm-abi.h"
@@ -632,6 +631,13 @@ oberon_generator_init_var(oberon_context_t * ctx, oberon_object_t * var)
        struct gen_class * c;
        char * name = var -> name;
        gen_type_t * t = var -> type -> gen_type;
+
+       assert(name);
+       if(t == NULL)
+       {
+               gen_error("uninitialized type class %i", var -> type -> class);
+       }
+
        switch(var -> class)
        {
                case OBERON_CLASS_VAR_PARAM:
@@ -1217,12 +1223,27 @@ jvm_generate_hard_cast_type(gen_proc_t * p, oberon_type_t * from, oberon_type_t
                if(from -> size <= 4)
                {
                        jvm_generate(p, 1, 1, "invokestatic java/lang/Float/floatToIntBits(F)I");
-                       jvm_generate_cast_prefix(p, 'I', postfix);
+                       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(p, 2, 2, "invokestatic java/lang/Double/floatToIntBits(D)J");
-                       jvm_generate_cast_prefix(p, 'J', postfix);
+                       jvm_generate_cast_prefix(p, prefix, 'l');
+                       jvm_generate(p, 2, 2, "invokestatic java/lang/Double/longBitsToDouble(J)D");
                }
        }
        else