From 2ad60776b5d39f919e589a6ee51f1d4a0d40b649 Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Sun, 8 Oct 2017 18:25:39 +0300 Subject: [PATCH] =?utf8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?utf8?q?=D1=8B=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B2=20=D0=BE?= =?utf8?q?=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87=D0=BD=D1=83=D1=8E=20=D0=B8?= =?utf8?q?=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8E=20=D0=BA?= =?utf8?q?=D0=BB=D0=B0=D1=81=D1=81=D0=B0=20(=D0=B1=D1=8B=D1=81=D1=82=D1=80?= =?utf8?q?=D0=BE=D1=85=D0=B0=D0=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Test.obn | 18 ++++++++++-------- notes | 1 - src/backends/jvm/generator-jvm.c | 18 ++++++++++++++++++ src/backends/jvm/generator-jvm.h | 1 + src/generator.h | 2 ++ src/oberon.c | 3 +++ 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Test.obn b/Test.obn index 22a2a55..ea2d143 100644 --- a/Test.obn +++ b/Test.obn @@ -1,15 +1,17 @@ MODULE Test; -PROCEDURE A(a : INTEGER); VAR x : INTEGER; -END A; + p : PROCEDURE; -PROCEDURE B(b : SHORTINT); - PROCEDURE A(c : LONGINT); - VAR - y : ARRAY 3 OF INTEGER; - END A; -END B; + PROCEDURE X; + BEGIN + x := 1; + x := 2; + x := 3; + p + END X; +BEGIN + X; END Test. diff --git a/notes b/notes index 0aa5f4e..9ff5af3 100644 --- a/notes +++ b/notes @@ -1,7 +1,6 @@ - Jasmin создаёт ошибку в float константах, надо как-то порешать. - Нужно делать проверку границ при касте индекса массива с типом HUGEINT -- Нужно передавать информацию о файле и строках в кодогенератор. - Нет процедур привязанных к типм (10.2) - Не полная реализация модуля Files * Нет процедур ReadNum WriteNum diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 9cade33..f26c951 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -1988,3 +1988,21 @@ oberon_set_typecheck(oberon_object_t * var, bool enable) var -> gen_var -> forcetype = (enable) ? (var -> type -> gen_type) : (NULL); } +void oberon_set_line(oberon_context_t * ctx, int line) +{ + gen_module_t * m; + gen_proc_t * p; + + m = ctx -> mod -> gen_mod; + if(m != NULL) + { + p = m -> class -> p; + + if(p != NULL) + { + jvm_generate(p, 0, 0, ".line %i", line); + } + + m -> line = line; + } +} diff --git a/src/backends/jvm/generator-jvm.h b/src/backends/jvm/generator-jvm.h index 44f8932..52d59fa 100644 --- a/src/backends/jvm/generator-jvm.h +++ b/src/backends/jvm/generator-jvm.h @@ -104,6 +104,7 @@ struct gen_module_t { struct gen_class * class; int rec_id; + int line; }; struct gen_label_t diff --git a/src/generator.h b/src/generator.h index 2618ec7..03e410e 100644 --- a/src/generator.h +++ b/src/generator.h @@ -48,3 +48,5 @@ void oberon_generate_halt(oberon_context_t * ctx, int64_t n); void oberon_generate_return(oberon_context_t * ctx, oberon_expr_t * expr); void oberon_set_out_directory(oberon_context_t * ctx, const char * path); + +void oberon_set_line(oberon_context_t * ctx, int line); diff --git a/src/oberon.c b/src/oberon.c index 8256647..931a307 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -390,6 +390,7 @@ oberon_init_scaner(oberon_context_t * ctx, oberon_scanner_t * s) ctx -> xloc.col = 1; ctx -> loc = ctx -> xloc; ctx -> c = ctx -> code[ctx -> code_index]; + oberon_set_line(ctx, 1); } static void @@ -721,12 +722,14 @@ oberon_get_lined_char(oberon_context_t * ctx) } ctx -> xloc.line += 1; ctx -> xloc.col = 1; + oberon_set_line(ctx, ctx -> xloc.line); } else if(ctx -> c == 0xA) { oberon_get_char(ctx); ctx -> xloc.line += 1; ctx -> xloc.col = 1; + oberon_set_line(ctx, ctx -> xloc.line); } else { -- 2.29.2