DEADSOFTWARE

Поправлен каст и использование указателей на записи
[dsw-obn.git] / src / backends / jvm / generator-jvm-basic.c
index 5fabc3171bf03787173e193640811e552934bd4a..2b9b5483efa3b7b76050a4c105d3cb4b20dc655c 100644 (file)
@@ -190,6 +190,7 @@ jvm_get_field_full_name(oberon_object_t * x)
        switch(x -> class)
        {
                case OBERON_CLASS_VAR:
+               case OBERON_CLASS_PROC:
                        return new_string("%s/%s", x -> module -> name, x -> name);
                case OBERON_CLASS_FIELD:;
                        char * rec_name = jvm_get_class_full_name(x -> parent_type);
@@ -204,6 +205,27 @@ jvm_get_field_full_name(oberon_object_t * x)
        return NULL;
 }
 
+char *
+jvm_get_field_full_name_safe(oberon_object_t * x)
+{
+       switch(x -> class)
+       {
+               case OBERON_CLASS_VAR:
+               case OBERON_CLASS_PROC:
+                       return new_string("%s$%s", x -> module -> name, x -> name);
+               case OBERON_CLASS_FIELD:;
+                       char * rec_name = jvm_get_class_full_name(x -> parent_type);
+                       return new_string("%s$%s", rec_name, x -> name);
+               case OBERON_CLASS_MODULE:
+                       return new_string(x -> module -> name);
+               default:
+                       gen_error("jvm_get_field_full_name: wat");
+                       break;
+       }
+
+       return NULL;
+}
+
 char *
 jvm_get_class_full_name(oberon_type_t * type)
 {
@@ -212,6 +234,9 @@ jvm_get_class_full_name(oberon_type_t * type)
 
        switch(type -> class)
        {
+               case OBERON_TYPE_POINTER:
+                       name = jvm_get_class_full_name(type -> base);
+                       break;
                case OBERON_TYPE_PROCEDURE:
                        name = new_string("SYSTEM$PROCEDURE");