X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm-basic.c;h=44046a1506ab27c99e6b78e7178309c684f5e7dd;hb=51a1ab2543ec5c221d4a3a9ab89968ae7dd39981;hp=aad9747f25cbf4d091e86db1f0ea9a3d098753dc;hpb=36c1947b3e98abab25f16a0f1c2679125651fe95;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm-basic.c b/src/backends/jvm/generator-jvm-basic.c index aad9747..44046a1 100644 --- a/src/backends/jvm/generator-jvm-basic.c +++ b/src/backends/jvm/generator-jvm-basic.c @@ -133,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) { @@ -283,14 +306,14 @@ jvm_get_class_full_name(oberon_type_t * type) 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; } @@ -342,6 +365,10 @@ jvm_cell_size_for_type(oberon_type_t * type) return 2; } } + else if(type -> class == OBERON_TYPE_VOID) + { + return 0; + } return 1; }