DEADSOFTWARE

JVM: исправлены указатели на процедуры: больше не требуется поддержка со стороны...
[dsw-obn.git] / src / backends / jvm / generator-jvm-basic.c
index aad9747f25cbf4d091e86db1f0ea9a3d098753dc..24c28b057429313018bf1529c64154c1e2a27825 100644 (file)
@@ -133,6 +133,29 @@ jvm_get_descriptor(oberon_type_t * type)
        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)
 {
@@ -283,14 +306,14 @@ jvm_get_class_full_name(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;
                        }