X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm.c;h=c389ebce731e08fd36d13c36fceff9083f2308b9;hb=833752b95ce17f151a60ba00a75e25b4afc67f4d;hp=1281c19426745d43a4982a24e92a26c834445bb7;hpb=9aa6ede8ebe1b901501ad3cb49d79d6811a79dc9;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 1281c19..c389ebc 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -8,7 +8,6 @@ #include -#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: @@ -865,10 +871,12 @@ jvm_generate_local_object(gen_proc_t * p, oberon_object_t * x) case OBERON_CLASS_VAR: jvm_generate_var(v); break; + case OBERON_CLASS_CONST: + case OBERON_CLASS_TYPE: case OBERON_CLASS_PROC: break; default: - gen_error("jvm_generate_local_initialization: wat"); + gen_error("jvm_generate_local_initialization: wat class %i", x -> class); break; } } @@ -893,10 +901,12 @@ jvm_generate_local_initialization(gen_proc_t * p, oberon_object_t * x) case OBERON_CLASS_VAR: jvm_generate_var_initialization(p, v); break; + case OBERON_CLASS_CONST: + case OBERON_CLASS_TYPE: case OBERON_CLASS_PROC: break; default: - gen_error("jvm_generate_local_initialization: wat"); + gen_error("jvm_generate_local_initialization: wat class %i", x -> class); break; } @@ -1217,12 +1227,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