X-Git-Url: https://deadsoftware.ru/gitweb?p=dsw-obn.git;a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm.c;h=84ebe512efcdb595a9c079f1bbc3d02b68cd0f26;hp=99a4673199d8e432ddb0c98c4e0f397426625cff;hb=e8f94e8772c0eaa4fb7f0e6b9f892f014d3423df;hpb=3c5fc198fb0f72bd8ec70aef8f2b4987bb702f79 diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 99a4673..84ebe51 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -208,7 +208,9 @@ jvm_generate_label(gen_proc_t * p, int label_id) static void jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type) { + int dim; char * cname; + char * desc; switch(type -> class) { @@ -217,7 +219,7 @@ jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type) case OBERON_TYPE_PROCEDURE: case OBERON_TYPE_REAL: case OBERON_TYPE_POINTER: - /* ничего не надо делать при статической инициализации */ + gen_error("jvm_generate_new_static: static alocation not allowed"); break; case OBERON_TYPE_RECORD: cname = jvm_get_class_full_name(type); @@ -226,7 +228,15 @@ jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type) jvm_generate(p, 1, 0, "invokespecial %s/()V", cname); break; case OBERON_TYPE_ARRAY: - gen_error("jvm_generate_new_static: TODO array"); + dim = 0; + desc = jvm_get_descriptor(type); + while(type -> class == OBERON_TYPE_ARRAY) + { + dim += 1; + jvm_generate_push_int(p, type -> size); + type = type -> base; + } + jvm_generate(p, dim, 1, "multianewarray %s %i", desc, dim); break; default: gen_error("jvm_generate_new_static: unk type class %i", type -> class); @@ -723,7 +733,12 @@ push_item(gen_proc_t * p, oberon_item_t * item) jvm_generate_call_proc(p, (oberon_expr_t *) item); break; case MODE_INDEX: - gen_error("push_item: TODO index"); + ; + char postfix = jvm_get_postfix(item -> result); + int cell_size = jvm_cell_size_for_postfix(postfix); + push_item(p, item -> parent); + push_expr(p, item -> args); + jvm_generate(p, 1 + 1, cell_size, "%caload", postfix); break; case MODE_FIELD: push_item(p, item -> parent); @@ -770,7 +785,7 @@ static void jvm_generate_abs(gen_proc_t * p, char prefix) { char t = jvm_get_type_of_prefix(prefix); - int cell_size = jvm_cell_size_for_prefix(prefix); + int cell_size = jvm_cell_size_for_postfix(prefix); jvm_generate(p, cell_size, cell_size, "invokestatic java/lang/Math/abs(%c)%c", t, t); } @@ -781,7 +796,7 @@ jvm_generate_compare_op(gen_proc_t * p, char prefix, int op) int label_done = jvm_new_label_id(p); char * label_name_true = jvm_get_label_name(label_true); char * label_name_done = jvm_get_label_name(label_done); - int cell_size = 2 * jvm_cell_size_for_prefix(prefix); + int cell_size = 2 * jvm_cell_size_for_postfix(prefix); assert(prefix == 'i' || prefix == 'a'); @@ -822,7 +837,7 @@ jvm_generate_compare_op(gen_proc_t * p, char prefix, int op) static void jvm_generate_operator(gen_proc_t * p, char prefix, int op) { - int cell_size = jvm_cell_size_for_prefix(prefix); + int cell_size = jvm_cell_size_for_postfix(prefix); switch(op) { case OP_UNARY_MINUS: @@ -989,7 +1004,13 @@ store_expr(gen_proc_t * p, oberon_expr_t * dst, oberon_expr_t * src) jvm_generate_store(p, src -> result, item -> var -> gen_var); break; case MODE_INDEX: - gen_error("store_expr: TODO index"); + ; + char postfix = jvm_get_postfix(src -> result); + int cell_size = jvm_cell_size_for_postfix(postfix); + push_item(p, item -> parent); + push_expr(p, item -> args); + push_expr(p, src); + jvm_generate(p, 1 + 1 + cell_size, 0, "%castore", postfix); break; case MODE_FIELD: push_item(p, item -> parent); @@ -1002,52 +1023,6 @@ store_expr(gen_proc_t * p, oberon_expr_t * dst, oberon_expr_t * src) } } -/* -static void -store_expr(gen_proc_t * p, oberon_expr_t * dst, oberon_expr_t * src) -{ - assert(dst -> is_item); - oberon_item_t * item = (oberon_item_t *) dst; - - int cell_size = jvm_cell_size_for_type(src -> result); - - char prefix; - switch(item -> mode) - { - case MODE_VAR: - push_expr(p, src); - if(item -> var -> local) - { - int reg = item -> var -> gen_var -> reg; - prefix = jvm_get_prefix(item -> result); - jvm_generate(p, cell_size, 0, "%cstore %i", prefix, reg); - } - else - { - char * fullname = jvm_get_field_full_name(item -> var); - char * desc = jvm_get_descriptor(item -> result); - jvm_generate(p, cell_size, 0, "putstatic %s %s", fullname, desc); - } - break; - case MODE_INDEX: - gen_error("store_expr: TODO index"); - break; - case MODE_FIELD: - { - char * fullname = jvm_get_field_full_name(item -> var); - char * desc = jvm_get_descriptor(item -> result); - push_item(p, item -> parent); - push_expr(p, src); - jvm_generate(p, 1 + cell_size, 0, "putfield %s %s", fullname, desc); - } - break; - default: - gen_error("store_expr: unk mode %i", item -> mode); - break; - } -} -*/ - void oberon_generate_assign(oberon_context_t * ctx, oberon_expr_t * src, oberon_expr_t * dst) {