X-Git-Url: http://deadsoftware.ru/gitweb?p=dsw-obn.git;a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm-abi.c;h=fa34f1dfd8190149b12569aca64b7bc29b767d64;hp=ed4a19ad1f3cd5ccae3c0e9645ded564faf9c355;hb=6e0d9d632fdf070f9777fe90b9add849562acaf2;hpb=55d9ee92b95dd306ac80fb643ed21d3b733395d7 diff --git a/src/backends/jvm/generator-jvm-abi.c b/src/backends/jvm/generator-jvm-abi.c index ed4a19a..fa34f1d 100644 --- a/src/backends/jvm/generator-jvm-abi.c +++ b/src/backends/jvm/generator-jvm-abi.c @@ -32,18 +32,21 @@ void jvm_generate_ldst_prepare(gen_proc_t * p, gen_var_t * v) { - char * full_name = v -> full_name; - char * desc = v -> type -> desc; - + char * desc; + char * full_name; switch(v -> storage) { case JVM_STORAGE_REGISTER: break; case JVM_STORAGE_STATIC: + full_name = v -> full_name; + desc = v -> type -> desc; jvm_generate(p, 0, 1, "getstatic %s [%s", full_name, desc); jvm_generate(p, 0, 1, "iconst_0"); break; case JVM_STORAGE_FIELD: + full_name = v -> full_name; + desc = v -> type -> desc; jvm_generate(p, 1, 1, "getfield %s [%s", full_name, desc); jvm_generate(p, 0, 1, "iconst_0"); break; @@ -133,25 +136,32 @@ void jvm_generate_and_init_local_var(gen_proc_t * p, gen_var_t * v, gen_type_t * t) { v -> storage = JVM_STORAGE_REGISTER; - v -> reg = jvm_alloc_register_untyped(p -> rf, t -> wide); + v -> reg = jvm_alloc_register_untyped(p -> rf, t -> wide); v -> type = t; } void -jvm_generate_and_init_named_local_var(gen_proc_t * p, gen_var_t * v, char * name, gen_type_t * t) +jvm_init_named_local_var(gen_proc_t * p, gen_var_t * v, gen_type_t * t) { - jvm_generate_and_init_local_var(p, v, t); - jvm_generate(p, 0, 0, ".var %i is %s %s from start to end", v -> reg, name, t -> desc); + v -> storage = JVM_STORAGE_REGISTER; + v -> reg = jvm_alloc_register_untyped(p -> rf, t -> wide); + v -> type = t; +} + +void +jvm_init_param(gen_proc_t * p, gen_var_t * v, gen_type_t * t) +{ + v -> storage = JVM_STORAGE_LOCAL; + v -> reg = jvm_alloc_register_untyped(p -> rf, t -> wide); + v -> type = t; } void -jvm_generate_and_init_var_param(gen_proc_t * p, gen_var_t * v, char * name, gen_type_t * t) +jvm_init_var_param(gen_proc_t * p, gen_var_t * v, gen_type_t * t) { v -> storage = JVM_STORAGE_VARPTR; - v -> reg = jvm_alloc_register_untyped(p -> rf, true); + v -> reg = jvm_alloc_register_untyped(p -> rf, true); v -> type = t; - jvm_generate(p, 0, 0, ".var %i is %s [%s from start to end", v -> reg, name, t -> desc); - jvm_generate(p, 0, 0, ".var %i is __%s_offset I from start to end", v -> reg + 1, name); } void @@ -172,17 +182,21 @@ jvm_generate_variable_initialization(gen_proc_t * p, gen_var_t * v) } void -jvm_generate_param_initialization(gen_proc_t * p, gen_var_t * v) +jvm_generate_named_local_var_initialization(gen_proc_t * p, gen_var_t * v, char * name) { - assert(v -> storage == JVM_STORAGE_REGISTER); + jvm_generate(p, 0, 0, ".var %i is %s %s from start to end", v -> reg, name, v -> type -> desc); +} +void +jvm_generate_param_initialization(gen_proc_t * p, gen_var_t * v, char * name) +{ int old_reg = v -> reg; bool wide = v -> type -> wide; int cell_size = v -> type -> cell_size; char prefix = v -> type -> prefix; char * desc = v -> type -> desc; - v -> storage = JVM_STORAGE_LOCAL; + jvm_generate(p, 0, 0, ".var %i is %s %s from start to end", old_reg, name, desc); v -> reg = jvm_alloc_register_untyped(p -> rf, wide); jvm_generate(p, 0, 1, "iconst_1"); @@ -194,3 +208,10 @@ jvm_generate_param_initialization(gen_proc_t * p, gen_var_t * v) jvm_generate(p, 0, cell_size, "%cload %i", prefix, old_reg); jvm_generate(p, 1 + 1 + cell_size, 0, "%castore", prefix); } + +void +jvm_generate_var_param_initialization(gen_proc_t * p, gen_var_t * v, char * name) +{ + jvm_generate(p, 0, 0, ".var %i is %s [%s from start to end", v -> reg, name, v -> type -> desc); + jvm_generate(p, 0, 0, ".var %i is __%s_offset I from start to end", v -> reg + 1, name); +}