X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm-basic.c;h=277940ce17b58fb18f46ee630aa162c2a250c62a;hb=55d9ee92b95dd306ac80fb643ed21d3b733395d7;hp=44046a1506ab27c99e6b78e7178309c684f5e7dd;hpb=51a1ab2543ec5c221d4a3a9ab89968ae7dd39981;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm-basic.c b/src/backends/jvm/generator-jvm-basic.c index 44046a1..277940c 100644 --- a/src/backends/jvm/generator-jvm-basic.c +++ b/src/backends/jvm/generator-jvm-basic.c @@ -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) {