Fate compiler (#62)
* Update to changes in icode format * Start on new intermediate code for FATE * Compile `let` to FATE * Fix and improve broken bytecode optimisations * Basic tuple patterns * Compile shallow matching on tuples * Liveness analysis for local variables * Fix minor bug * Use RETURNR when possible * Nicer debug printing * Refactor optimization rules * Compile tuple construction * Improve instruction analysis and generalize some optimizations * Compile nested pattern matching to case trees (Only tuple and variable patterns so far) * Reannotate and repeat optimization pass once it done Could try hard to keep annotations more precise, but would be more error prone * Get rid of unnecessary STORE instructions * Keep better track of liveness annotations when swapping instructions * Limit the number of iterations for the optimization loop Should finish in one iteration, but we shouldn't loop if there are bugs or corner cases where it doesn't. * Pattern matching on booleans * wip: rewrite case tree compiler to handle catch-alls still with debug printing, and can't compile it yet * Add missing case in renaming * Compile case trees all the way to Fate assembly * Simplify variables bindings in environment * Shortcut let x = y in ... * compile list literals * Fix various bugs in pattern match compilation * Pretty printer for fcode * Fix renaming bug * Another renaming bug * Handle switch_body in optimizations * Remove optimization for if-then-else * Tag instructions in annotated scode * Remove 'if' from fcode * Fix dialyzer things * Remove unused argument * Compile pattern matching on integer literals * Compile list patterns * Use op_view in more places * allow leaving out fields from record patterns * compile records (patterns and construction) * Compile record update * Use SETELEMENT instruction * Compile variants * Remove incorrect push for tuple switches * Optimize matching on single constructors datatypes * Use the fact that SWITCH and JUMPIF can use args and vars * string literals and pattern matching on the same * Compile character literals * Minor refactoring of op instruction handling * compile address literals * Get rid of unit in AST * Unary operators * Compile function calls (to fully saturated top-level functions only) * fix breakage after unary operators * variables are now lists of names in fcode * pretty printing for function calls * use STORE ?a instead of PUSH during optimizations * no-op fcode optimization pass * some constant propagation optimizations * Case on constructor optimization * fix minor bugs * Compile all the operators * Compile maps * Simplify JUMPIF on true/false * Fixed left-over reference to STR_EQ * Add compile-time evaluation for more operators * Distinguish local vars and top-level names already in fcode * Compile builtins * Compile bytes(N) Compile to FATE strings for now * Improve inlining of PUSH * Fix name resolution bug * Change map_get/set to operators in fcode * Compile lambdas and higher-order functions * Optimize single variable closure envs * Handle unapplied builtins and top-level functions * Missing case in fcode pretty printer * Fix variable binding bug in fcode compiler * Compiler side of state updates No support in FATE yet though * Compile statements * Compile events But no FATE support for events yet * Compile remote calls * Clearer distinction between applied and unapplied top-level things (def/builtin) in fcode * Tag for literals in fcode to make code cleaner * We now have block hash at height in FATE * Update aebytecode commit * Get rid of catchall todos * Jump some hoops to please Dialyzer
This commit is contained in:
+1
-3
@@ -441,7 +441,7 @@ build_if(Ann, Cond, Then, [{elif, Ann1, Cond1, Then1} | Elses]) ->
|
||||
build_if(Ann, Cond, Then, [{else, _Ann, Else}]) ->
|
||||
{'if', Ann, Cond, Then, Else};
|
||||
build_if(Ann, Cond, Then, []) ->
|
||||
{'if', Ann, Cond, Then, {unit, [{origin, system}]}}.
|
||||
{'if', Ann, Cond, Then, {tuple, [{origin, system}], []}}.
|
||||
|
||||
else_branches([Elif = {elif, _, _, _} | Stmts], Acc) ->
|
||||
else_branches(Stmts, [Elif | Acc]);
|
||||
@@ -457,7 +457,6 @@ fun_t(Domains, Type) ->
|
||||
lists:foldr(fun({Dom, Ann}, T) -> {fun_t, Ann, [], Dom, T} end,
|
||||
Type, Domains).
|
||||
|
||||
tuple_e(Ann, []) -> {unit, Ann};
|
||||
tuple_e(_Ann, [Expr]) -> Expr; %% Not a tuple
|
||||
tuple_e(Ann, Exprs) -> {tuple, Ann, Exprs}.
|
||||
|
||||
@@ -478,7 +477,6 @@ parse_pattern({record, Ann, Fs}) ->
|
||||
{record, Ann, lists:map(fun parse_field_pattern/1, Fs)};
|
||||
parse_pattern(E = {con, _, _}) -> E;
|
||||
parse_pattern(E = {id, _, _}) -> E;
|
||||
parse_pattern(E = {unit, _}) -> E;
|
||||
parse_pattern(E = {int, _, _}) -> E;
|
||||
parse_pattern(E = {bool, _, _}) -> E;
|
||||
parse_pattern(E = {bytes, _, _}) -> E;
|
||||
|
||||
Reference in New Issue
Block a user