DEADSOFTWARE

JVM: Добавлено сравнение строк
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Sat, 12 Aug 2017 14:41:39 +0000 (17:41 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Sat, 12 Aug 2017 14:41:39 +0000 (17:41 +0300)
Test.obn
Test10.obn [new file with mode: 0644]
notes
obn-run-tests.sh
rtl/SYSTEM.java
src/backends/jvm/generator-jvm.c
src/oberon-type-compat.c

index 67132268d6a753e3cfdc990ac2dec0eaed6e1670..4bde081725ba53658bd7868205734120600492d7 100644 (file)
--- 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 (file)
index 0000000..7b4b811
--- /dev/null
@@ -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 31c1a4d0bdaece4fa2e013ab1d837896e17730af..8de8906f0b795a526b7ab8a77cc76eb1ed72f431 100644 (file)
--- 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)
     Нужен другой тип округления?
 
index da13a65b4dd5b8f39e4294220dcb57a9257d4a01..f9c6897afd21161e319c43176b2eaa406d553189 100755 (executable)
@@ -38,3 +38,4 @@ maketest Test6
 maketest Test7
 maketest Test8
 maketest Test9
+maketest Test10
index 44e1cc321a594c4adb723c82b35c58b07dbe6e33..68f82bd0983c3ee348507e7903023dc63318cf8c 100644 (file)
@@ -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);
index 21ad4db6c1a2a9aa3dcc2cb24b4088f2c2fafc93..189d8d275421b67a4fc2081d664c37ccf4149fc7 100644 (file)
@@ -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);
index 6c3b698cbb88e41066ba632d23608ef70145d06a..60b37c40e76895feb562ccfda9930c8462cd8440 100644 (file)
@@ -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;
        }
 }