From: DeaDDooMER Date: Mon, 24 Jul 2017 19:24:00 +0000 (+0300) Subject: Поправлено умножение, добавлен вывод результата генератора в файл X-Git-Url: http://deadsoftware.ru/gitweb?a=commitdiff_plain;h=342c8f1a44765e744c64e14a3b8f1aa4031c5f62;p=dsw-obn.git Поправлено умножение, добавлен вывод результата генератора в файл --- diff --git a/.gitignore b/.gitignore index f47cb20..bbbc7ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.out +dump.txt diff --git a/generator.c b/generator.c index 4ffba11..e4970fd 100644 --- a/generator.c +++ b/generator.c @@ -441,6 +441,7 @@ struct { { 1, .binary_op = GCC_JIT_BINARY_OP_PLUS }, { 1, .binary_op = GCC_JIT_BINARY_OP_MINUS }, + { 1, .binary_op = GCC_JIT_BINARY_OP_MULT }, { 1, .binary_op = GCC_JIT_BINARY_OP_DIVIDE }, { 1, .binary_op = GCC_JIT_BINARY_OP_MODULO }, { 1, .binary_op = GCC_JIT_BINARY_OP_LOGICAL_AND }, @@ -538,3 +539,11 @@ oberon_generate_code(oberon_context_t * ctx) gen_context -> gcc_result = gcc_result; ctx -> mod -> begin = gcc_jit_result_get_code(gcc_result, "BEGIN"); } + +void +oberon_generator_dump(oberon_context_t * ctx, char * path) +{ + gen_context_t * gen_context = ctx -> gen_context; + gcc_jit_context * gcc_context = gen_context -> gcc_context; + gcc_jit_context_dump_to_file(gcc_context, path, 0); +} diff --git a/generator.h b/generator.h index 6a7321b..2957aa8 100644 --- a/generator.h +++ b/generator.h @@ -35,3 +35,5 @@ void oberon_generate_return(oberon_context_t * ctx, oberon_expr_t * expr); */ void oberon_generate_code(oberon_context_t * ctx); +void oberon_generator_dump(oberon_context_t * ctx, char * path); + diff --git a/notes b/notes index 0925eb0..0d9dbdc 100644 --- a/notes +++ b/notes @@ -1,8 +1,7 @@ - нету автокаста в присвоении и передачи параметров - нету локальных объявлений в процедурах - нету свёртки констант -- нету полного контроля return -- нету типа procedure +- нету не работает присваивание к переменным-процедурам. - нету указателей - нету расширения типа - нету var-параметров в генераторе diff --git a/oberon.c b/oberon.c index 2b4e09f..bd5498b 100644 --- a/oberon.c +++ b/oberon.c @@ -653,6 +653,14 @@ oberon_autocast_to(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * oberon_error(ctx, "incompatible size"); } } + else if(pref -> class == OBERON_TYPE_RECORD) + { + if(expr -> result != pref) + { + printf("oberon_autocast_to: rec %p != %p\n", expr -> result, pref); + oberon_error(ctx, "incompatible record types"); + } + } // TODO cast diff --git a/test.c b/test.c index 42526b6..178327e 100644 --- a/test.c +++ b/test.c @@ -1,51 +1,19 @@ #include "oberon.h" +#include "generator.h" #include static const char source[] = "MODULE Test;" - "CONST" - " con = 3;" "" "TYPE" " MyInt = INTEGER;" - " MyArr = ARRAY con OF MyInt;" - " MyRec = RECORD a : MyInt; b : MyInt; END;" - " MyProc = PROCEDURE;" - "" - "VAR" - " k : INTEGER;" - " i : INTEGER;" - " b : BOOLEAN;" - " arr : MyArr;" - " rec : MyRec;" - " proc : MyProc;" - "" - "PROCEDURE Tier;" - "BEGIN" - " k := 314 + con;" - "END Tier;" - "" - "PROCEDURE Tier2(x : INTEGER; y : INTEGER);" - "BEGIN" - " k := x + y;" - "END Tier2;" - "" - "PROCEDURE Tier3(x : INTEGER) : INTEGER;" - "BEGIN" - " RETURN x * x * x;" - "END Tier3;" + " MyRec = RECORD" + " a : MyInt;" + " END;" + " MyRecPtr = POINTER TO MyRec;" "" "BEGIN" - " k := 1;" - " i := k;" - " b := (TRUE # FALSE);" - " Tier();" - " Tier2(21, 13);" - " k := Tier3(2);" - " arr[0] := 1;" - " arr[1] := arr[0];" - " rec.a := 1;" - " rec.b := rec.a;" + " " "END Test." ; @@ -58,6 +26,7 @@ main(int argc, char ** argv) ctx = oberon_create_context(); mod = oberon_compile_module(ctx, source); //mod -> begin(); + oberon_generator_dump(ctx, "dump.txt"); oberon_destroy_context(ctx); return 0; }