X-Git-Url: https://deadsoftware.ru/gitweb?p=dsw-obn.git;a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm.c;h=91b82bf8c0465f99626d544d4f787421a15d0e23;hp=48db18000ba1a65e2c651d59f7f0f0afe0482f53;hb=8db9b6a5f0d565ae2994cefeb081712ce917f67f;hpb=afdfb61e64fb9c7d05a7612812739aa0d9a560fc diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 48db180..91b82bf 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -78,7 +78,7 @@ jvm_generate_hard_cast_type(gen_proc_t * p, oberon_type_t * from, oberon_type_t } else { - jvm_generate(p, 2, 2, "invokestatic java/lang/Double/doubleToRawIntBits(D)J"); + jvm_generate(p, 2, 2, "invokestatic java/lang/Double/doubleToRawLongBits(D)J"); jvm_generate_cast_prefix(p, 'l', postfix); } } @@ -587,6 +587,7 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type) break; case OBERON_TYPE_RECORD: m = type -> module -> gen_mod; + t -> full_name = jvm_get_class_full_name(type); oberon_generate_record_class(c -> dir, m, type); break; case OBERON_TYPE_PROCEDURE: @@ -604,6 +605,14 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type) t -> postfix = jvm_get_postfix(type); } + if(type -> class == OBERON_TYPE_POINTER || + type -> class == OBERON_TYPE_PROCEDURE || + type -> class == OBERON_TYPE_RECORD || + type -> class == OBERON_TYPE_SYSTEM_PTR) + { + t -> full_name = jvm_get_class_full_name(type); + } + t -> cell_size = jvm_cell_size_for_type(type); if(type -> class != OBERON_TYPE_NIL) @@ -768,6 +777,18 @@ oberon_generator_init_var(oberon_context_t * ctx, oberon_object_t * var) } } +static void +oberon_generate_static_initialization(gen_proc_t * p, oberon_object_t * x) +{ + if(x -> type -> class == OBERON_TYPE_ARRAY + || x -> type -> class == OBERON_TYPE_RECORD) + { + jvm_generate_ldst_prepare(p, x -> gen_var); + jvm_generate_new(p, x -> type, 0); + jvm_generate_store(p, x -> gen_var); + } +} + void oberon_generator_init_temp_var(oberon_context_t * ctx, oberon_object_t * var) { @@ -785,6 +806,7 @@ oberon_generator_init_temp_var(oberon_context_t * ctx, oberon_object_t * var) var -> gen_var = jvm_create_function_temp_var(p, t); jvm_generate_var(var -> gen_var); jvm_generate_var_initialization(p, var -> gen_var); + oberon_generate_static_initialization(p, var); } void @@ -829,18 +851,6 @@ oberon_generator_fini_module(oberon_module_t * mod) static void push_expr(gen_proc_t * p, oberon_expr_t * expr); -static void -oberon_generate_static_initialization(gen_proc_t * p, oberon_object_t * x) -{ - if(x -> type -> class == OBERON_TYPE_ARRAY - || x -> type -> class == OBERON_TYPE_RECORD) - { - jvm_generate_ldst_prepare(p, x -> gen_var); - jvm_generate_new(p, x -> type, 0); - jvm_generate_store(p, x -> gen_var); - } -} - void oberon_generate_begin_module(oberon_context_t * ctx) { @@ -1940,3 +1950,11 @@ oberon_set_out_directory(oberon_context_t * ctx, const char * path) c -> dir = new_string(path); } + +void +oberon_set_typecheck(oberon_object_t * var, bool enable) +{ + var -> gen_var -> typecheck = enable; + var -> gen_var -> forcetype = (enable) ? (var -> type -> gen_type) : (NULL); +} +