From: DeaDDooMER Date: Tue, 22 Aug 2017 17:28:48 +0000 (+0300) Subject: Исправлено приведение типа long -> char; Исправлено копирование полей базы расширяемо... X-Git-Url: https://deadsoftware.ru/gitweb?p=dsw-obn.git;a=commitdiff_plain;h=10288ed60f876a14746b17976fd9d84ed58042cc Исправлено приведение типа long -> char; Исправлено копирование полей базы расширяемого типа --- 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);