X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm-basic.c;h=033b84227d1eebfb4bbda213e94e19e889229f78;hb=0c29ba1953327a9b476a825d8b9b9d185d544972;hp=24c28b057429313018bf1529c64154c1e2a27825;hpb=ee7fd939ac99201466900fb3983aa90b980da5c3;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm-basic.c b/src/backends/jvm/generator-jvm-basic.c index 24c28b0..033b842 100644 --- a/src/backends/jvm/generator-jvm-basic.c +++ b/src/backends/jvm/generator-jvm-basic.c @@ -7,7 +7,6 @@ #include -#include "../../../include/oberon.h" #include "../../oberon-internals.h" #include "generator-jvm.h" #include "generator-jvm-basic.h" @@ -53,10 +52,11 @@ jvm_get_descriptor(oberon_type_t * type) switch(type -> class) { - case OBERON_TYPE_VOID: + case OBERON_TYPE_NOTYPE: return new_string("V"); break; case OBERON_TYPE_INTEGER: + case OBERON_TYPE_SET: switch(type -> size) { case 1: @@ -76,6 +76,9 @@ jvm_get_descriptor(oberon_type_t * type) break; } break; + case OBERON_TYPE_SYSTEM_BYTE: + return new_string("B"); + break; case OBERON_TYPE_REAL: switch(type -> size) { @@ -125,6 +128,29 @@ 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; + case OBERON_TYPE_SYSTEM_PTR: + return new_string("Ljava/lang/Object;"); + break; default: gen_error("jvm_get_descriptor: unsupported type class %i", type -> class); break; @@ -146,7 +172,10 @@ jvm_get_descriptor_safe(oberon_type_t * type) return jvm_get_class_full_name(type); break; case OBERON_TYPE_ARRAY: - return new_string("A%sX", jvm_get_descriptor_safe(type -> base)); + return new_string("A%s", jvm_get_descriptor_safe(type -> base)); + break; + case OBERON_TYPE_SYSTEM_PTR: + return new_string("SYSPTR"); break; default: return jvm_get_descriptor(type); @@ -162,22 +191,30 @@ jvm_get_prefix(oberon_type_t * type) int size = type -> size; switch(type -> class) { + case OBERON_TYPE_NOTYPE: + return ' '; + break; case OBERON_TYPE_BOOLEAN: case OBERON_TYPE_INTEGER: case OBERON_TYPE_CHAR: + case OBERON_TYPE_SET: + case OBERON_TYPE_SYSTEM_BYTE: 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: + case OBERON_TYPE_NIL: + case OBERON_TYPE_SYSTEM_PTR: 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; } @@ -189,10 +226,14 @@ jvm_get_postfix(oberon_type_t * type) int size = type -> size; switch(type -> class) { + case OBERON_TYPE_NOTYPE: + return ' '; + break; case OBERON_TYPE_BOOLEAN: return 'b'; break; case OBERON_TYPE_INTEGER: + case OBERON_TYPE_SET: switch(size) { case 1: @@ -212,6 +253,9 @@ jvm_get_postfix(oberon_type_t * type) break; } break; + case OBERON_TYPE_SYSTEM_BYTE: + return 'b'; + break; case OBERON_TYPE_CHAR: switch(size) { @@ -236,6 +280,9 @@ jvm_get_postfix(oberon_type_t * type) case OBERON_TYPE_ARRAY: case OBERON_TYPE_RECORD: case OBERON_TYPE_POINTER: + case OBERON_TYPE_STRING: + case OBERON_TYPE_NIL: + case OBERON_TYPE_SYSTEM_PTR: return 'a'; break; case OBERON_TYPE_REAL: @@ -249,17 +296,45 @@ jvm_get_postfix(oberon_type_t * type) return '!'; } +char * +jvm_get_name(oberon_object_t * x) +{ + switch(x -> class) + { + case OBERON_CLASS_VAR: + case OBERON_CLASS_VAR_PARAM: + case OBERON_CLASS_PARAM: + case OBERON_CLASS_FIELD: + return new_string(x -> name); + case OBERON_CLASS_PROC: + if(x -> parent) + { + return new_string("%s$%s", jvm_get_name(x -> parent), x -> name); + } + else + { + return new_string(x -> name); + } + default: + gen_error("jvm_get_name: wat"); + } + + return NULL; +} + char * jvm_get_field_full_name(oberon_object_t * x) { + char * parent; switch(x -> class) { case OBERON_CLASS_VAR: + return new_string("%s/%s", x -> module -> name, jvm_get_name(x)); 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); + return new_string("%s/%s", x -> module -> name, jvm_get_name(x)); + case OBERON_CLASS_FIELD: + parent = jvm_get_class_full_name(x -> parent_type); + return new_string("%s/%s", parent, jvm_get_name(x)); case OBERON_CLASS_MODULE: return new_string(x -> module -> name); default: @@ -306,15 +381,22 @@ jvm_get_class_full_name(oberon_type_t * type) name = new_string("SYSTEM$PROCEDURE"); char * desc; + char * spec; 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++) { + spec = ""; + if(arg -> class == OBERON_CLASS_VAR_PARAM) + { + spec = "VAR"; + } desc = jvm_get_descriptor_safe(arg -> type); - name = new_string("%s%s", name, desc); + name = new_string("%s%s%s", name, spec, desc); arg = arg -> next; } @@ -323,6 +405,9 @@ jvm_get_class_full_name(oberon_type_t * type) rec_id = type -> gen_type -> rec_id; name = new_string("%s$RECORD%i", type -> module -> name, rec_id); break; + case OBERON_TYPE_SYSTEM_PTR: + name = new_string("java/lang/Object"); + break; default: gen_error("jvm_get_class_full_name: unk type class %i", type -> class); break; @@ -331,40 +416,23 @@ jvm_get_class_full_name(oberon_type_t * type) return name; } -char * -jvm_get_procedure_signature(oberon_type_t * proc) -{ - char * signature; - char * desc; - - signature = new_string("("); - - int num = proc -> num_decl; - oberon_object_t * arg = proc -> decl; - for(int i = 0; i < num; i++) - { - desc = jvm_get_descriptor(arg -> type); - signature = new_string("%s%s", signature, desc); - arg = arg -> next; - } - - desc = jvm_get_descriptor(proc -> base); - signature = new_string("%s)%s", signature, desc); - - return signature; -} - 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_NOTYPE) + { + return 0; + } return 1; } @@ -374,6 +442,8 @@ jvm_cell_size_for_postfix(char postfix) { switch(postfix) { + case ' ': + return 0; case 'a': case 'b': case 's': @@ -384,7 +454,7 @@ jvm_cell_size_for_postfix(char postfix) case 'd': return 2; default: - gen_error("jvm_cell_size_for_postfix: unk postfix %c", postfix); + gen_error("jvm_cell_size_for_postfix: unk postfix %c (%i)", postfix, postfix); } return -666; @@ -461,6 +531,8 @@ jvm_get_type_of_prefix(char prefix) { switch(prefix) { + case ' ': + return 'V'; case 'b': return 'B'; case 'c':