DEADSOFTWARE

Добавлены строки
[dsw-obn.git] / src / backends / jvm / generator-jvm-basic.c
index d419abea2de5e88267b44667ccf95d370d08f698..88de2e2292119fbe5c8a4b090caee7c1051bc526 100644 (file)
@@ -90,6 +90,26 @@ jvm_get_descriptor(oberon_type_t * type)
                                        break;
                        }
                        break;
+               case OBERON_TYPE_CHAR:
+                       switch(type -> size)
+                       {
+                               case 1:
+                                       return new_string("B");
+                                       break;
+                               case 2:
+                                       return new_string("C");
+                                       break;
+                               case 4:
+                                       return new_string("I");
+                                       break;
+                               case 8:
+                                       return new_string("J");
+                                       break;
+                               default:
+                                       gen_error("jvm_get_descriptor: unsupported char size %i", type -> size);
+                                       break;
+                       }
+                       break;
                case OBERON_TYPE_BOOLEAN:
                        return new_string("Z");
                        break;
@@ -113,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%s", jvm_get_descriptor_safe(type -> base));
+                       break;
+               default:
+                       return jvm_get_descriptor(type);
+                       break;
+       }
+
+       return NULL;
+}
+
 char
 jvm_get_prefix(oberon_type_t * type)
 {
@@ -121,6 +164,7 @@ jvm_get_prefix(oberon_type_t * type)
        {
                case OBERON_TYPE_BOOLEAN:
                case OBERON_TYPE_INTEGER:
+               case OBERON_TYPE_CHAR:
                        return (size <= 4) ? ('i') : ('l');
                        break;
                case OBERON_TYPE_PROCEDURE:
@@ -132,9 +176,76 @@ jvm_get_prefix(oberon_type_t * type)
                case OBERON_TYPE_REAL:
                        return (size <= 4) ? ('f') : ('d');
                        break;
+               default:
+                       gen_error("jvm_get_prefix: wat");
+                       return '!';
+                       break;
+       }
+}
+
+char
+jvm_get_postfix(oberon_type_t * type)
+{
+       int size = type -> size;
+       switch(type -> class)
+       {
+               case OBERON_TYPE_BOOLEAN:
+                       return 'b';
+                       break;
+               case OBERON_TYPE_INTEGER:
+                       switch(size)
+                       {
+                               case 1:
+                                       return 'b';
+                                       break;
+                               case 2:
+                                       return 's';
+                                       break;
+                               case 4:
+                                       return 'i';
+                                       break;
+                               case 8:
+                                       return 'l';
+                                       break;
+                               default:
+                                       gen_error("jvm_get_postfix: int wat");
+                                       break;
+                       }
+                       break;
+               case OBERON_TYPE_CHAR:
+                       switch(size)
+                       {
+                               case 1:
+                                       return 'b';
+                                       break;
+                               case 2:
+                                       return 'c';
+                                       break;
+                               case 4:
+                                       return 'i';
+                                       break;
+                               case 8:
+                                       return 'l';
+                                       break;
+                               default:
+                                       gen_error("jvm_get_postfix: char wat");
+                                       break;
+                       }
+                       break;
+               case OBERON_TYPE_PROCEDURE:
+               case OBERON_TYPE_ARRAY:
+               case OBERON_TYPE_RECORD:
+               case OBERON_TYPE_POINTER:
+                       return 'a';
+                       break;
+               case OBERON_TYPE_REAL:
+                       return (size <= 4) ? ('f') : ('d');
+                       break;
+               default:
+                       gen_error("jvm_get_postfix: wat");
+                       break;
        }
 
-       gen_error("jvm_get_prefix: wat");
        return '!';
 }
 
@@ -144,6 +255,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);
@@ -158,6 +270,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)
 {
@@ -166,18 +299,21 @@ 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");
 
                        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;
                        }
@@ -234,22 +370,21 @@ jvm_cell_size_for_type(oberon_type_t * type)
 }
 
 int
-jvm_cell_size_for_prefix(char prefix)
+jvm_cell_size_for_postfix(char postfix)
 {
-       switch(prefix)
+       switch(postfix)
        {
                case 'a':
                case 'b':
                case 's':
                case 'i':
-               case 'z':
                case 'f':
                        return 1;
                case 'l':
                case 'd':
                        return 2;
                default:
-                       gen_error("jvm_cell_size_for_prefix: unk prefix %c", prefix);
+                       gen_error("jvm_cell_size_for_postfix: unk postfix %c", postfix);
        }
 
        return -666;