index 1281c19426745d43a4982a24e92a26c834445bb7..c389ebce731e08fd36d13c36fceff9083f2308b9 100644 (file)
#include <gc.h>
#include <gc.h>
-#include "../../../include/oberon.h"
#include "../../oberon-internals.h"
#include "generator-jvm.h"
#include "generator-jvm-abi.h"
#include "../../oberon-internals.h"
#include "generator-jvm.h"
#include "generator-jvm-abi.h"
struct gen_class * c;
char * name = var -> name;
gen_type_t * t = var -> type -> gen_type;
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:
switch(var -> class)
{
case OBERON_CLASS_VAR_PARAM:
case OBERON_CLASS_VAR:
jvm_generate_var(v);
break;
case OBERON_CLASS_VAR:
jvm_generate_var(v);
break;
+ case OBERON_CLASS_CONST:
+ case OBERON_CLASS_TYPE:
case OBERON_CLASS_PROC:
break;
default:
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;
}
}
break;
}
}
case OBERON_CLASS_VAR:
jvm_generate_var_initialization(p, v);
break;
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:
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;
}
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");
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
{
}
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
}
}
else