return NULL;
}
+char *
+jvm_get_descriptor_safe(oberon_type_t * type)
+{
+ switch(type -> class)
+ {
+ case OBERON_TYPE_POINTER:
+ return new_string("PTR%s", jvm_get_descriptor_safe(type -> base));
+ break;
+ case OBERON_TYPE_PROCEDURE:
+ case OBERON_TYPE_RECORD:
+ return jvm_get_class_full_name(type);
+ break;
+ case OBERON_TYPE_ARRAY:
+ return new_string("A%sX", jvm_get_descriptor_safe(type -> base));
+ break;
+ default:
+ return jvm_get_descriptor(type);
+ break;
+ }
+
+ return NULL;
+}
+
char
jvm_get_prefix(oberon_type_t * type)
{
name = new_string("SYSTEM$PROCEDURE");
char * desc;
- desc = jvm_get_descriptor(type -> base);
+ desc = jvm_get_descriptor_safe(type -> base);
name = new_string("%s$%s", name, desc);
int num = type -> num_decl;
oberon_object_t * arg = type -> decl;
for(int i = 0; i < num; i++)
{
- desc = jvm_get_descriptor(arg -> type);
+ desc = jvm_get_descriptor_safe(arg -> type);
name = new_string("%s%s", name, desc);
arg = arg -> next;
}
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");
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;
}