DEADSOFTWARE

Исправлено падение при использовании процедурного типа
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Sun, 13 Aug 2017 19:58:04 +0000 (22:58 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Sun, 13 Aug 2017 19:58:04 +0000 (22:58 +0300)
Test.obn
Test18A.obn [new file with mode: 0644]
Test18B.obn [new file with mode: 0644]
Test18C.obn [new file with mode: 0644]
obn-run-tests.sh
src/backends/jvm/generator-jvm-abi.c
src/backends/jvm/generator-jvm.c
src/oberon.c

index 8249fb77223116fd24082f63a7dba78821d98fe1..c039f87259a54823da72904d8cacb593996e0b7c 100644 (file)
--- a/Test.obn
+++ b/Test.obn
@@ -1,8 +1,11 @@
 MODULE Test;
 
-IMPORT Out;
+VAR
+  x : PROCEDURE(i : INTEGER);
+
+PROCEDURE X(a : INTEGER);
+END X;
 
 BEGIN
-  Out.Open;
-  Out.String("Hello World!"); Out.Ln;
+  x := X;
 END Test.
diff --git a/Test18A.obn b/Test18A.obn
new file mode 100644 (file)
index 0000000..06c84f6
--- /dev/null
@@ -0,0 +1,13 @@
+MODULE Test18A;
+
+VAR
+  x : PROCEDURE(i : INTEGER);
+
+PROCEDURE X(a : INTEGER);
+END X;
+
+BEGIN
+  x := X;
+END Test18A.
+
+Проверка процедурного типа. Тест должен проходить.
diff --git a/Test18B.obn b/Test18B.obn
new file mode 100644 (file)
index 0000000..e963c56
--- /dev/null
@@ -0,0 +1,13 @@
+MODULE Test18B;
+
+VAR
+  x : PROCEDURE(VAR i : INTEGER);
+
+PROCEDURE X(a : INTEGER);
+END X;
+
+BEGIN
+  x := X;
+END Test18B.
+
+Проверка процедурного типа. Тест должен проваливаться.
diff --git a/Test18C.obn b/Test18C.obn
new file mode 100644 (file)
index 0000000..02d960d
--- /dev/null
@@ -0,0 +1,10 @@
+MODULE Test18C;
+
+VAR
+  x : PROCEDURE (i : LONGREAL);
+
+BEGIN
+  x := ABS;
+END Test18C.
+
+Проверка процедурного типа. Тест должен проваливаться.
index e3e3d5af23365db90c84c03533503c0a55d0c127..70a1ea639fa66156b76136ee13d8fe1a3ae4b05d 100755 (executable)
@@ -79,6 +79,7 @@ maketest Test13
 maketest Test14
 maketest Test15
 maketest Test16
+
 makefail Test17A
 makefail Test17B
 makecomp Test17C
@@ -86,3 +87,6 @@ makecomp Test17D
 makefail Test17E
 makefail Test17F
 
+makecomp Test18A
+makefail Test18B
+makefail Test18C
index 8d966cbe4877ac404487fbd308d8bc2d5a359deb..1d634a5ea0ddfcbaad19f707f4521202389ebec6 100644 (file)
@@ -257,12 +257,17 @@ jvm_generate_var(gen_var_t * v)
                case JVM_STORAGE_REGISTER:
                case JVM_STORAGE_PARAM:
                case JVM_STORAGE_PARAM_VAR:
+               case JVM_STORAGE_FRAME:
+               case JVM_STORAGE_FRAME_VAR:
+               case JVM_STORAGE_FRAME_PARAM:
+               case JVM_STORAGE_FRAME_PARAM_VAR:
                        jvm_generate(p, 0, 0, ".var %i is %s %s from start to end", reg, name, desc);
                        break;
                case JVM_STORAGE_REGISTER_VAR:
                        jvm_generate(p, 0, 0, ".var %i is %s [%s from start to end", reg, name, desc);
                        break;
                case JVM_STORAGE_PARAM_VARPTR:
+               case JVM_STORAGE_FRAME_PARAM_VARPTR:
                        jvm_generate(p, 0, 0, ".var %i is %s [%s from start to end", reg, name, desc);
                        jvm_generate(p, 0, 0, ".var %i is %s$offset I from start to end", reg + 1, name);
                        break;
@@ -278,13 +283,6 @@ jvm_generate_var(gen_var_t * v)
                case JVM_STORAGE_FIELD_VAR:
                        fprintf(v -> class -> fp, ".field public %s [%s\n\n", name, desc);
                        break;
-               case JVM_STORAGE_FRAME:
-               case JVM_STORAGE_FRAME_VAR:
-               case JVM_STORAGE_FRAME_PARAM:
-               case JVM_STORAGE_FRAME_PARAM_VAR:
-               case JVM_STORAGE_FRAME_PARAM_VARPTR:
-                       /* См. ниже jvm_generate_frame_class() */
-                       break;
                default:
                        gen_error("jvm_generate_var: invalid storage %i", storage);
                        break;
index bf5200bd786daafe7cff702b2731eb2b0552343a..e897f6e98cb64913f5e58b9612ad8be3e7ef1c9c 100644 (file)
@@ -886,6 +886,7 @@ jvm_generate_local_initialization(gen_proc_t * p, oberon_object_t * x)
                case OBERON_CLASS_VAR_PARAM:
                case OBERON_CLASS_PARAM:
                case OBERON_CLASS_VAR:
+                       jvm_generate_var(v);
                        jvm_generate_var_initialization(p, v);
                        break;
                case OBERON_CLASS_PROC:
@@ -938,7 +939,7 @@ oberon_generate_begin_proc(oberon_context_t * ctx, oberon_object_t * proc)
 
        jvm_generate_procedure_frame(proc);
 
-       /* Создание парамеров и переменных */
+       /* Ð¡Ð¾Ð·Ð´Ð°Ð½Ð¸Ðµ Ð¿Ð°Ñ\80амеÑ\82Ñ\80ов Ð¸ Ð¿ÐµÑ\80еменнÑ\8bÑ\85 */
        var = proc -> scope -> list -> next;
        while(var)
        {
index efa6fed9c13a02e3e3d5438a8be29c7121768970..3b8a6b14846e593d9bbaf7b31385993475362a8c 100644 (file)
@@ -2940,9 +2940,10 @@ oberon_initialize_type(oberon_context_t * ctx, oberon_type_t * type)
                oberon_object_t * field = type -> decl;
                for(int i = 0; i < num_fields; i++)
                {
-                       oberon_initialize_object(ctx, field);
+                       //oberon_initialize_object(ctx, field);
+                       oberon_initialize_type(ctx, field -> type);
                        field = field -> next;
-               }               
+               }
 
                oberon_generator_init_type(ctx, type);
        }