DEADSOFTWARE

Добавлены строки
[dsw-obn.git] / src / backends / jvm / generator-jvm.c
index e4c70b1c23d312e580c24f1a2d2348963548ecc1..f111fd16eff755440676a4b6a6e433713cc43b4b 100644 (file)
@@ -263,6 +263,24 @@ jvm_generate_push_float(gen_proc_t * p, double f, int size)
        }
 }
 
+static void
+jvm_generate_push_string(gen_proc_t * p, char * str, int char_size)
+{
+       assert(char_size == 1);
+       int len = strlen(str);
+
+       jvm_generate_push_int(p, len + 1);
+       jvm_generate(p, 1, 1, "newarray byte");
+
+       for(int i = 0; i < len; i++)
+       {
+               jvm_generate(p, 1, 2, "dup");
+               jvm_generate_push_int(p, i);
+               jvm_generate_push_int(p, str[i]);
+               jvm_generate(p, 3, 0, "bastore");
+       }
+}
+
 static gen_var_t *
 oberon_generator_new_var()
 {
@@ -582,7 +600,7 @@ jvm_generate_copy_array(gen_proc_t * p, oberon_type_t * arr)
         * Входящие параметры заграблены.
         * Теперь генерируем эквивалентный код:
         *   int i = 0;
-        *   int len = dst.length
+        *   int len = src.length
         *   while(i < len)
         *   {
         *     ...
@@ -609,7 +627,7 @@ jvm_generate_copy_array(gen_proc_t * p, oberon_type_t * arr)
                jvm_generate(p, 0, 1, "iconst_0");
                jvm_generate(p, 1, 0, "istore %i", loop[i].index -> reg);
 
-               jvm_generate_load(p, arr, dst);
+               jvm_generate_load(p, arr, src);
                jvm_generate(p, 1, 1, "arraylength");
                jvm_generate(p, 1, 0, "istore %i", loop[i].length -> reg);
 
@@ -761,7 +779,14 @@ oberon_generate_procedure_pointer_class(oberon_object_t * proc)
        fprintf(fp, ".method <init>()V\n");
        fprintf(fp, "  aload_0\n");
        fprintf(fp, "  invokespecial %s/<init>()V\n", abscname);
-       fprintf(fp, "  aload_0\n");
+       fprintf(fp, "  return\n");
+       fprintf(fp, ".end method\n\n");
+
+       fprintf(fp, ".method static <clinit>()V\n");
+       fprintf(fp, "  .limit stack 2\n");
+       fprintf(fp, "  new %s\n", cname);
+       fprintf(fp, "  dup\n");
+       fprintf(fp, "  invokespecial %s/<init>()V\n", cname);
        fprintf(fp, "  putstatic %s/pointer %s\n", cname, absdesc);
        fprintf(fp, "  return\n");
        fprintf(fp, ".end method\n\n");
@@ -859,6 +884,7 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type)
                case OBERON_TYPE_ARRAY:
                case OBERON_TYPE_REAL:
                case OBERON_TYPE_CHAR:
+               case OBERON_TYPE_STRING:
                        break;
                case OBERON_TYPE_RECORD:
                        ;
@@ -1076,12 +1102,6 @@ oberon_generate_begin_module(oberon_context_t * ctx)
                                jvm_generate_store(p, x -> type, x -> gen_var);
                        }
                }
-               else if(x -> class == OBERON_CLASS_PROC)
-               {
-                       char * cname = jvm_get_field_full_name_safe(x);
-                       jvm_generate(p, 0, 1, "new %s", cname);
-                       jvm_generate(p, 1, 0, "invokespecial %s/<init>()V", cname);
-               }
 
                x = x -> next;
        }
@@ -1404,6 +1424,9 @@ push_item(gen_proc_t * p, oberon_item_t * item)
                case MODE_REAL:
                        jvm_generate_push_float(p, item -> real, item -> result -> size);
                        break;
+               case MODE_STRING:
+                       jvm_generate_push_string(p, item -> string, item -> result -> size);
+                       break;
                default:
                        gen_error("push_item: unk mode %i", item -> mode);
                        break;