From 4f4cf0eaa97357097c0ca92e02f4583a55998a67 Mon Sep 17 00:00:00 2001 From: Tobias Lindahl Date: Tue, 21 May 2019 17:59:05 +0200 Subject: [PATCH] Use new adt for fate code --- src/aeso_fcode_to_fate.erl | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index 17530bc..da77164 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -111,13 +111,13 @@ compile(FCode, Options) -> functions := Functions } = FCode, SFuns = functions_to_scode(ContractName, Functions, Options), SFuns1 = optimize_scode(SFuns, Options), - BBFuns = to_basic_blocks(SFuns1, Options), - FateCode = #{ functions => BBFuns, - symbols => #{}, - annotations => #{} }, + FateCode = to_basic_blocks(SFuns1, aeb_fate_code:new(), Options), debug(compile, Options, "~s\n", [aeb_fate_asm:pp(FateCode)]), FateCode. +make_function_id(X) -> + aeb_fate_code:symbol_identifier(make_function_name(X)). + make_function_name(init) -> <<"init">>; make_function_name({entrypoint, Name}) -> Name; make_function_name({local_fun, Xs}) -> list_to_binary("." ++ string:join(Xs, ".")). @@ -225,7 +225,7 @@ to_scode(Env, {'let', X, Expr, Body}) -> to_scode(Env1, Body) ]; to_scode(Env, {def, Fun, Args}) -> - FName = make_function_name(Fun), + FName = make_function_id(Fun), Lbl = aeb_fate_data:make_string(FName), call_to_scode(Env, local_call(Env, ?i(Lbl)), Args); to_scode(Env, {funcall, Fun, Args}) -> @@ -236,7 +236,7 @@ to_scode(Env, {builtin, B, Args}) -> to_scode(Env, {remote, Ct, Fun, [{builtin, call_gas_left, _}, Value | Args]}) -> %% Gas is not limited. - Lbl = make_function_name(Fun), + Lbl = make_function_id(Fun), Call = if Env#env.tailpos -> aeb_fate_ops:call_tr(?a, Lbl, ?a); true -> aeb_fate_ops:call_r(?a, Lbl, ?a) end, @@ -244,14 +244,14 @@ to_scode(Env, {remote, Ct, Fun, [{builtin, call_gas_left, _}, Value | Args]}) -> to_scode(Env, {remote, Ct, Fun, [Gas, Value | Args]}) -> %% Gas is limited. - Lbl = make_function_name(Fun), + Lbl = make_function_id(Fun), Call = if Env#env.tailpos -> aeb_fate_ops:call_gtr(?a, Lbl, ?a, ?a); true -> aeb_fate_ops:call_gr(?a, Lbl, ?a, ?a) end, call_to_scode(Env, Call, [Ct, Value, Gas | Args]); to_scode(Env, {closure, Fun, FVs}) -> - to_scode(Env, {tuple, [{lit, {string, make_function_name(Fun)}}, FVs]}); + to_scode(Env, {tuple, [{lit, {string, make_function_id(Fun)}}, FVs]}); to_scode(Env, {switch, Case}) -> split_to_scode(Env, Case). @@ -1163,10 +1163,11 @@ desugar(I) -> [I]. %% -- Phase III -------------------------------------------------------------- %% Constructing basic blocks -to_basic_blocks(Funs, Options) -> - maps:from_list([ {Name, {{Args, Res}, - bb(Name, Code ++ [aeb_fate_code:return()], Options)}} - || {Name, {{Args, Res}, Code}} <- maps:to_list(Funs) ]). +to_basic_blocks(Funs, FateCode, Options) -> + lists:foldl(fun({Name, {Sig, Code}}, Acc) -> + BB = bb(Name, Code ++ [aeb_fate_ops:return()], Options), + aeb_fate_code:insert_fun(Name, Sig, BB, Acc) + end, FateCode, maps:to_list(Funs)). bb(_Name, Code, _Options) -> Blocks0 = blocks(Code),