DEADSOFTWARE

Иправлен(?) мемори коррапшн
[dsw-obn.git] / src / backends / jvm / generator-jvm-abi.c
index ddaf45f77cfe6e9e66b535adef6e1413ee5144fa..2889ae3c718437b3220ae308ba0e446a9fec55bc 100644 (file)
@@ -69,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;
@@ -94,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:
@@ -111,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;
@@ -135,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:
@@ -255,33 +257,31 @@ 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:
+               case JVM_STORAGE_FRAME_VAR:
+               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_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;
 }
 
@@ -649,9 +652,10 @@ 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, 0, sz);
 
        p -> level = max_frames - 1;
        jvm_create_staticlinks_recursive(p, proc -> parent, p -> level);