X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm-basic.c;h=865ffdd4177f7625fb1f5fdef57b2f3ba6c0cb39;hb=7bb96abf74bcb31d9a3ecb820b0b6565813bf324;hp=d419abea2de5e88267b44667ccf95d370d08f698;hpb=f89bbec89e4dd5c7cd15954f0c02370fb9127518;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm-basic.c b/src/backends/jvm/generator-jvm-basic.c index d419abe..865ffdd 100644 --- a/src/backends/jvm/generator-jvm-basic.c +++ b/src/backends/jvm/generator-jvm-basic.c @@ -138,12 +138,59 @@ jvm_get_prefix(oberon_type_t * type) return '!'; } +char +jvm_get_postfix(oberon_type_t * type) +{ + int size = type -> size; + switch(type -> class) + { + case OBERON_TYPE_BOOLEAN: + return 'b'; + break; + case OBERON_TYPE_INTEGER: + switch(size) + { + case 1: + return 'b'; + break; + case 2: + return 's'; + break; + case 4: + return 'i'; + break; + case 8: + return 'l'; + break; + default: + gen_error("jvm_get_postfix: int wat"); + break; + } + break; + case OBERON_TYPE_PROCEDURE: + case OBERON_TYPE_ARRAY: + case OBERON_TYPE_RECORD: + case OBERON_TYPE_POINTER: + return 'a'; + break; + case OBERON_TYPE_REAL: + return (size <= 4) ? ('f') : ('d'); + break; + default: + gen_error("jvm_get_postfix: wat"); + break; + } + + return '!'; +} + char * jvm_get_field_full_name(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); @@ -158,6 +205,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) { @@ -234,22 +302,21 @@ jvm_cell_size_for_type(oberon_type_t * type) } int -jvm_cell_size_for_prefix(char prefix) +jvm_cell_size_for_postfix(char postfix) { - switch(prefix) + switch(postfix) { case 'a': case 'b': case 's': case 'i': - case 'z': case 'f': return 1; case 'l': case 'd': return 2; default: - gen_error("jvm_cell_size_for_prefix: unk prefix %c", prefix); + gen_error("jvm_cell_size_for_postfix: unk postfix %c", postfix); } return -666;