summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 3376c57)
raw | patch | inline | side by side (parent: 3376c57)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Mon, 24 Jul 2017 19:29:35 +0000 (22:29 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Mon, 24 Jul 2017 19:29:35 +0000 (22:29 +0300) |
generator.c | patch | blob | history | |
notes | patch | blob | history | |
oberon.c | patch | blob | history | |
oberon.h | patch | blob | history | |
test.c | patch | blob | history |
diff --git a/generator.c b/generator.c
index a802a96f4e071c64496e5df09f6d28cbfad24a58..673ac3381818c09270f17e002b26b8d1b29ad24c 100644 (file)
--- a/generator.c
+++ b/generator.c
}
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)
index d895de7016b94fd53804e00e3b975119352cb552..3e23e6b973ffde1b6c92741b58b5938ea9949e5a 100644 (file)
--- a/notes
+++ b/notes
- не реализована свёртка констант
- не реализован автокаст (libgccjit сам разруливает)
- не протестированы типы разнных размеров
+
+- похоже record инициализируется дважды в некоторых случаях
diff --git a/oberon.c b/oberon.c
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;
}
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;
}
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)
{
}
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
{
}
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)
{
diff --git a/oberon.h b/oberon.h
index 41cec621e9dc6983297d651bcfe9f955e078d497..93f80a8e78dc3fc2ccb5ea306ed26ce54a7c74f6 100644 (file)
--- a/oberon.h
+++ b/oberon.h
int class;
int size;
- int dim;
-
int num_decl;
oberon_type_t * base;
oberon_object_t * decl;
index 960bef8ce45254f4e7c788f012ec2e5fd7623c62..432307f51ba6e983b25400f43e593e2e8e555fdf 100644 (file)
--- a/test.c
+++ b/test.c
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."
;