DEADSOFTWARE

JVM: Реализованы VAR-параметры
[dsw-obn.git] / src / backends / jvm / generator-jvm-basic.c
index 44046a1506ab27c99e6b78e7178309c684f5e7dd..277940ce17b58fb18f46ee630aa162c2a250c62a 100644 (file)
@@ -57,6 +57,7 @@ jvm_get_descriptor(oberon_type_t * type)
                        return new_string("V");
                        break;
                case OBERON_TYPE_INTEGER:
+               case OBERON_TYPE_SET:
                        switch(type -> size)
                        {
                                case 1:
@@ -125,6 +126,26 @@ jvm_get_descriptor(oberon_type_t * type)
                        desc = jvm_get_descriptor(type -> base);
                        return new_string("[%s", desc);
                        break;
+               case OBERON_TYPE_STRING:
+                       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 string size %i", type -> size);
+                                       break;
+                       }
+                       break;
                default:
                        gen_error("jvm_get_descriptor: unsupported type class %i", type -> class);
                        break;
@@ -165,19 +186,21 @@ jvm_get_prefix(oberon_type_t * type)
                case OBERON_TYPE_BOOLEAN:
                case OBERON_TYPE_INTEGER:
                case OBERON_TYPE_CHAR:
+               case OBERON_TYPE_SET:
                        return (size <= 4) ? ('i') : ('l');
                        break;
                case OBERON_TYPE_PROCEDURE:
                case OBERON_TYPE_ARRAY:
                case OBERON_TYPE_RECORD:
                case OBERON_TYPE_POINTER:
+               case OBERON_TYPE_STRING:
                        return 'a';
                        break;
                case OBERON_TYPE_REAL:
                        return (size <= 4) ? ('f') : ('d');
                        break;
                default:
-                       gen_error("jvm_get_prefix: wat");
+                       gen_error("jvm_get_prefix: wat %i", type -> class);
                        return '!';
                        break;
        }
@@ -193,6 +216,7 @@ jvm_get_postfix(oberon_type_t * type)
                        return 'b';
                        break;
                case OBERON_TYPE_INTEGER:
+               case OBERON_TYPE_SET:
                        switch(size)
                        {
                                case 1:
@@ -236,6 +260,7 @@ jvm_get_postfix(oberon_type_t * type)
                case OBERON_TYPE_ARRAY:
                case OBERON_TYPE_RECORD:
                case OBERON_TYPE_POINTER:
+               case OBERON_TYPE_STRING:
                        return 'a';
                        break;
                case OBERON_TYPE_REAL:
@@ -344,7 +369,14 @@ jvm_get_procedure_signature(oberon_type_t * proc)
        for(int i = 0; i < num; i++)
        {
                desc = jvm_get_descriptor(arg -> type);
-               signature = new_string("%s%s", signature, desc);
+               if(arg -> class == OBERON_CLASS_VAR_PARAM)
+               {
+                       signature = new_string("%s[%sI", signature, desc);
+               }
+               else
+               {
+                       signature = new_string("%s%s", signature, desc);
+               }
                arg = arg -> next;
        }
 
@@ -358,7 +390,9 @@ int
 jvm_cell_size_for_type(oberon_type_t * type)
 {
        if(type -> class == OBERON_TYPE_INTEGER
-               || type -> class == OBERON_TYPE_REAL)
+               || type -> class == OBERON_TYPE_REAL
+               || type -> class == OBERON_TYPE_CHAR
+               || type -> class == OBERON_TYPE_SET)
        {
                if(type -> size > 4)
                {