X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm-abi.c;h=353ce21e88af205130ec950698296c57b013323f;hb=f4a67f6ba1dc6b2780e1cda553a1411469bf8b33;hp=ddaf45f77cfe6e9e66b535adef6e1413ee5144fa;hpb=3cd41dedaffe60018890cbe66baea63691fe62e8;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm-abi.c b/src/backends/jvm/generator-jvm-abi.c index ddaf45f..353ce21 100644 --- a/src/backends/jvm/generator-jvm-abi.c +++ b/src/backends/jvm/generator-jvm-abi.c @@ -8,7 +8,6 @@ #include -#include "../../../include/oberon.h" #include "../../oberon-internals.h" #include "generator-jvm.h" #include "generator-jvm-abi.h" @@ -69,6 +68,7 @@ void jvm_generate_load(gen_proc_t * p, gen_var_t * src) { char prefix = src -> type -> prefix; + char postfix = src -> type -> postfix; int cell_size = src -> type -> cell_size; char * full_name = src -> full_name; char * desc = src -> type -> desc; @@ -94,7 +94,7 @@ jvm_generate_load(gen_proc_t * p, gen_var_t * src) case JVM_STORAGE_FRAME_PARAM_VAR: case JVM_STORAGE_FRAME_PARAM_VARPTR: jvm_generate_ldst_prepare(p, src); - jvm_generate(p, 1 + 1, cell_size, "%caload", prefix); + jvm_generate(p, 1 + 1, cell_size, "%caload", postfix); break; case JVM_STORAGE_FRAME: case JVM_STORAGE_FRAME_PARAM: @@ -111,6 +111,7 @@ void jvm_generate_store(gen_proc_t * p, gen_var_t * dst) { char prefix = dst -> type -> prefix; + char postfix = dst -> type -> postfix; int cell_size = dst -> type -> cell_size; char * full_name = dst -> full_name; char * desc = dst -> type -> desc; @@ -135,7 +136,7 @@ jvm_generate_store(gen_proc_t * p, gen_var_t * dst) case JVM_STORAGE_FRAME_VAR: case JVM_STORAGE_FRAME_PARAM_VAR: case JVM_STORAGE_FRAME_PARAM_VARPTR: - jvm_generate(p, 1 + 1 + cell_size, 0, "%castore", prefix); + jvm_generate(p, 1 + 1 + cell_size, 0, "%castore", postfix); break; case JVM_STORAGE_FRAME: case JVM_STORAGE_FRAME_PARAM: @@ -255,33 +256,32 @@ jvm_generate_var(gen_var_t * v) case JVM_STORAGE_REGISTER: case JVM_STORAGE_PARAM: case JVM_STORAGE_PARAM_VAR: - jvm_generate(p, 0, 0, ".var %i is %s %s from start to end", reg, name, desc); + case JVM_STORAGE_FRAME_PARAM: + case JVM_STORAGE_FRAME_PARAM_VAR: + jvm_generate(p, 0, 0, ".var %i is '%s' %s from start to end", reg, name, desc); + break; + case JVM_STORAGE_FRAME: + case JVM_STORAGE_FRAME_VAR: break; case JVM_STORAGE_REGISTER_VAR: - jvm_generate(p, 0, 0, ".var %i is %s [%s from start to end", reg, name, desc); + jvm_generate(p, 0, 0, ".var %i is '%s' [%s from start to end", reg, name, desc); break; case JVM_STORAGE_PARAM_VARPTR: - jvm_generate(p, 0, 0, ".var %i is %s [%s from start to end", reg, name, desc); - jvm_generate(p, 0, 0, ".var %i is %s$offset I from start to end", reg + 1, name); + case JVM_STORAGE_FRAME_PARAM_VARPTR: + jvm_generate(p, 0, 0, ".var %i is '%s' [%s from start to end", reg, name, desc); + jvm_generate(p, 0, 0, ".var %i is '%s$offset' I from start to end", reg + 1, name); break; case JVM_STORAGE_STATIC: - fprintf(v -> class -> fp, ".field public static %s %s\n\n", name, desc); + fprintf(v -> class -> fp, ".field public static '%s' %s\n\n", name, desc); break; case JVM_STORAGE_STATIC_VAR: - fprintf(v -> class -> fp, ".field public static %s [%s\n\n", name, desc); + fprintf(v -> class -> fp, ".field public static '%s' [%s\n\n", name, desc); break; case JVM_STORAGE_FIELD: - fprintf(v -> class -> fp, ".field public %s %s\n\n", name, desc); + fprintf(v -> class -> fp, ".field public '%s' %s\n\n", name, desc); break; case JVM_STORAGE_FIELD_VAR: - fprintf(v -> class -> fp, ".field public %s [%s\n\n", name, desc); - break; - case JVM_STORAGE_FRAME: - case JVM_STORAGE_FRAME_VAR: - case JVM_STORAGE_FRAME_PARAM: - case JVM_STORAGE_FRAME_PARAM_VAR: - case JVM_STORAGE_FRAME_PARAM_VARPTR: - /* См. ниже jvm_generate_frame_class() */ + fprintf(v -> class -> fp, ".field public '%s' [%s\n\n", name, desc); break; default: gen_error("jvm_generate_var: invalid storage %i", storage); @@ -295,6 +295,7 @@ jvm_generate_param_initialization(gen_proc_t * p, gen_var_t * v) int old_reg = v -> reg; int cell_size = v -> type -> cell_size; char prefix = v -> type -> prefix; + char postfix = v -> type -> postfix; char * name = v -> name; char * desc = v -> type -> desc; @@ -308,7 +309,7 @@ jvm_generate_param_initialization(gen_proc_t * p, gen_var_t * v) jvm_generate(p, 0, 1, "iconst_0"); jvm_generate(p, 0, cell_size, "%cload %i", prefix, old_reg); - jvm_generate(p, 1 + 1 + cell_size, 0, "%castore", prefix); + jvm_generate(p, 1 + 1 + cell_size, 0, "%castore", postfix); } void @@ -355,6 +356,7 @@ jvm_generate_var_initialization(gen_proc_t * p, gen_var_t * v) } } +/* static void jvm_generate_abstract_frame_class() { @@ -380,6 +382,7 @@ jvm_generate_abstract_frame_class() jvm_destroy_class(class); } +*/ static struct gen_class * jvm_generate_frame_class(oberon_object_t * proc) @@ -393,7 +396,7 @@ jvm_generate_frame_class(oberon_object_t * proc) abscname = "SYSTEM$FRAME"; cname = jvm_get_field_full_name_safe(proc); cname = new_string("%s$FRAME", cname); - class = jvm_create_class(cname); + class = jvm_create_class(proc -> gen_proc -> class -> dir, cname); fp = class -> fp; class -> full_name = cname; @@ -414,19 +417,19 @@ jvm_generate_frame_class(oberon_object_t * proc) || v -> storage == JVM_STORAGE_FRAME_PARAM) { fprintf(fp, "; LEVEL %i\n", v -> level); - fprintf(fp, ".field public %s %s\n\n", v -> name, v -> type -> desc); + fprintf(fp, ".field public '%s' %s\n\n", v -> name, v -> type -> desc); } else if(v -> storage == JVM_STORAGE_FRAME_VAR || v -> storage == JVM_STORAGE_FRAME_PARAM_VAR) { fprintf(fp, "; LEVEL %i\n", v -> level); - fprintf(fp, ".field public %s [%s\n\n", v -> name, v -> type -> desc); + fprintf(fp, ".field public '%s' [%s\n\n", v -> name, v -> type -> desc); } else if(v -> storage == JVM_STORAGE_FRAME_PARAM_VARPTR) { fprintf(fp, "; LEVEL %i\n", v -> level); - fprintf(fp, ".field public %s [%s\n", v -> name, v -> type -> desc); - fprintf(fp, ".field public %s$offset I\n\n", v -> name); + fprintf(fp, ".field public '%s' [%s\n", v -> name, v -> type -> desc); + fprintf(fp, ".field public '%s$offset' I\n\n", v -> name); } } var = var -> next; @@ -475,7 +478,8 @@ jvm_generate_procedure_frame(oberon_object_t * proc) p = proc -> gen_proc; - jvm_generate_abstract_frame_class(); +// jvm_generate_abstract_frame_class(); + class = jvm_generate_frame_class(proc); t = GC_MALLOC(sizeof *t); @@ -489,7 +493,6 @@ jvm_generate_procedure_frame(oberon_object_t * proc) v = jvm_create_function_var(p, JVM_STORAGE_REGISTER, "$FP$", t); p -> frame_v = v; - printf("jvm_generate_procedure_frame: %p level %i\n", p -> reg_frame, p -> level); p -> reg_frame[p -> level] = v -> reg; } @@ -620,7 +623,7 @@ jvm_generate_staticlinks(oberon_object_t * proc) p = proc -> gen_proc; - jvm_generate_staticlinks_recursive(p, proc -> parent, p -> level); + jvm_generate_staticlinks_recursive(p, proc -> parent, p -> level - 1); } static void @@ -649,12 +652,14 @@ jvm_create_static_links(oberon_object_t * proc) prc = prc -> parent; } + size_t sz = sizeof(*p -> reg_frame) * max_frames; p -> max_frames = max_frames; - p -> reg_frame = GC_MALLOC(sizeof *p -> reg_frame); - memset(p -> reg_frame, 0, max_frames * sizeof *p -> reg_frame); + p -> reg_frame = GC_MALLOC(sz); + memset(p -> reg_frame, 255, sz); p -> level = max_frames - 1; - jvm_create_staticlinks_recursive(p, proc -> parent, p -> level); + + jvm_create_staticlinks_recursive(p, proc -> parent, p -> level - 1); } static void