DEADSOFTWARE

Исправлено обращение к полям при использовании каста. Процедуры INC/DEC больше не...
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Thu, 31 Aug 2017 15:46:39 +0000 (18:46 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Thu, 31 Aug 2017 15:46:39 +0000 (18:46 +0300)
notes
obn-run-tests.sh
src/backends/jvm/generator-jvm.c
src/oberon-internals.h
src/oberon.c
tests/Test25.obn [new file with mode: 0644]
tests/Test26.obn [new file with mode: 0644]

diff --git a/notes b/notes
index bdd35e2be8039ea3715369b5d9969b9c962661d5..d2a263ff7f8885bd505ca0e6a86d125cda869834 100644 (file)
--- a/notes
+++ b/notes
@@ -1,6 +1,7 @@
 - Jasmin создаёт ошибку в float константах, надо как-то порешать.
 - Нужно делать проверку границ при касте индекса массива с типом HUGEINT
 
+- Секции CONST/TYPE/VAR сейчас нельзя повторять (что не по стандарту)
 - Нужно передавать информацию о файле и строках в кодогенератор.
 - Нет процедур привязанных к типм (10.2)
 - Не полная реализация модуля Files 
index 813e6e59970c97932769cd4d01c9cdeb3c4b46d4..a5ea198e6c09ce5ef57e8f2778aa5da9de9e63af 100755 (executable)
@@ -97,3 +97,5 @@ makecomp Test23A
 makefail Test23B
 
 maketest Test24
+maketest Test25
+maketest Test26
index 79da2b9f68fac681b5624a512508c7228702eeb1..48db18000ba1a65e2c651d59f7f0f0afe0482f53 100644 (file)
@@ -1351,6 +1351,10 @@ push_item(gen_proc_t * p, oberon_item_t * item)
                        jvm_generate_array_len(p, item -> integer);
                        jvm_generate_cast_prefix(p, 'i', jvm_get_postfix(item -> result));
                        break;
+               case MODE_AS:
+                       push_item(p, item -> parent);
+                       jvm_generate_cast_type(p, item -> parent -> result, item -> result);
+                       break;
                default:
                        gen_error("push_item: unk mode %i", item -> mode);
                        break;
index d4f3cf211f02eb8411f06093b19043b1cfb8d1b1..d9f311911b94022a2ca7a7a7d6fdb08c869c33f2 100644 (file)
@@ -208,7 +208,8 @@ enum oberon_mode_kind
        MODE_TYPE,
        MODE_SET,
        MODE_LEN,
-       MODE_SYSBYTE
+       MODE_SYSBYTE,
+       MODE_AS
 };
 
 enum oberon_operator_kind
index 83f39cd2cebea39ac30fd54f1125ba11151bb045..1b7f5d9b19315aa614ef96e1665f21c11054da9b 100644 (file)
@@ -1088,6 +1088,12 @@ oberon_cast_expr(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * p
                cast = oberon_new_item(MODE_CHAR, ctx -> char_type, true);
                cast -> item.integer = expr -> item.string[0];
        }
+       else if(oberon_is_record_type(pref) || oberon_is_pointer_to_record(pref))
+       {
+               assert(expr -> is_item);
+               cast = oberon_new_item(MODE_AS, pref, expr -> read_only);
+               cast -> item.parent = (oberon_item_t *) expr;
+       }
        else if(!oberon_is_some_types(expr -> result, pref))
        {
                cast = oberon_new_operator(OP_CAST, pref, expr, NULL);
@@ -3940,7 +3946,6 @@ oberon_make_inc_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
        {
                step = list_args -> next;
                oberon_check_src(ctx, step);
-               oberon_check_const(ctx, step);
                if(!oberon_is_integer_type(step -> result))
                {
                        oberon_error(ctx, "expect integer");
@@ -4055,7 +4060,6 @@ oberon_make_dec_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
        {
                step = list_args -> next;
                oberon_check_src(ctx, step);
-               oberon_check_const(ctx, step);
                if(!oberon_is_integer_type(step -> result))
                {
                        oberon_error(ctx, "expect integer");
diff --git a/tests/Test25.obn b/tests/Test25.obn
new file mode 100644 (file)
index 0000000..87d50c2
--- /dev/null
@@ -0,0 +1,21 @@
+MODULE Test25;
+
+TYPE
+  X = POINTER TO XDesc;
+  XDesc = RECORD END;
+
+  Y = POINTER TO RECORD (XDesc) x : INTEGER END;
+
+VAR
+  x : X;
+  y : Y;
+  i : INTEGER;
+
+BEGIN
+  NEW(y);
+  x := y;
+  i := y.x;
+  i := x(Y).x;
+END Test25.
+
+Тест приведения типа с обращением к полю.
diff --git a/tests/Test26.obn b/tests/Test26.obn
new file mode 100644 (file)
index 0000000..8fb9997
--- /dev/null
@@ -0,0 +1,11 @@
+MODULE Test26;
+
+VAR
+  x : SHORTINT;
+  y : LONGINT;
+
+BEGIN
+  y := x + SHORT(y);
+END Test26.
+
+Тест приведения типа.