From 75d0fd92a5342358f37ed9369ccce9355273e51a Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Sat, 12 Aug 2017 17:41:39 +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=BE=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD?= =?utf8?q?=D0=B8=D0=B5=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Test.obn | 26 ++++++++++++++++++-------- Test10.obn | 25 +++++++++++++++++++++++++ notes | 5 +---- obn-run-tests.sh | 1 + rtl/SYSTEM.java | 12 ++++++++++++ src/backends/jvm/generator-jvm.c | 13 +++++++++++++ src/oberon-type-compat.c | 14 ++------------ 7 files changed, 72 insertions(+), 24 deletions(-) create mode 100644 Test10.obn diff --git a/Test.obn b/Test.obn index 6713226..4bde081 100644 --- a/Test.obn +++ b/Test.obn @@ -1,13 +1,23 @@ MODULE Test; -VAR - i : INTEGER; - f : REAL; - d : LONGREAL; +IMPORT Out; BEGIN - i := 5 DIV 3; - f := 5 / 3; - d := 5 / 3.0; - d := 5 / 3.0D0; + IF "abc" = "abc" THEN + Out.String("Equal abc = abc"); Out.Ln; + ELSE + Out.String("WAT: MUST BE abc = abc"); Out.Ln; + END; + + IF "cba" > "abc" THEN + Out.String("Great cba > abc"); Out.Ln; + ELSE + Out.String("WAT: MUST BE cba = abc"); Out.Ln; + END; + + IF "abc" < "bc" THEN + Out.String("Less abc < bc"); Out.Ln; + ELSE + Out.String("WAT: MUST BE abc < bc"); Out.Ln; + END; END Test. diff --git a/Test10.obn b/Test10.obn new file mode 100644 index 0000000..7b4b811 --- /dev/null +++ b/Test10.obn @@ -0,0 +1,25 @@ +MODULE Test10; + +IMPORT Out; + +BEGIN + IF "abc" = "abc" THEN + Out.String("Equal abc = abc"); Out.Ln; + ELSE + Out.String("WAT: MUST BE abc = abc"); Out.Ln; + END; + + IF "cba" > "abc" THEN + Out.String("Great cba > abc"); Out.Ln; + ELSE + Out.String("WAT: MUST BE cba = abc"); Out.Ln; + END; + + IF "abc" < "bc" THEN + Out.String("Less abc < bc"); Out.Ln; + ELSE + Out.String("WAT: MUST BE abc < bc"); Out.Ln; + END; +END Test10. + +Проверка строк. diff --git a/notes b/notes index 31c1a4d..8de8906 100644 --- a/notes +++ b/notes @@ -1,20 +1,17 @@ +- Не реализована свёртка констант - Сделать проверку повторов в CASE. - Сделать нормальную проверку наличия RETURN. -- Нужно проверить правила совместимости типов (Приложение A). - Нет функций ASH CAP CHR ENTIER LEN LONG ODD ORD SHORT - Нет процедур DEC EXCL INC INCL - Нет счёта строк / столбцов - Нет процедур привязанных к типм -- Не реализована свёртка констант - Нужно просмотреть Дубовые требования. - JVM: Импортируемые модули не инициализируются -- JVM: Не реализовано сравнение строк. - Уточнить как должна работать проверка импорта на чтение. (8.1) -- Уточнить результат оператора "/" (8.2.2) - Примеры -5 DIV 3 и -5 MOD 3 работают не так как в (8.2.2) Нужен другой тип округления? diff --git a/obn-run-tests.sh b/obn-run-tests.sh index da13a65..f9c6897 100755 --- a/obn-run-tests.sh +++ b/obn-run-tests.sh @@ -38,3 +38,4 @@ maketest Test6 maketest Test7 maketest Test8 maketest Test9 +maketest Test10 diff --git a/rtl/SYSTEM.java b/rtl/SYSTEM.java index 44e1cc3..68f82bd 100644 --- a/rtl/SYSTEM.java +++ b/rtl/SYSTEM.java @@ -21,14 +21,26 @@ public class SYSTEM { int len_x = LEN(x); int len_v = v.length - 1; + int len = (len_x < len_v) ? (len_x) : (len_v); for(int i = 0; i < len; i++) { v[i] = x[i]; } + v[len] = 0; } + public static int STRCMP(byte[] a, byte[] b) + { + int i = 0; + while(a[i] != 0 && a[i] == b[i]) + { + i += 1; + } + return a[i] - b[i]; + } + public static void HALT(long n) { System.exit((int) n); diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 21ad4db..189d8d2 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -1304,6 +1304,19 @@ jvm_generate_compare_op(gen_proc_t * p, oberon_type_t * t, int op) jvm_generate(p, 2 * cell_size, 1, "%ccmp%c", prefix, fop); jvm_generate(p, 1, 1, "if%s L%i", cmpop, label_true); } + else if(prefix == 'a') + { + if(t -> class == OBERON_TYPE_STRING + || (t -> class == OBERON_TYPE_POINTER && t -> base -> class == OBERON_TYPE_CHAR)) + { + jvm_generate(p, 2, 1, "invokestatic SYSTEM/STRCMP([B[B)I"); + jvm_generate(p, 1, 0, "if%s L%i", cmpop, label_true); + } + else + { + jvm_generate(p, 1, 0, "if_acmp%s L%i", cmpop, label_true); + } + } else { jvm_generate(p, 2 * cell_size, 0, "if_%ccmp%s L%i", prefix, cmpop, label_true); diff --git a/src/oberon-type-compat.c b/src/oberon-type-compat.c index 6c3b698..60b37c4 100644 --- a/src/oberon-type-compat.c +++ b/src/oberon-type-compat.c @@ -485,14 +485,9 @@ oberon_get_longer_type(oberon_context_t * ctx, oberon_type_t * a, oberon_type_t { return a; } - else if(oberon_incluses_type(b, a)) - { - return b; - } else { - oberon_error(ctx, "oberon_get_longer_type: error"); - return NULL; + return b; } } @@ -504,13 +499,8 @@ oberon_get_longer_real_type(oberon_context_t * ctx, oberon_type_t * a, oberon_ty { return ctx -> real_type; } - else if(oberon_is_real_type(result)) - { - return result; - } else { - oberon_error(ctx, "oberon_get_longer_real_type: error"); - return NULL; + return result; } } -- 2.29.2