summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: c535b4b)
raw | patch | inline | side by side (parent: c535b4b)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Fri, 11 Aug 2017 13:38:12 +0000 (16:38 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Fri, 11 Aug 2017 13:38:12 +0000 (16:38 +0300) |
Test.obn | patch | blob | history | |
notes | patch | blob | history | |
rtl/SYSTEM.java | patch | blob | history | |
src/backends/jvm/generator-jvm.c | patch | blob | history | |
src/generator.h | patch | blob | history | |
src/oberon.c | patch | blob | history |
diff --git a/Test.obn b/Test.obn
index f0552a93a06abbaed7841faf482aae3f99251f7f..e0445949bf94c9233425839d2dfd602e22e70243 100644 (file)
--- a/Test.obn
+++ b/Test.obn
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.
index c245ba0cbb6003961504531c4a851f75f24b4641..7666610617d8ee36ed601dba336991d21b1cba0a 100644 (file)
--- a/notes
+++ b/notes
-- Сделать проверку повторов в CASE и выполнять прирывание при отсутствии ELSE.
-- Сделать выполнение прерывания при отсутствии ELSE в операторе WITH.
+- Сделать проверку повторов в CASE.
- Сделать нормальную проверку наличия RETURN.
- Нужно проверить правила совместимости типов (Приложение A).
- JVM: Импортируемые модули не инициализируются
- JVM: Не реализовано сравнение строк.
-- JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур.
- Как минимум нужно каждой функции добавлять фрейм к параметрам (динамическая связь?)
- Уточнить как должна работать проверка импорта на чтение. (8.1)
- Уточнить результат оператора "/" (8.2.2)
- Нет проверок переполнения в компилтайме.
Возможно можно заюзать это:
https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html
+
+- JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур.
+ Как минимум нужно каждой функции добавлять фрейм к параметрам (динамическая связь?)
diff --git a/rtl/SYSTEM.java b/rtl/SYSTEM.java
index 38f488694a9b8996766edfa36d342f7a00b33a3c..44e1cc321a594c4adb723c82b35c58b07dbe6e33 100644 (file)
--- a/rtl/SYSTEM.java
+++ b/rtl/SYSTEM.java
{
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)
{
diff --git a/src/generator.h b/src/generator.h
index bc502cc1a784b4de25845e97549e971df26ae362..80bab13d0c270e3436effea08c95cd3615ea0f6d 100644 (file)
--- a/src/generator.h
+++ b/src/generator.h
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 59a5c3d5fa7f6f11dc9e65e6b1974f59fca12770..f67d3927dfdb0d72cbd620aeea0f4f606901376b 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
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);
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);