From f4aa48e4c1e3b81ccbe3da5c33fdaba3a46081dd Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Fri, 11 Aug 2017 16:38:12 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC?= =?utf8?q?=D0=B0=20=D0=BF=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0=D0=B5=D1=82?= =?utf8?q?=D1=81=D1=8F=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B2=20=D0=BA=D0=BE?= =?utf8?q?=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8F=D1=85=20C?= =?utf8?q?ASE=20=D0=B8=20WITH=20=D0=BD=D0=B5=20=D0=B2=D1=8B=D0=BF=D0=BE?= =?utf8?q?=D0=BB=D0=BD=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D0=BD=D0=B8=20?= =?utf8?q?=D0=BE=D0=B4=D0=BD=D0=BE=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8?= =?utf8?q?=D0=B5=20=D0=B8=20=D0=BD=D0=B5=D1=82=20=D0=B2=D0=B5=D1=82=D0=B2?= =?utf8?q?=D0=B8=20ELSE?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Test.obn | 18 +++++++++++++----- notes | 8 ++++---- rtl/SYSTEM.java | 16 ++++++++++++++++ src/backends/jvm/generator-jvm.c | 13 +++++++++++++ src/generator.h | 1 + src/oberon.c | 8 ++++++++ 6 files changed, 55 insertions(+), 9 deletions(-) diff --git a/Test.obn b/Test.obn index f0552a9..e044594 100644 --- a/Test.obn +++ b/Test.obn @@ -2,14 +2,22 @@ MODULE Test; IMPORT Out; +TYPE + P1 = POINTER TO R1; + P2 = POINTER TO R2; + P3 = POINTER TO R3; + + R1 = RECORD END; + R2 = RECORD (R1) END; + R3 = RECORD (R2) END; + VAR - i : INTEGER; + r : P1; BEGIN + NEW(r); Out.Open; - i := 48; - FOR i := 32 TO i DO - Out.Int(i, 0); Out.Char(' '); + WITH r : P1 DO + Out.String("R1"); Out.Ln; END; - Out.Ln; END Test. diff --git a/notes b/notes index c245ba0..7666610 100644 --- a/notes +++ b/notes @@ -1,5 +1,4 @@ -- Сделать проверку повторов в CASE и выполнять прирывание при отсутствии ELSE. -- Сделать выполнение прерывания при отсутствии ELSE в операторе WITH. +- Сделать проверку повторов в CASE. - Сделать нормальную проверку наличия RETURN. - Нужно проверить правила совместимости типов (Приложение A). @@ -14,8 +13,6 @@ - JVM: Импортируемые модули не инициализируются - JVM: Не реализовано сравнение строк. -- JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур. - Как минимум нужно каждой функции добавлять фрейм к параметрам (динамическая связь?) - Уточнить как должна работать проверка импорта на чтение. (8.1) - Уточнить результат оператора "/" (8.2.2) @@ -27,3 +24,6 @@ - Нет проверок переполнения в компилтайме. Возможно можно заюзать это: https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html + +- JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур. + Как минимум нужно каждой функции добавлять фрейм к параметрам (динамическая связь?) diff --git a/rtl/SYSTEM.java b/rtl/SYSTEM.java index 38f4886..44e1cc3 100644 --- a/rtl/SYSTEM.java +++ b/rtl/SYSTEM.java @@ -43,4 +43,20 @@ public class SYSTEM { assert x : n; } + + public static void TRAP(long n) + { + if(n == -1) + { + throw new RuntimeException("CASE TRAP"); + } + else if(n == -2) + { + throw new RuntimeException("WITH TRAP"); + } + else + { + throw new RuntimeException("TRAP CODE " + n); + } + } } diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 4011965..bb11231 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -1687,6 +1687,19 @@ oberon_generate_assert_n(oberon_context_t * ctx, oberon_expr_t * cond, int64_t n jvm_generate(p, 1 + 2, 0, "invokestatic SYSTEM/ASSERT(ZJ)V"); } +void +oberon_generate_trap(oberon_context_t * ctx, int64_t n) +{ + gen_module_t * m; + gen_proc_t * p; + + m = ctx -> mod -> gen_mod; + p = m -> class -> p; + + jvm_generate_push_int_size(p, n, 8); + jvm_generate(p, 2, 0, "invokestatic SYSTEM/TRAP(J)V"); +} + void oberon_generate_halt(oberon_context_t * ctx, int64_t n) { diff --git a/src/generator.h b/src/generator.h index bc502cc..80bab13 100644 --- a/src/generator.h +++ b/src/generator.h @@ -41,5 +41,6 @@ void oberon_generate_assign(oberon_context_t * ctx, oberon_expr_t * src, oberon_ void oberon_generate_copy(oberon_context_t * ctx, oberon_expr_t * src, oberon_expr_t * dst); void oberon_generate_assert_n(oberon_context_t * ctx, oberon_expr_t * cond, int64_t n); void oberon_generate_assert(oberon_context_t * ctx, oberon_expr_t * cond); +void oberon_generate_trap(oberon_context_t * ctx, int64_t n); void oberon_generate_halt(oberon_context_t * ctx, int64_t n); void oberon_generate_return(oberon_context_t * ctx, oberon_expr_t * expr); diff --git a/src/oberon.c b/src/oberon.c index 59a5c3d..f67d392 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -3443,6 +3443,10 @@ oberon_case_statement(oberon_context_t * ctx) oberon_assert_token(ctx, ELSE); oberon_statement_seq(ctx); } + else + { + oberon_generate_trap(ctx, -1); + } oberon_generate_label(ctx, end); oberon_assert_token(ctx, END); @@ -3509,6 +3513,10 @@ oberon_with_statement(oberon_context_t * ctx) oberon_assert_token(ctx, ELSE); oberon_statement_seq(ctx); } + else + { + oberon_generate_trap(ctx, -2); + } oberon_generate_label(ctx, end); oberon_assert_token(ctx, END); -- 2.29.2