DEADSOFTWARE

JVM: Реализованы VAR-параметры
[dsw-obn.git] / src / backends / jvm / generator-jvm-basic.c
index bcd82a25476803cbcd4aca6e8aa0ecf9f4c24934..277940ce17b58fb18f46ee630aa162c2a250c62a 100644 (file)
@@ -126,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;
@@ -173,13 +193,14 @@ jvm_get_prefix(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:
                        return (size <= 4) ? ('f') : ('d');
                        break;
                default:
-                       gen_error("jvm_get_prefix: wat");
+                       gen_error("jvm_get_prefix: wat %i", type -> class);
                        return '!';
                        break;
        }
@@ -239,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:
@@ -347,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;
        }