From 338eeae16495bbdcbd8c4f3dad4996346e26139b Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Mon, 24 Jul 2017 22:31:35 +0300 Subject: [PATCH] =?utf8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?utf8?q?=20NIL=20=D0=B8=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82?= =?utf8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B5=20=D1=80=D0=B0=D0=B7?= =?utf8?q?=D1=8B=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?utf8?q?=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- generator.c | 28 +++++++++++++++ notes | 7 ++-- oberon.c | 98 ++++++++++++++++++++++++++++++-------------------- oberon.h | 5 ++- test.c | 25 ++++--------- test/Test | Bin 10496 -> 10344 bytes test/Test.Mod | 16 ++++++++- test/Test.c | 27 ++++++++------ 8 files changed, 133 insertions(+), 73 deletions(-) diff --git a/generator.c b/generator.c index 673ac33..24529e0 100644 --- a/generator.c +++ b/generator.c @@ -336,12 +336,18 @@ lvalue_from_item(oberon_context_t * ctx, oberon_item_t * item) } else if(item -> mode == MODE_FIELD) { + printf("lvalue_from_item: %s\n", item -> var -> name); gen_var_t * gen_var = item -> var -> gen_var; gcc_jit_field * gcc_field = gen_var -> gcc_field; gcc_jit_lvalue * parent = lvalue_from_item(ctx, item -> parent); left = gcc_jit_lvalue_access_field(parent, NULL, gcc_field); } + else if(item -> mode == MODE_DEREF) + { + gcc_jit_rvalue * parent = rvalue_from_item(ctx, item -> parent); + left = gcc_jit_rvalue_dereference(parent, NULL); + } else { oberon_error(ctx, "invalid lvalue expression"); @@ -434,6 +440,16 @@ rvalue_from_item(oberon_context_t * ctx, oberon_item_t * item) gcc_jit_rvalue * parent = rvalue_from_item(ctx, item -> parent); right = gcc_jit_rvalue_access_field(parent, NULL, gcc_field); } + else if(item -> mode == MODE_DEREF) + { + gcc_jit_lvalue * left = lvalue_from_item(ctx, item); + right = gcc_jit_lvalue_as_rvalue(left); + } + else if(item -> mode == MODE_NIL) + { + gcc_jit_type * type = gcc_jit_context_get_type(gcc_context, GCC_JIT_TYPE_VOID_PTR); + right = gcc_jit_context_null(gcc_context, type); + } else { oberon_error(ctx, "rvalue_from_item: invalid mode %i", item -> mode); @@ -536,6 +552,18 @@ oberon_generate_assign(oberon_context_t * ctx, oberon_expr_t * src, oberon_expr_ gcc_jit_rvalue * right; right = rvalue_from_expr(ctx, src); + if(src -> is_item) + { + if(src -> item.mode == MODE_NIL) + { + gen_context_t * gen_context = ctx -> gen_context; + gcc_jit_context * gcc_context = gen_context -> gcc_context; + gen_type_t * gen_type = dst -> result -> gen_type; + gcc_jit_type * cast_to_type = gen_type -> gcc_type; + right = gcc_jit_context_new_cast(gcc_context, NULL, right, cast_to_type); + } + } + gen_context_t * gen_context = ctx -> gen_context; gcc_jit_block * gcc_block = gen_context -> gcc_block; gcc_jit_block_add_assignment(gcc_block, NULL, left, right); diff --git a/notes b/notes index 3e23e6b..0dd194e 100644 --- a/notes +++ b/notes @@ -1,15 +1,16 @@ +- хреновая проверка типов-указателей - нету процедуры NEW - не реализовано расширение типа record -- не реализованы многомерные массивы +- не реализована краткая форма многомерных массивов и краткой формы доступа к ним (* [1, 2, 3] - компилится, но вычисляется только первый аргумент *) - не реализованы локальные объявления в процедурах - не работает присваивание к переменным-процедурам. - не понятен результат присваивания статических структур (* reca := recb; *) +- не понятен результат присваивания статических массивов (* arr1 := arr2; *) - не реализованы var-параметры в генераторе - не реализованы процедуры "наперёд" +- нету типа set - не реализована свёртка констант - не реализован автокаст (libgccjit сам разруливает) - не протестированы типы разнных размеров - -- похоже record инициализируется дважды в некоторых случаях diff --git a/oberon.c b/oberon.c index f4a711f..dfed94a 100644 --- a/oberon.c +++ b/oberon.c @@ -50,7 +50,9 @@ enum { RBRACE, RECORD, POINTER, - TO + TO, + UPARROW, + NIL }; // ======================================================================= @@ -395,6 +397,10 @@ oberon_read_ident(oberon_context_t * ctx) { ctx -> token = TO; } + else if(strcmp(ident, "NIL") == 0) + { + ctx -> token = NIL; + } } static void @@ -527,6 +533,10 @@ oberon_read_symbol(oberon_context_t * ctx) ctx -> token = RBRACE; oberon_get_char(ctx); break; + case '^': + ctx -> token = UPARROW; + oberon_get_char(ctx); + break; default: oberon_error(ctx, "invalid char"); break; @@ -726,45 +736,42 @@ oberon_autocast_call(oberon_context_t * ctx, oberon_expr_t * desig) || ((x) == TRUE) \ || ((x) == FALSE)) -#define ISSELECTOR(x) \ - (((x) == LBRACE) \ - || ((x) == DOT)) - static oberon_expr_t * -oberon_make_array_selector(oberon_context_t * ctx, oberon_expr_t * desig, int num_indexes, oberon_expr_t * indexes) +oberno_make_dereferencing(oberon_context_t * ctx, oberon_expr_t * expr) { - assert(desig -> is_item == 1); - - if(desig -> item.mode != MODE_VAR) + if(expr -> result -> class != OBERON_TYPE_POINTER) { - oberon_error(ctx, "not MODE_VAR"); + oberon_error(ctx, "not a pointer"); } - int class = desig -> item.var -> class; - switch(class) + assert(expr -> is_item); + + oberon_expr_t * selector; + selector = oberon_new_item(MODE_DEREF, expr -> result -> base); + selector -> item.parent = (oberon_item_t *) expr; + + return selector; +} + +static oberon_expr_t * +oberon_make_array_selector(oberon_context_t * ctx, oberon_expr_t * desig, int num_indexes, oberon_expr_t * indexes) +{ + if(desig -> result -> class == OBERON_TYPE_POINTER) { - case OBERON_CLASS_VAR: - case OBERON_CLASS_VAR_PARAM: - case OBERON_CLASS_PARAM: - break; - default: - oberon_error(ctx, "not variable"); - break; + desig = oberno_make_dereferencing(ctx, desig); } - oberon_type_t * type = desig -> item.var -> type; - if(type -> class != OBERON_TYPE_ARRAY) + assert(desig -> is_item); + + if(desig -> result -> class != OBERON_TYPE_ARRAY) { oberon_error(ctx, "not array"); } -// int dim = desig -> item.var -> type -> dim; -// if(num_indexes != dim) -// { -// oberon_error(ctx, "dimesions not matched"); -// } + oberon_type_t * base; + base = desig -> result -> base; - oberon_type_t * base = desig -> item.var -> type -> base; + // TODO check ranges oberon_expr_t * selector; selector = oberon_new_item(MODE_INDEX, base); @@ -778,10 +785,14 @@ oberon_make_array_selector(oberon_context_t * ctx, oberon_expr_t * desig, int nu static oberon_expr_t * oberon_make_record_selector(oberon_context_t * ctx, oberon_expr_t * expr, char * name) { + if(expr -> result -> class == OBERON_TYPE_POINTER) + { + expr = oberno_make_dereferencing(ctx, expr); + } + assert(expr -> is_item == 1); - int class = expr -> result -> class; - if(class != OBERON_TYPE_RECORD) + if(expr -> result -> class != OBERON_TYPE_RECORD) { oberon_error(ctx, "not record"); } @@ -799,6 +810,11 @@ oberon_make_record_selector(oberon_context_t * ctx, oberon_expr_t * expr, char * return selector; } +#define ISSELECTOR(x) \ + (((x) == LBRACE) \ + || ((x) == DOT) \ + || ((x) == UPARROW)) + static oberon_expr_t * oberon_designator(oberon_context_t * ctx) { @@ -846,6 +862,10 @@ oberon_designator(oberon_context_t * ctx) oberon_assert_token(ctx, RBRACE); expr = oberon_make_array_selector(ctx, expr, num_indexes, indexes); break; + case UPARROW: + oberon_assert_token(ctx, UPARROW); + expr = oberno_make_dereferencing(ctx, expr); + break; default: oberon_error(ctx, "oberon_designator: wat"); break; @@ -924,6 +944,10 @@ oberon_factor(oberon_context_t * ctx) expr = oberon_factor(ctx); expr = oberon_make_unary_op(ctx, NOT, expr); break; + case NIL: + oberon_assert_token(ctx, NIL); + expr = oberon_new_item(MODE_NIL, ctx -> void_ptr_type); + break; default: oberon_error(ctx, "invalid expression"); } @@ -1773,16 +1797,8 @@ oberon_initialize_type(oberon_context_t * ctx, oberon_type_t * type) if(type -> class == OBERON_TYPE_POINTER) { - if(type -> base -> class == OBERON_TYPE_RECORD) - { - oberon_generator_init_type(ctx, type -> base); - oberon_generator_init_type(ctx, type); - } - else - { - oberon_initialize_type(ctx, type -> base); - oberon_generator_init_type(ctx, type); - } + oberon_initialize_type(ctx, type -> base); + oberon_generator_init_type(ctx, type); } else if(type -> class == OBERON_TYPE_ARRAY) { @@ -1995,6 +2011,10 @@ register_default_types(oberon_context_t * ctx) ctx -> void_type = oberon_new_type_ptr(OBERON_TYPE_VOID); oberon_generator_init_type(ctx, ctx -> void_type); + ctx -> void_ptr_type = oberon_new_type_ptr(OBERON_TYPE_POINTER); + ctx -> void_ptr_type -> base = ctx -> void_type; + oberon_generator_init_type(ctx, ctx -> void_ptr_type); + ctx -> int_type = oberon_new_type_integer(sizeof(int)); oberon_define_type(ctx -> world_scope, "INTEGER", ctx -> int_type); diff --git a/oberon.h b/oberon.h index 93f80a8..02547cd 100644 --- a/oberon.h +++ b/oberon.h @@ -204,6 +204,7 @@ struct oberon_context_s oberon_type_t * int_type; oberon_type_t * bool_type; oberon_type_t * void_type; + oberon_type_t * void_ptr_type; oberon_scope_t * world_scope; gen_context_t * gen_context; @@ -216,7 +217,9 @@ enum MODE_BOOLEAN, MODE_CALL, MODE_INDEX, - MODE_FIELD + MODE_FIELD, + MODE_DEREF, + MODE_NIL }; enum diff --git a/test.c b/test.c index 432307f..b934af8 100644 --- a/test.c +++ b/test.c @@ -5,28 +5,15 @@ static const char source[] = "MODULE Test;" "TYPE" - " 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;" + " MyRec = POINTER TO MyRecDesc;" + " MyRecDesc = RECORD" + " a : INTEGER;" " END;" - " Proc = PROCEDURE(self : Object; i : Int);" "VAR" - " i : Int;" - " a2 : Array2D;" - " p2 : PArray2D;" - " po : Object;" - " do : ObjectDesc;" - " stuffProc : Proc;" - " pap2 : PAP2D;" - " " + " r : MyRec;" "BEGIN;" + " r := NIL;" + " r.a := 1;" "END Test." ; diff --git a/test/Test b/test/Test index 2c0d9836ae6b2a1da66ff6035c51c769e557a57c..09dbea89f6a56f7f03fd224992382247908ac664 100755 GIT binary patch literal 10344 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 diff --git a/test/Test.Mod b/test/Test.Mod index 5454854..41e1fae 100644 --- a/test/Test.Mod +++ b/test/Test.Mod @@ -1,6 +1,20 @@ MODULE Test; +IMPORT Out; + TYPE - MyArr = POINTER TO ARRAY OF MyArr; + MyArr = ARRAY 3 OF POINTER TO ARRAY 6 OF INTEGER; + +VAR + a : MyArr; + +BEGIN + Out.Open; + + NEW(a[0]); + a[0][0] := 1; + Out.Int(a[0][0], 0); + Out.Ln; + Out.Flush; END Test. diff --git a/test/Test.c b/test/Test.c index c1cde12..22b0e5b 100644 --- a/test/Test.c +++ b/test/Test.c @@ -1,4 +1,4 @@ -/* voc 2.1.0 [2017/06/08] for gcc LP64 on arch xtpam */ +/* voc 2.1.0 [2017/07/17] for gcc LP64 on arch xtpam */ #define SHORTINT INT8 #define INTEGER INT16 @@ -6,27 +6,34 @@ #define SET UINT32 #include "SYSTEM.h" - -struct Test__1 { - char _prvt0[1]; -}; +#include "Out.h" typedef - struct Test__1 *Test_MyRecDesc; + INT16 (*Test_MyArr[3])[6]; + +static Test_MyArr Test_a; -export ADDRESS *Test__1__typ; +static void EnumPtrs(void (*P)(void*)) +{ + __ENUMP(Test_a, 3, P); +} -__TDESC(Test__1, 1, 0) = {__TDFLDS("", 1), {-8}}; export int main(int argc, char **argv) { __INIT(argc, argv); - __REGMAIN("Test", 0); - __INITYP(Test__1, Test__1, 0); + __MODULE_IMPORT(Out); + __REGMAIN("Test", EnumPtrs); /* BEGIN */ + Out_Open(); + Test_a[0] = __NEWARR(NIL, 2, 2, 1, 0, ((INT64)(6))); + (*Test_a[0])[0] = 1; + Out_Int((*Test_a[0])[0], 0); + Out_Ln(); + Out_Flush(); __FINI; } -- 2.29.2