DEADSOFTWARE

JVM: Реализованы локальные процедуры (без доступа к локальным переменным уровнем...
[dsw-obn.git] / src / backends / jvm / generator-jvm-abi.c
index ed4a19ad1f3cd5ccae3c0e9645ded564faf9c355..fa34f1dfd8190149b12569aca64b7bc29b767d64 100644 (file)
 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);
+}