From 10288ed60f876a14746b17976fd9d84ed58042cc Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Tue, 22 Aug 2017 20:28:48 +0300 Subject: [PATCH] =?utf8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?utf8?q?=D0=BD=D0=BE=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD?= =?utf8?q?=D0=B8=D0=B5=20=D1=82=D0=B8=D0=BF=D0=B0=20long=20->=20char;=20?= =?utf8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20?= =?utf8?q?=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?utf8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20=D0=B1=D0=B0=D0=B7?= =?utf8?q?=D1=8B=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D1=8F=D0=B5=D0=BC?= =?utf8?q?=D0=BE=D0=B3=D0=BE=20=D1=82=D0=B8=D0=BF=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Test.obn | 31 +++++++++++++++----------- src/backends/jvm/generator-jvm-basic.c | 2 +- src/backends/jvm/generator-jvm.c | 18 +++++++++++++++ 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/Test.obn b/Test.obn index b9b14ae..3c862c1 100644 --- a/Test.obn +++ b/Test.obn @@ -1,23 +1,28 @@ MODULE Test; TYPE - Stream* = POINTER TO Handle; - Handle = RECORD END; - - Writer* = RECORD END; - - Printer* = RECORD (Writer) END; + Object = RECORD + mth : PROCEDURE; + END; VAR - s : Stream; - o : Writer; - out : Printer; + p : PROCEDURE; + o, a : Object; + +PROCEDURE X; +END X; -PROCEDURE SetStream(VAR w : Writer; stream : Stream); +PROCEDURE Z(VAR g : Object); BEGIN -END SetStream; + g.mth; +END Z; BEGIN - SetStream(o, s); - SetStream(out, s); + p := X; + ASSERT(p # NIL); + o.mth := X; + ASSERT(o.mth # NIL); + a := o; + ASSERT(a.mth # NIL); + Z(a); END Test. diff --git a/src/backends/jvm/generator-jvm-basic.c b/src/backends/jvm/generator-jvm-basic.c index e4c6c15..855a617 100644 --- a/src/backends/jvm/generator-jvm-basic.c +++ b/src/backends/jvm/generator-jvm-basic.c @@ -440,7 +440,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; diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index bf3b07b..681b4df 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -583,6 +583,13 @@ oberon_generator_init_record(oberon_context_t * ctx, oberon_type_t * rec) jvm_generate_var_initialization(p, copy_dst); jvm_generate_var_initialization(p, copy_src); + if(rec -> base) + { + jvm_generate_load(p, copy_dst); + jvm_generate_load(p, copy_src); + jvm_generate_copy_record(p, rec -> base); + } + num = rec -> num_decl; field = rec -> decl; for(int i = 0; i < num; i++) @@ -1197,11 +1204,22 @@ jvm_generate_expr_new_pointer(gen_proc_t * p, oberon_type_t * type, int num, obe static void jvm_generate_cast_prefix(gen_proc_t * p, char prefix, char postfix) { + if((prefix == 'b' || prefix == 's') && (postfix = 'l' || postfix == 'd')) + { + prefix = 'i'; + } + if(prefix == postfix) { return; } + if((prefix == 'l' || prefix == 'd') && (postfix == 'b' || postfix == 's')) + { + jvm_generate(p, 2, 1, "%c2i", prefix); + prefix = 'i'; + } + int from_cell_size = jvm_cell_size_for_postfix(prefix); int to_cell_size = jvm_cell_size_for_postfix(postfix); jvm_generate(p, from_cell_size, to_cell_size, "%c2%c", prefix, postfix); -- 2.29.2