Generate INIT function which writes the state instead of returning it

This commit is contained in:
Ulf Norell 2019-08-05 14:36:40 +02:00
parent 79ae92a068
commit 2d6381dc6f
2 changed files with 19 additions and 6 deletions

View File

@ -239,7 +239,8 @@ to_fcode(Env, [{contract, _, {con, _, Main}, Decls}]) ->
#{ contract_name => Main, #{ contract_name => Main,
state_type => StateType, state_type => StateType,
event_type => EventType, event_type => EventType,
functions => add_event_function(Env1, EventType, Funs) }; functions => add_init_function(Env1,
add_event_function(Env1, EventType, Funs)) };
to_fcode(Env, [{contract, _, {con, _, Con}, Decls} | Code]) -> to_fcode(Env, [{contract, _, {con, _, Con}, Decls} | Code]) ->
Env1 = decls_to_fcode(Env#{ context => {abstract_contract, Con} }, Decls), Env1 = decls_to_fcode(Env#{ context => {abstract_contract, Con} }, Decls),
to_fcode(Env1, Code); to_fcode(Env1, Code);
@ -819,6 +820,19 @@ builtin_to_fcode(Builtin, Args) ->
false -> {builtin, Builtin, Args} false -> {builtin, Builtin, Args}
end. end.
%% -- Init function --
add_init_function(_Env, Funs) ->
InitName = {entrypoint, <<"init">>},
InitFun = #{ args := InitArgs } =
case maps:get(InitName, Funs, none) of
none -> #{ attrs => [], args => [], return => {tuple, []}, body => {tuple, []} };
Info -> Info
end,
Vars = [ {var, X} || {X, _} <- InitArgs ],
Funs#{ init => InitFun#{ return => {tuple, []},
body => {builtin, set_state, [{def, InitName, Vars}]} } }.
%% -- Event function -- %% -- Event function --
add_event_function(_Env, none, Funs) -> Funs; add_event_function(_Env, none, Funs) -> Funs;
@ -1009,8 +1023,7 @@ make_fun_name(#{ context := Context }, Ann, Name) ->
Entrypoint = proplists:get_value(entrypoint, Ann, false), Entrypoint = proplists:get_value(entrypoint, Ann, false),
case Context of case Context of
{main_contract, Main} -> {main_contract, Main} ->
if Name == "init" -> init; if Entrypoint -> {entrypoint, list_to_binary(Name)};
Entrypoint -> {entrypoint, list_to_binary(Name)};
true -> {local_fun, [Main, Name]} true -> {local_fun, [Main, Name]}
end; end;
{namespace, Lib} -> {namespace, Lib} ->
@ -1288,7 +1301,7 @@ pp_fun(Name, #{ args := Args, return := Return, body := Body }) ->
pp_text(" : "), pp_ftype(Return), pp_text(" =")]), pp_text(" : "), pp_ftype(Return), pp_text(" =")]),
prettypr:nest(2, pp_fexpr(Body))). prettypr:nest(2, pp_fexpr(Body))).
pp_fun_name(init) -> pp_text(init); pp_fun_name(init) -> pp_text('INIT');
pp_fun_name(event) -> pp_text(event); pp_fun_name(event) -> pp_text(event);
pp_fun_name({entrypoint, E}) -> pp_text(binary_to_list(E)); pp_fun_name({entrypoint, E}) -> pp_text(binary_to_list(E));
pp_fun_name({local_fun, Q}) -> pp_text(string:join(Q, ".")). pp_fun_name({local_fun, Q}) -> pp_text(string:join(Q, ".")).

View File

@ -139,7 +139,7 @@ compile(FCode, Options) ->
make_function_id(X) -> make_function_id(X) ->
aeb_fate_code:symbol_identifier(make_function_name(X)). aeb_fate_code:symbol_identifier(make_function_name(X)).
make_function_name(init) -> <<"init">>; make_function_name(init) -> <<"INIT">>;
make_function_name(event) -> <<"Chain.event">>; make_function_name(event) -> <<"Chain.event">>;
make_function_name({entrypoint, Name}) -> Name; make_function_name({entrypoint, Name}) -> Name;
make_function_name({local_fun, Xs}) -> list_to_binary("." ++ string:join(Xs, ".")). make_function_name({local_fun, Xs}) -> list_to_binary("." ++ string:join(Xs, ".")).
@ -196,7 +196,7 @@ add_default_init_function(SFuns, StateType) when StateType /= {tuple, []} ->
SFuns; SFuns;
add_default_init_function(SFuns, {tuple, []}) -> add_default_init_function(SFuns, {tuple, []}) ->
%% Only add default if the init function is not present %% Only add default if the init function is not present
InitName = make_function_name(init), InitName = make_function_name({entrypoint, <<"init">>}),
case maps:find(InitName, SFuns) of case maps:find(InitName, SFuns) of
{ok, _} -> {ok, _} ->
SFuns; SFuns;