DEADSOFTWARE

Программа прерывается если в конструкциях CASE и WITH не выполняется ни одно условие...
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 11 Aug 2017 13:38:12 +0000 (16:38 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 11 Aug 2017 13:38:12 +0000 (16:38 +0300)
Test.obn
notes
rtl/SYSTEM.java
src/backends/jvm/generator-jvm.c
src/generator.h
src/oberon.c

index f0552a93a06abbaed7841faf482aae3f99251f7f..e0445949bf94c9233425839d2dfd602e22e70243 100644 (file)
--- 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 c245ba0cbb6003961504531c4a851f75f24b4641..7666610617d8ee36ed601dba336991d21b1cba0a 100644 (file)
--- 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: Не достаточно средств для реализации рефлексии на уровне локальных процедур.
+    Как минимум нужно каждой функции добавлять фрейм к параметрам (динамическая связь?)
index 38f488694a9b8996766edfa36d342f7a00b33a3c..44e1cc321a594c4adb723c82b35c58b07dbe6e33 100644 (file)
@@ -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);
+               }
+       }
 }
index 401196595b08b739401d9e39e82ec6d80c9d2ace..bb1123147706034e75ce660c255861fbc7a20f9f 100644 (file)
@@ -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)
 {
index bc502cc1a784b4de25845e97549e971df26ae362..80bab13d0c270e3436effea08c95cd3615ea0f6d 100644 (file)
@@ -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);
index 59a5c3d5fa7f6f11dc9e65e6b1974f59fca12770..f67d3927dfdb0d72cbd620aeea0f4f606901376b 100644 (file)
@@ -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);