summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: d25fb65)
raw | patch | inline | side by side (parent: d25fb65)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Sat, 12 Aug 2017 14:41:39 +0000 (17:41 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Sat, 12 Aug 2017 14:41:39 +0000 (17:41 +0300) |
Test.obn | patch | blob | history | |
Test10.obn | [new file with mode: 0644] | patch | blob |
notes | patch | blob | history | |
obn-run-tests.sh | patch | blob | history | |
rtl/SYSTEM.java | patch | blob | history | |
src/backends/jvm/generator-jvm.c | patch | blob | history | |
src/oberon-type-compat.c | patch | blob | history |
diff --git a/Test.obn b/Test.obn
index 67132268d6a753e3cfdc990ac2dec0eaed6e1670..4bde081725ba53658bd7868205734120600492d7 100644 (file)
--- a/Test.obn
+++ b/Test.obn
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
--- /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.
+
+Проверка строк.
index 31c1a4d0bdaece4fa2e013ab1d837896e17730af..8de8906f0b795a526b7ab8a77cc76eb1ed72f431 100644 (file)
--- a/notes
+++ b/notes
+- Не реализована свёртка констант
- Сделать проверку повторов в 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 da13a65b4dd5b8f39e4294220dcb57a9257d4a01..f9c6897afd21161e319c43176b2eaa406d553189 100755 (executable)
--- a/obn-run-tests.sh
+++ b/obn-run-tests.sh
maketest Test7
maketest Test8
maketest Test9
+maketest Test10
diff --git a/rtl/SYSTEM.java b/rtl/SYSTEM.java
index 44e1cc321a594c4adb723c82b35c58b07dbe6e33..68f82bd0983c3ee348507e7903023dc63318cf8c 100644 (file)
--- a/rtl/SYSTEM.java
+++ b/rtl/SYSTEM.java
{
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)
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)
--- 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;
}
}