From eaa8fd70cad0ba4e5ce8ab219d6964b47f647ec6 Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Sun, 30 Jul 2017 14:06:25 +0300 Subject: [PATCH] =?utf8?q?JVM:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?utf8?q?=D0=B5=D0=BD=D0=B0=20=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD?= =?utf8?q?=D0=B0=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?utf8?q?=D0=B8=D1=8F=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=20Out?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- jvm_test.sh | 2 ++ notes | 7 +++++-- rtl/Out.java | 24 ++++++++++++++++++++++++ src/backends/jvm/generator-jvm.c | 2 +- src/test.c | 31 +++++++++++++++++++++---------- 5 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 rtl/Out.java diff --git a/jvm_test.sh b/jvm_test.sh index 6dcc9ad..0c94910 100755 --- a/jvm_test.sh +++ b/jvm_test.sh @@ -10,6 +10,8 @@ mkdir -p classes javac -d classes Launcher.java jasmin -d classes *.j +javac -d classes rtl/*.java + # -a -- for asm as comments jad -o -b -noinner classes/* diff --git a/notes b/notes index 3cc0297..2cfcb16 100644 --- a/notes +++ b/notes @@ -4,10 +4,13 @@ R2 = RECORD r : R1 END; R1 = RECORD END; *) +- Нужно изменить передачу информации о вызываемой процедуре в MODE_CALL + На данный момент конкретная процедура передаётся в поле var, вместо parent + Что не позволяет делать процедуры-переменные в полях записей, массивах и т.д. +- Нужны средства создания биндингов. Хотя бы как заглушки для модулей. - -- нет символов и строк - нужен автокаст int -> real для DIV. Да и вообще каст типов. +- нет символов и строк - нету операторов if, while и т.д. diff --git a/rtl/Out.java b/rtl/Out.java new file mode 100644 index 0000000..ca773d2 --- /dev/null +++ b/rtl/Out.java @@ -0,0 +1,24 @@ +import java.lang.System; + +public class Out +{ + public static void Open() + { + + } + + public static void Int(int i, int n) + { + System.out.print(i); + } + + public static void Real(float x, int n) + { + System.out.print(x); + } + + public static void Ln() + { + System.out.println(); + } +} diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index f0768d8..497b99e 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -1188,7 +1188,7 @@ jvm_generate_call_proc(gen_proc_t * p, oberon_expr_t * desig) void oberon_generate_call_proc(oberon_context_t * ctx, oberon_expr_t * desig) { - jvm_generate_call_proc(ctx -> gen_context -> current_m -> class -> p, desig); + jvm_generate_call_proc(ctx -> mod -> gen_mod -> class -> p, desig); } void diff --git a/src/test.c b/src/test.c index 18417ba..5939fb6 100644 --- a/src/test.c +++ b/src/test.c @@ -7,6 +7,7 @@ static char source_test[] = "(* Main module *)" "MODULE Test;" + "IMPORT Out;" "TYPE" " P = PROCEDURE;" " F = PROCEDURE (x : INTEGER) : INTEGER;" @@ -29,21 +30,31 @@ static char source_test[] = " f := Pow;" " i := f(7);" " p;" + " Out.Open;" + " Out.Int(i, 0); Out.Ln;" + " Out.Int(666, 0); Out.Ln;" "END Test." ; +// PROCEDURE Char* (ch : CHAR); +// PROCEDURE String* (str : ARRAY OF CHAR); +// PROCEDURE Int* (i, n : LONGINT); // Должно быть в таком виде +// PROCEDURE LongReal* (x : LONGREAL; n : INTEGER); + static char source_out[] = "MODULE Out;" -// "(* Interface to outer program ;) *)" -// "VAR" -// " Open- : PROCEDURE;" -// " Char- : PROCEDURE(ch : CHAR);" -// " String- : PROCEDURE(str : ARRAY OF CHAR)" -// " Int- : PROCEDURE(i, n : LONGINT);" -// " Int- : PROCEDURE(i, n : INTEGER);" -// " Real- : PROCEDURE(x : REAL; n : INTEGER);" -// " LongReal- : PROCEDURE(x : LONGREAL; n : INTEGER);" -// " Ln- : PROCEDURE;" + " PROCEDURE Open*;" + " END Open;" + "" + " PROCEDURE Int*(i, n : INTEGER);" + " END Int;" + "" + " PROCEDURE Real*(x : REAL; n : INTEGER);" + " END Real;" + "" + " PROCEDURE Ln*;" + " END Ln;" + "" "END Out." ; -- 2.29.2