From: DeaDDooMER Date: Fri, 15 Sep 2017 17:11:15 +0000 (+0300) Subject: JVM: return генерируется после TRAP(-4) X-Git-Url: http://deadsoftware.ru/gitweb?a=commitdiff_plain;h=0c29ba1953327a9b476a825d8b9b9d185d544972;p=dsw-obn.git JVM: return генерируется после TRAP(-4) --- diff --git a/notes b/notes index d2a263f..bdd35e2 100644 --- a/notes +++ b/notes @@ -1,7 +1,6 @@ - Jasmin создаёт ошибку в float константах, надо как-то порешать. - Нужно делать проверку границ при касте индекса массива с типом HUGEINT -- Секции CONST/TYPE/VAR сейчас нельзя повторять (что не по стандарту) - Нужно передавать информацию о файле и строках в кодогенератор. - Нет процедур привязанных к типм (10.2) - Не полная реализация модуля Files diff --git a/src/backends/jvm/generator-jvm-basic.c b/src/backends/jvm/generator-jvm-basic.c index 61088af..033b842 100644 --- a/src/backends/jvm/generator-jvm-basic.c +++ b/src/backends/jvm/generator-jvm-basic.c @@ -191,6 +191,9 @@ jvm_get_prefix(oberon_type_t * type) int size = type -> size; switch(type -> class) { + case OBERON_TYPE_NOTYPE: + return ' '; + break; case OBERON_TYPE_BOOLEAN: case OBERON_TYPE_INTEGER: case OBERON_TYPE_CHAR: @@ -223,6 +226,9 @@ jvm_get_postfix(oberon_type_t * type) int size = type -> size; switch(type -> class) { + case OBERON_TYPE_NOTYPE: + return ' '; + break; case OBERON_TYPE_BOOLEAN: return 'b'; break; @@ -436,6 +442,8 @@ jvm_cell_size_for_postfix(char postfix) { switch(postfix) { + case ' ': + return 0; case 'a': case 'b': case 's': @@ -523,6 +531,8 @@ jvm_get_type_of_prefix(char prefix) { switch(prefix) { + case ' ': + return 'V'; case 'b': return 'B'; case 'c': diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 7da9b61..9cade33 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -1060,6 +1060,7 @@ oberon_generate_begin_proc(oberon_context_t * ctx, oberon_object_t * proc) } name = jvm_get_name(proc); + p -> ret_prefix = jvm_get_prefix(proc -> type -> base); jvm_generate_function_header(p, "public static", name, signature); if(proc -> local) @@ -1098,6 +1099,35 @@ oberon_generate_end_proc(oberon_context_t * ctx) p = m -> class -> p; oberon_generate_trap(ctx, -4); + + if(p -> ret_prefix == ' ') + { + jvm_generate(p, 0, 0, "return"); + } + else + { + int sz = jvm_cell_size_for_postfix(p -> ret_prefix); + switch(p -> ret_prefix) + { + case 'a': + jvm_generate(p, 0, 1, "aconst_null"); + break; + case 'l': + jvm_generate_push_int_size(p, 0, 8); + break; + case 'f': + jvm_generate_push_float(p, 0, 4); + break; + case 'd': + jvm_generate_push_float(p, 0, 8); + break; + default: + jvm_generate_push_int(p, 0); + break; + } + jvm_generate(p, sz, 0, "%creturn", p -> ret_prefix); + } + jvm_generate_function_end(p); } diff --git a/src/backends/jvm/generator-jvm.h b/src/backends/jvm/generator-jvm.h index f769a1e..44f8932 100644 --- a/src/backends/jvm/generator-jvm.h +++ b/src/backends/jvm/generator-jvm.h @@ -57,6 +57,8 @@ struct gen_proc_t struct gen_stack * stack; struct gen_class * class; + char ret_prefix; + int level; int max_frames; int * reg_frame;