X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm.c;h=681b4df71ddf6ea5f4c4c885016b2f1557002fea;hb=10288ed60f876a14746b17976fd9d84ed58042cc;hp=e4ea3833027a6d27cd502cf3be21e98191cfc4b7;hpb=4e58c0e61815196bcf87405ab9d070631bc72f90;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index e4ea383..681b4df 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -9,6 +9,7 @@ #include #include "../../oberon-internals.h" +#include "../../generator.h" #include "generator-jvm.h" #include "generator-jvm-abi.h" #include "generator-jvm-asm.h" @@ -582,6 +583,13 @@ oberon_generator_init_record(oberon_context_t * ctx, oberon_type_t * rec) jvm_generate_var_initialization(p, copy_dst); jvm_generate_var_initialization(p, copy_src); + if(rec -> base) + { + jvm_generate_load(p, copy_dst); + jvm_generate_load(p, copy_src); + jvm_generate_copy_record(p, rec -> base); + } + num = rec -> num_decl; field = rec -> decl; for(int i = 0; i < num; i++) @@ -631,6 +639,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: @@ -724,6 +739,18 @@ 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) { @@ -759,13 +786,7 @@ oberon_generate_begin_module(oberon_context_t * ctx) else if(x -> class == OBERON_CLASS_VAR) { jvm_generate_var_initialization(p, x -> gen_var); - 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); - } + oberon_generate_static_initialization(p, x); } x = x -> next; @@ -864,10 +885,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; } } @@ -888,28 +911,31 @@ jvm_generate_local_initialization(gen_proc_t * p, oberon_object_t * x) switch(x -> class) { case OBERON_CLASS_VAR_PARAM: + jvm_generate_var_initialization(p, v); + break; case OBERON_CLASS_PARAM: + jvm_generate_var_initialization(p, v); + if(x -> type -> class == OBERON_TYPE_ARRAY) + { + jvm_generate_array_duplicate_and_replace(p, v, x -> type); + } + else if(x -> type -> class == OBERON_TYPE_RECORD) + { + jvm_generate_record_duplicate_and_replace(p, v, x -> type); + } + break; case OBERON_CLASS_VAR: jvm_generate_var_initialization(p, v); + oberon_generate_static_initialization(p, x); 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; } - - if(x -> class == OBERON_CLASS_PARAM) - { - if(x -> type -> class == OBERON_TYPE_ARRAY) - { - jvm_generate_array_duplicate_and_replace(p, v, x -> type); - } - else if(x -> type -> class == OBERON_TYPE_RECORD) - { - jvm_generate_record_duplicate_and_replace(p, v, x -> type); - } - } } void @@ -970,6 +996,7 @@ oberon_generate_end_proc(oberon_context_t * ctx) m = ctx -> mod -> gen_mod; p = m -> class -> p; + oberon_generate_trap(ctx, -4); jvm_generate_function_end(p); } @@ -1177,11 +1204,22 @@ jvm_generate_expr_new_pointer(gen_proc_t * p, oberon_type_t * type, int num, obe static void jvm_generate_cast_prefix(gen_proc_t * p, char prefix, char postfix) { + if((prefix == 'b' || prefix == 's') && (postfix = 'l' || postfix == 'd')) + { + prefix = 'i'; + } + if(prefix == postfix) { return; } + if((prefix == 'l' || prefix == 'd') && (postfix == 'b' || postfix == 's')) + { + jvm_generate(p, 2, 1, "%c2i", prefix); + prefix = 'i'; + } + int from_cell_size = jvm_cell_size_for_postfix(prefix); int to_cell_size = jvm_cell_size_for_postfix(postfix); jvm_generate(p, from_cell_size, to_cell_size, "%c2%c", prefix, postfix);