DEADSOFTWARE

Что-то там тестировалось с массивами...
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Mon, 24 Jul 2017 19:29:35 +0000 (22:29 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Mon, 24 Jul 2017 19:29:35 +0000 (22:29 +0300)
generator.c
notes
oberon.c
oberon.h
test.c

index a802a96f4e071c64496e5df09f6d28cbfad24a58..673ac3381818c09270f17e002b26b8d1b29ad24c 100644 (file)
@@ -81,14 +81,8 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type)
        }
        else if(type -> class == OBERON_TYPE_ARRAY)
        {
-               if(type -> dim != 1)
-               {
-                       oberon_error(ctx, "multidimension and open arrays not supported");
-               }
-               
                gen_type_t * gen_base = type -> base -> gen_type;
                gcc_jit_type * gcc_base = gen_base -> gcc_type;
-
                gcc_type = gcc_jit_context_new_array_type(gcc_context, NULL, gcc_base, type -> size);
        }
        else if(type -> class == OBERON_TYPE_RECORD)
diff --git a/notes b/notes
index d895de7016b94fd53804e00e3b975119352cb552..3e23e6b973ffde1b6c92741b58b5938ea9949e5a 100644 (file)
--- a/notes
+++ b/notes
@@ -11,3 +11,5 @@
 - не реализована свёртка констант
 - не реализован автокаст (libgccjit сам разруливает)
 - не протестированы типы разнных размеров
+
+- похоже record инициализируется дважды в некоторых случаях
index 847e9c77e65a4352cadb204f4948076f8b19ba82..f4a711f5da3156912e43afb4bc8887dd076936a3 100644 (file)
--- a/oberon.c
+++ b/oberon.c
@@ -758,11 +758,11 @@ oberon_make_array_selector(oberon_context_t * ctx, oberon_expr_t * desig, int nu
                oberon_error(ctx, "not array");
        }
 
-       int dim = desig -> item.var -> type -> dim;
-       if(num_indexes != dim)
-       {
-               oberon_error(ctx, "dimesions not matched");
-       }
+//     int dim = desig -> item.var -> type -> dim;
+//     if(num_indexes != dim)
+//     {
+//             oberon_error(ctx, "dimesions not matched");
+//     }
 
        oberon_type_t * base = desig -> item.var -> type -> base;
 
@@ -1399,9 +1399,8 @@ oberon_const_decl(oberon_context_t * ctx)
 }
 
 static void
-oberon_make_array_type(oberon_context_t * ctx, int dim, oberon_item_t * size, oberon_type_t * base, oberon_type_t ** type)
+oberon_make_array_type(oberon_context_t * ctx, oberon_item_t * size, oberon_type_t * base, oberon_type_t ** type)
 {
-       assert(dim == 1);
        if(size -> mode != MODE_INTEGER)
        {
                oberon_error(ctx, "requires integer constant");
@@ -1410,7 +1409,6 @@ oberon_make_array_type(oberon_context_t * ctx, int dim, oberon_item_t * size, ob
        oberon_type_t * arr;
        arr = *type;
        arr -> class = OBERON_TYPE_ARRAY;
-       arr -> dim = dim;
        arr -> size = size -> integer;
        arr -> base = base;
 }
@@ -1482,7 +1480,7 @@ oberon_type(oberon_context_t * ctx, oberon_type_t ** type)
                base = oberon_new_type_ptr(OBERON_TYPE_VOID);
                oberon_type(ctx, &base);
 
-               oberon_make_array_type(ctx, 1, size, base, type);
+               oberon_make_array_type(ctx, size, base, type);
        }
        else if(ctx -> token == RECORD)
        {
@@ -1523,8 +1521,10 @@ oberon_type(oberon_context_t * ctx, oberon_type_t ** type)
        }
        else if(ctx -> token == PROCEDURE)
        {
+               oberon_open_scope(ctx);
                oberon_assert_token(ctx, PROCEDURE);
                oberon_opt_formal_pars(ctx, type);
+               oberon_close_scope(ctx -> decl);
        }
        else
        {
@@ -1786,8 +1786,8 @@ oberon_initialize_type(oberon_context_t * ctx, oberon_type_t * type)
        }
        else if(type -> class == OBERON_TYPE_ARRAY)
        {
-               oberon_generator_init_type(ctx, type);
                oberon_initialize_type(ctx, type -> base);              
+               oberon_generator_init_type(ctx, type);
        }
        else if(type -> class == OBERON_TYPE_RECORD)
        {
index 41cec621e9dc6983297d651bcfe9f955e078d497..93f80a8e78dc3fc2ccb5ea306ed26ce54a7c74f6 100644 (file)
--- a/oberon.h
+++ b/oberon.h
@@ -98,8 +98,6 @@ struct oberon_type_s
        int class;
        int size;
 
-       int dim;
-
        int num_decl;
        oberon_type_t * base;
        oberon_object_t * decl;
diff --git a/test.c b/test.c
index 960bef8ce45254f4e7c788f012ec2e5fd7623c62..432307f51ba6e983b25400f43e593e2e8e555fdf 100644 (file)
--- a/test.c
+++ b/test.c
@@ -5,18 +5,28 @@
 static const char source[] =
        "MODULE Test;"
        "TYPE"
-       "       MyArr = ARRAY 3 OF INTEGER;"
-       "       MyArrPtr = POINTER TO MyArr;"
-       "       MyRec = POINTER TO MyRecDesc;"
-       "       MyRecDesc = RECORD next : POINTER TO MyRecDesc END;"
-       ""
+       "       Int = INTEGER;"
+       "       PArray2D = POINTER TO Array2D;"
+       "       Array2D = ARRAY 3 OF ARRAY 3 OF INTEGER;"
+       "       PAP2D = ARRAY 4 OF POINTER TO ARRAY 5 OF INTEGER;"
+       "       Object = POINTER TO ObjectDesc;"
+       "       ObjectDesc = RECORD"
+       "               value : Array2D;"
+       "               value2 : PArray2D;"
+       "               doStuff : Proc;"
+       "               next : Object;"
+       "       END;"
+       "       Proc = PROCEDURE(self : Object; i : Int);"
        "VAR"
-       "       a : MyArr;"
-       "       b : MyArrPtr;"
-       "       c : MyRec;"
-       "       d : MyRecDesc;"
-       ""
-       "BEGIN"
+       "       i : Int;"
+       "       a2 : Array2D;"
+       "       p2 : PArray2D;"
+       "       po : Object;"
+       "       do : ObjectDesc;"
+       "       stuffProc : Proc;"
+       "       pap2 : PAP2D;"
+       "       "
+       "BEGIN;"
        "END Test."
 ;