DEADSOFTWARE

Теперь можно указывать куда сгружать высер кодогенератора
[dsw-obn.git] / src / backends / jvm / generator-jvm-abi.c
index a750b927fb170a568a27f0f5bc29fe1ab6bdf038..8d966cbe4877ac404487fbd308d8bc2d5a359deb 100644 (file)
 #include "generator-jvm-asm.h"
 #include "generator-jvm-basic.h"
 
-/*
- *   --- Каждый модуль является объектом.
- *       Импортируемые модули представляются полями.
- *       Каждая глобальная переменная представляется не статическим полем.
- *       Каждая процедура представляется не статическим метеодом.
- *       Процедура инициализации модуля имеет название BEGIN.
- *       Процедура финализации модуля имеет название END.
- *         Это позволит сделать динамическую загрузку и выгрузку.
- *   +++ всем переменным и полям в дескриптор добавляется "["
- *         Это позволит делать ссылки на переменные в VAR-параметрах.
- *   --- Каждая процедура снабжается параметром-фреймом.
- *         Это позволит реализовать локальные процедуры и средства рефлекции над стеком.
- */ 
-
 void
 jvm_generate_ldst_prepare(gen_proc_t * p, gen_var_t * v)
 {
@@ -83,6 +69,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;
@@ -108,7 +95,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:
@@ -125,6 +112,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;
@@ -149,7 +137,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:
@@ -309,6 +297,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;
 
@@ -322,7 +311,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
@@ -369,6 +358,7 @@ jvm_generate_var_initialization(gen_proc_t * p, gen_var_t * v)
        }
 }
 
+/*
 static void
 jvm_generate_abstract_frame_class()
 {
@@ -394,6 +384,7 @@ jvm_generate_abstract_frame_class()
 
        jvm_destroy_class(class);
 }
+*/
 
 static struct gen_class *
 jvm_generate_frame_class(oberon_object_t * proc)
@@ -407,7 +398,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;
@@ -489,7 +480,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);