DEADSOFTWARE

Исправлена инициализация записей
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Thu, 10 Aug 2017 10:16:27 +0000 (13:16 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Thu, 10 Aug 2017 10:16:27 +0000 (13:16 +0300)
Test.obn
Test4.obn
notes
obn-dev-test.sh
src/backends/jvm/generator-jvm.c
src/oberon.c

index 98ac0e23e370819a8b9e96db5387e7f64d97eb65..363783e2baa8fa206a03e87c99ad827c66b77d6d 100644 (file)
--- a/Test.obn
+++ b/Test.obn
@@ -1,12 +1,17 @@
 MODULE Test;
 
+TYPE
+  R1 = RECORD END;
+(*  R2 = RECORD (R1) END; *)
+  R3 = RECORD END;
+
 VAR
-  a : POINTER TO RECORD END;
-  b : POINTER TO ARRAY OF INTEGER;
-  c : PROCEDURE;
+(*
+  a : R1;
+  b : R2;
+*)
+  c : R3;
 
 BEGIN
-  a := NIL;
-  b := NIL;
-  c := NIL;
+(*  a := b; *)
 END Test.
index 132f8641208ae0aa13509f5951e2cab115ed6258..fba34f99c879d75c0881863e0f0bb934e4d87e82 100644 (file)
--- a/Test4.obn
+++ b/Test4.obn
@@ -10,3 +10,5 @@ BEGIN
   b := NIL;
   c := NIL;
 END Test4.
+
+Проверка присвоения NIL
diff --git a/notes b/notes
index 1e0a9e58c2a1176e3c9b99fc2bc23b97da5523a2..762ef894f1f8438fe3aa1206d83fdf65fdd832ad 100644 (file)
--- a/notes
+++ b/notes
@@ -1,3 +1,5 @@
+- Уточнить как должна работать проверка импорта на чтение. (8.1)
+
 - Нет модуля SYSTEM
 - Нет функций ASH CAP CHR ENTIER LEN LONG ODD ORD SHORT
 - Нет процедур ASSERT COPY DEC EXCL HALT INC INCL
@@ -5,6 +7,7 @@
 - Не реализована свёртка констант
 - Нужно пробежаться по стандарту и всё перепроверить.
 
+- JVM: Импортируемые модули не инициализируются
 - JVM: Не реализовано полное сранение массивов.
 - JVM: Не реализовано полное сранение записей.
 - JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур.
index 89592dab07c051d11793c90805bfd5545e9bec2e..424cf4e63190019d4b97d3b1689d85e4e9402d4d 100755 (executable)
@@ -6,6 +6,7 @@ set -e
 ./obn-compile.sh Test
 
 # -a -- for asm as comments
+# -noinner
 jad -o -b -noinner classes/*
 
 ./obn-run.sh Test
index 90b0e88f777caa2c3731b55241603b971d126af6..5e74d18a0acfdf31d609959415e0d7a92ecdfc5a 100644 (file)
@@ -475,20 +475,7 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type)
        memset(t, 0, sizeof *t);
        type -> gen_type = t;
 
-       if(type -> class != OBERON_TYPE_NOTYPE)
-       {
-               t -> wide = jvm_is_wide_type(type);
-               t -> prefix = jvm_get_prefix(type);
-               t -> postfix = jvm_get_postfix(type);
-       }
-
-       t -> cell_size = jvm_cell_size_for_type(type);
-
-       if(type -> class != OBERON_TYPE_NIL)
-       {
-               t -> desc = jvm_get_descriptor(type);
-       }
-
+       gen_module_t * m;
        switch(type -> class)
        {
                case OBERON_TYPE_NOTYPE:
@@ -503,8 +490,6 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type)
                case OBERON_TYPE_NIL:
                        break;
                case OBERON_TYPE_RECORD:
-                       ;
-                       gen_module_t * m;
                        m = type -> module -> gen_mod;
                        oberon_generate_record_class(m, type);
                        break;
@@ -515,6 +500,20 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type)
                        gen_error("oberon_generator_init_type: unk calss %i", type -> class);
                        break;
        }
+
+       if(type -> class != OBERON_TYPE_NOTYPE)
+       {
+               t -> wide = jvm_is_wide_type(type);
+               t -> prefix = jvm_get_prefix(type);
+               t -> postfix = jvm_get_postfix(type);
+       }
+
+       t -> cell_size = jvm_cell_size_for_type(type);
+
+       if(type -> class != OBERON_TYPE_NIL)
+       {
+               t -> desc = jvm_get_descriptor(type);
+       }
 }
 
 void
index 5a93489b35ed197ee2ac10b262a95c042583d146..349015dc163318316d7ccbc8c40e964b9c78839f 100644 (file)
@@ -1453,7 +1453,7 @@ oberon_make_record_selector(oberon_context_t * ctx, oberon_expr_t * expr, char *
                }
        }
 
-       int read_only = 0;
+       int read_only = expr -> read_only;
        if(field -> read_only)
        {
                if(field -> module != ctx -> mod)