From fef434efd26d259ed8a857e28af092df93282880 Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Fri, 28 Jul 2017 21:22:25 +0300 Subject: [PATCH] =?utf8?q?JVM:=20=D0=9C=D0=BE=D0=B6=D0=BD=D0=BE=20=D1=81?= =?utf8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B4=D0=B8?= =?utf8?q?=D0=BD=D0=B0=D0=BC=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20?= =?utf8?q?=D0=BC=D0=B0=D1=81=D1=81=D0=B8=D0=B2=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/backends/jvm/generator-jvm.c | 39 ++++++++++++++++++++------------ src/test.c | 6 +++++ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 9408eca..cbc834e 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -256,7 +256,7 @@ jvm_generate_label(gen_proc_t * p, int label_id) } static void -jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type); +jvm_generate_new(gen_proc_t * p, oberon_type_t * type, int num); /* * Функция jvm_generate_static_array_initialization генерирует код для @@ -322,7 +322,7 @@ jvm_generate_static_array_initialization(gen_proc_t * p, oberon_type_t * type) { jvm_generate(p, 0, 1, "aload %i", reg_a); jvm_generate(p, 0, 1, "iload %i", reg_i); - jvm_generate_new_static(p, type -> base); + jvm_generate_new(p, type -> base, 0); jvm_generate(p, 3, 0, "aastore"); } else @@ -344,7 +344,7 @@ jvm_generate_static_array_initialization(gen_proc_t * p, oberon_type_t * type) } static void -jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type) +jvm_generate_new(gen_proc_t * p, oberon_type_t * type, int num) { int dim; char * cname; @@ -372,10 +372,21 @@ jvm_generate_new_static(gen_proc_t * p, oberon_type_t * type) desc = jvm_get_descriptor(type); while(base -> class == OBERON_TYPE_ARRAY) { + if(num > 0) + { + assert(base -> size == 0); + num -= 1; + } + else + { + assert(base -> size > 0); + jvm_generate_push_int(p, base -> size); + } dim += 1; - jvm_generate_push_int(p, base -> size); base = base -> base; } + + assert(num == 0); jvm_generate(p, dim, 1, "multianewarray %s %i", desc, dim); if(base -> class == OBERON_TYPE_RECORD) @@ -547,7 +558,7 @@ oberon_generator_init_record(oberon_context_t * ctx, oberon_type_t * rec) || field -> type -> class == OBERON_TYPE_ARRAY) { jvm_generate(p, 0, 1, "aload_0"); - jvm_generate_new_static(p, field -> type); + jvm_generate_new(p, field -> type, 0); jvm_generate_store(p, field -> type, field -> gen_var); } field = field -> next; @@ -660,7 +671,7 @@ oberon_generate_begin_module(oberon_context_t * ctx) if(x -> type -> class == OBERON_TYPE_ARRAY || x -> type -> class == OBERON_TYPE_RECORD) { - jvm_generate_new_static(p, x -> type); + jvm_generate_new(p, x -> type, 0); jvm_generate_store(p, x -> type, x -> gen_var); } } @@ -817,18 +828,18 @@ jvm_push_var(gen_proc_t * p, oberon_object_t * var) } } -static void -jvm_generate_expr_new_static(gen_proc_t * p, oberon_type_t * type, int num, oberon_expr_t * arg) -{ - assert(num == 0); - jvm_generate_new_static(p, type); -} - static void jvm_generate_expr_new_pointer(gen_proc_t * p, oberon_type_t * type, int num, oberon_expr_t * arg) { assert(type -> class == OBERON_TYPE_POINTER); - jvm_generate_expr_new_static(p, type -> base, num, arg); + + for(int i = 0; i < num; i++) + { + push_expr(p, arg); + arg = arg -> next; + } + + jvm_generate_new(p, type -> base, num); } static void diff --git a/src/test.c b/src/test.c index 92223cd..51a1250 100644 --- a/src/test.c +++ b/src/test.c @@ -7,10 +7,16 @@ static char source_test[] = "(* Main module *)" "MODULE Test;" + "TYPE" + " Rec = POINTER TO RecDesc;" + " RecDesc = RECORD x : INTEGER; END;" "VAR" " g : ARRAY 4 OF INTEGER;" " r : RECORD x : INTEGER; END;" + " a : POINTER TO ARRAY OF ARRAY OF RecDesc;" "BEGIN" + " NEW(a, 10, 10);" + " a[9, 9].x := 666;" " g[3] := 4;" " r.x := 4546;" "END Test." -- 2.29.2