X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm-basic.c;h=bcd82a25476803cbcd4aca6e8aa0ecf9f4c24934;hb=9bcd389a97869b2ab6b1c6fdc35c0f09beab66c5;hp=d092f8e799aa1d38af2f368cb0d5840026fb1329;hpb=961fbb99dcba21ccb737db16c0cdb28d757a2de7;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm-basic.c b/src/backends/jvm/generator-jvm-basic.c index d092f8e..bcd82a2 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: @@ -90,6 +91,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 +134,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 +165,8 @@ 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: @@ -132,10 +178,11 @@ 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; } - - gen_error("jvm_get_prefix: wat"); - return '!'; } char @@ -148,6 +195,7 @@ jvm_get_postfix(oberon_type_t * type) return 'b'; break; case OBERON_TYPE_INTEGER: + case OBERON_TYPE_SET: switch(size) { case 1: @@ -167,6 +215,26 @@ jvm_get_postfix(oberon_type_t * type) 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: @@ -205,6 +273,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) { @@ -213,18 +302,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; } @@ -269,13 +361,19 @@ 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) { return 2; } } + else if(type -> class == OBERON_TYPE_VOID) + { + return 0; + } return 1; }