From: DeaDDooMER Date: Fri, 11 Aug 2017 13:38:12 +0000 (+0300) Subject: Программа прерывается если в конструкциях CASE и WITH не выполняется ни одно условие... X-Git-Url: https://deadsoftware.ru/gitweb?p=dsw-obn.git;a=commitdiff_plain;h=f4aa48e4c1e3b81ccbe3da5c33fdaba3a46081dd Программа прерывается если в конструкциях CASE и WITH не выполняется ни одно условие и нет ветви ELSE --- 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);