DEADSOFTWARE

JVM: исправлены указатели на процедуры: больше не требуется поддержка со стороны...
[dsw-obn.git] / src / backends / jvm / generator-jvm.c
index d986a8e4cbc9af35a1fcf9361c531238c1de3fa8..d609ed8de96c216a30ac4ec9bceda90ec230583e 100644 (file)
@@ -761,7 +761,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");
@@ -858,6 +865,7 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type)
                case OBERON_TYPE_BOOLEAN:
                case OBERON_TYPE_ARRAY:
                case OBERON_TYPE_REAL:
+               case OBERON_TYPE_CHAR:
                        break;
                case OBERON_TYPE_RECORD:
                        ;
@@ -1075,12 +1083,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;
        }
@@ -1366,6 +1368,7 @@ push_item(gen_proc_t * p, oberon_item_t * item)
                        }
                        break;
                case MODE_INTEGER:
+               case MODE_CHAR:
                        jvm_generate_push_int_size(p, item -> integer, item -> result -> size);
                        break;
                case MODE_BOOLEAN: