Add fann() to set_state
This commit is contained in:
parent
dc5a119bc6
commit
1043473696
@ -75,7 +75,7 @@
|
|||||||
| {funcall, fann(), fexpr(), [fexpr()]} %% Call to unknown function
|
| {funcall, fann(), fexpr(), [fexpr()]} %% Call to unknown function
|
||||||
| {closure, fann(), fun_name(), fexpr()}
|
| {closure, fann(), fun_name(), fexpr()}
|
||||||
| {switch, fsplit()}
|
| {switch, fsplit()}
|
||||||
| {set_state, state_reg(), fexpr()}
|
| {set_state, fann(), state_reg(), fexpr()}
|
||||||
| {get_state, state_reg()}
|
| {get_state, state_reg()}
|
||||||
%% The following (unapplied top-level functions/builtins and
|
%% The following (unapplied top-level functions/builtins and
|
||||||
%% lambdas) are generated by the fcode compiler, but translated
|
%% lambdas) are generated by the fcode compiler, but translated
|
||||||
@ -1115,7 +1115,7 @@ op_builtins() ->
|
|||||||
].
|
].
|
||||||
|
|
||||||
set_state({reg, R}, Val) ->
|
set_state({reg, R}, Val) ->
|
||||||
{set_state, R, Val};
|
{set_state, get_fann(Val), R, Val};
|
||||||
set_state({tuple, Ls}, Val) ->
|
set_state({tuple, Ls}, Val) ->
|
||||||
?make_let(X, Val,
|
?make_let(X, Val,
|
||||||
lists:foldr(fun({I, L}, Code) ->
|
lists:foldr(fun({I, L}, Code) ->
|
||||||
@ -1290,7 +1290,7 @@ lambda_lift_expr(Layout, Expr) ->
|
|||||||
{op, Op, As} -> {op, Op, lambda_lift_exprs(Layout, As)};
|
{op, Op, As} -> {op, Op, lambda_lift_exprs(Layout, As)};
|
||||||
{'let', X, A, B} -> {'let', X, lambda_lift_expr(Layout, A), lambda_lift_expr(Layout, B)};
|
{'let', X, A, B} -> {'let', X, lambda_lift_expr(Layout, A), lambda_lift_expr(Layout, B)};
|
||||||
{funcall, Ann, A, Bs} -> {funcall, Ann, lambda_lift_expr(Layout, A), lambda_lift_exprs(Layout, Bs)};
|
{funcall, Ann, A, Bs} -> {funcall, Ann, lambda_lift_expr(Layout, A), lambda_lift_exprs(Layout, Bs)};
|
||||||
{set_state, R, A} -> {set_state, R, lambda_lift_expr(Layout, A)};
|
{set_state, Ann, R, A} -> {set_state, Ann, R, lambda_lift_expr(Layout, A)};
|
||||||
{get_state, _} -> Expr;
|
{get_state, _} -> Expr;
|
||||||
{switch, S} -> {switch, lambda_lift_expr(Layout, S)};
|
{switch, S} -> {switch, lambda_lift_expr(Layout, S)};
|
||||||
{split, Type, X, Alts} -> {split, Type, X, lambda_lift_exprs(Layout, Alts)};
|
{split, Type, X, Alts} -> {split, Type, X, lambda_lift_exprs(Layout, Alts)};
|
||||||
@ -1598,7 +1598,7 @@ read_only({proj, E, _}) -> read_only(E);
|
|||||||
read_only({set_proj, A, _, B}) -> read_only([A, B]);
|
read_only({set_proj, A, _, B}) -> read_only([A, B]);
|
||||||
read_only({op, _, Es}) -> read_only(Es);
|
read_only({op, _, Es}) -> read_only(Es);
|
||||||
read_only({get_state, _}) -> true;
|
read_only({get_state, _}) -> true;
|
||||||
read_only({set_state, _, _}) -> false;
|
read_only({set_state, _, _, _}) -> false;
|
||||||
read_only({def_u, _, _}) -> true;
|
read_only({def_u, _, _}) -> true;
|
||||||
read_only({remote_u, _, _, _, _}) -> true;
|
read_only({remote_u, _, _, _, _}) -> true;
|
||||||
read_only({builtin_u, _, _}) -> true;
|
read_only({builtin_u, _, _}) -> true;
|
||||||
@ -1841,7 +1841,7 @@ free_vars(Expr) ->
|
|||||||
{op, _, As} -> free_vars(As);
|
{op, _, As} -> free_vars(As);
|
||||||
{'let', X, A, B} -> free_vars([A, {lam, [X], B}]);
|
{'let', X, A, B} -> free_vars([A, {lam, [X], B}]);
|
||||||
{funcall, _, A, Bs} -> free_vars([A | Bs]);
|
{funcall, _, A, Bs} -> free_vars([A | Bs]);
|
||||||
{set_state, _, A} -> free_vars(A);
|
{set_state, _, _, A} -> free_vars(A);
|
||||||
{get_state, _} -> [];
|
{get_state, _} -> [];
|
||||||
{lam, Xs, B} -> free_vars(B) -- lists:sort(Xs);
|
{lam, Xs, B} -> free_vars(B) -- lists:sort(Xs);
|
||||||
{closure, _, _, A} -> free_vars(A);
|
{closure, _, _, A} -> free_vars(A);
|
||||||
@ -1872,7 +1872,7 @@ used_defs(Expr) ->
|
|||||||
{op, _, As} -> used_defs(As);
|
{op, _, As} -> used_defs(As);
|
||||||
{'let', _, A, B} -> used_defs([A, B]);
|
{'let', _, A, B} -> used_defs([A, B]);
|
||||||
{funcall, _, A, Bs} -> used_defs([A | Bs]);
|
{funcall, _, A, Bs} -> used_defs([A | Bs]);
|
||||||
{set_state, _, A} -> used_defs(A);
|
{set_state, _, _, A} -> used_defs(A);
|
||||||
{get_state, _} -> [];
|
{get_state, _} -> [];
|
||||||
{lam, _, B} -> used_defs(B);
|
{lam, _, B} -> used_defs(B);
|
||||||
{closure, _, F, A} -> lists:umerge([F], used_defs(A));
|
{closure, _, F, A} -> lists:umerge([F], used_defs(A));
|
||||||
@ -1902,7 +1902,7 @@ bottom_up(F, Env, Expr) ->
|
|||||||
{set_proj, R, I, E} -> {set_proj, bottom_up(F, Env, R), I, bottom_up(F, Env, E)};
|
{set_proj, R, I, E} -> {set_proj, bottom_up(F, Env, R), I, bottom_up(F, Env, E)};
|
||||||
{op, Op, Es} -> {op, Op, [bottom_up(F, Env, E) || E <- Es]};
|
{op, Op, Es} -> {op, Op, [bottom_up(F, Env, E) || E <- Es]};
|
||||||
{funcall, Ann, Fun, Es} -> {funcall, Ann, bottom_up(F, Env, Fun), [bottom_up(F, Env, E) || E <- Es]};
|
{funcall, Ann, Fun, Es} -> {funcall, Ann, bottom_up(F, Env, Fun), [bottom_up(F, Env, E) || E <- Es]};
|
||||||
{set_state, R, E} -> {set_state, R, bottom_up(F, Env, E)};
|
{set_state, Ann, R, E} -> {set_state, Ann, R, bottom_up(F, Env, E)};
|
||||||
{get_state, _} -> Expr;
|
{get_state, _} -> Expr;
|
||||||
{closure, Ann, F, CEnv} -> {closure, Ann, F, bottom_up(F, Env, CEnv)};
|
{closure, Ann, F, CEnv} -> {closure, Ann, F, bottom_up(F, Env, CEnv)};
|
||||||
{switch, Split} -> {switch, bottom_up(F, Env, Split)};
|
{switch, Split} -> {switch, bottom_up(F, Env, Split)};
|
||||||
@ -1960,7 +1960,7 @@ rename(Ren, Expr) ->
|
|||||||
{set_proj, R, I, E} -> {set_proj, rename(Ren, R), I, rename(Ren, E)};
|
{set_proj, R, I, E} -> {set_proj, rename(Ren, R), I, rename(Ren, E)};
|
||||||
{op, Op, Es} -> {op, Op, [rename(Ren, E) || E <- Es]};
|
{op, Op, Es} -> {op, Op, [rename(Ren, E) || E <- Es]};
|
||||||
{funcall, Ann, Fun, Es} -> {funcall, Ann, rename(Ren, Fun), [rename(Ren, E) || E <- Es]};
|
{funcall, Ann, Fun, Es} -> {funcall, Ann, rename(Ren, Fun), [rename(Ren, E) || E <- Es]};
|
||||||
{set_state, R, E} -> {set_state, R, rename(Ren, E)};
|
{set_state, Ann, R, E} -> {set_state, Ann, R, rename(Ren, E)};
|
||||||
{get_state, _} -> Expr;
|
{get_state, _} -> Expr;
|
||||||
{closure, Ann, F, Env} -> {closure, Ann, F, rename(Ren, Env)};
|
{closure, Ann, F, Env} -> {closure, Ann, F, rename(Ren, Env)};
|
||||||
{switch, Split} -> {switch, rename_split(Ren, Split)};
|
{switch, Split} -> {switch, rename_split(Ren, Split)};
|
||||||
@ -2207,7 +2207,7 @@ pp_fexpr({remote, ArgsT, RetT, Ct, Fun, As}) ->
|
|||||||
pp_call(pp_parens(pp_beside([pp_fexpr(Ct), pp_text("."), pp_fun_name(Fun), pp_text(" : "), pp_ftype({function, ArgsT, RetT})])), As);
|
pp_call(pp_parens(pp_beside([pp_fexpr(Ct), pp_text("."), pp_fun_name(Fun), pp_text(" : "), pp_ftype({function, ArgsT, RetT})])), As);
|
||||||
pp_fexpr({funcall, _, Fun, As}) ->
|
pp_fexpr({funcall, _, Fun, As}) ->
|
||||||
pp_call(pp_fexpr(Fun), As);
|
pp_call(pp_fexpr(Fun), As);
|
||||||
pp_fexpr({set_state, R, A}) ->
|
pp_fexpr({set_state, _, R, A}) ->
|
||||||
pp_call(pp_text("set_state"), [{lit, {int, R}}, A]);
|
pp_call(pp_text("set_state"), [{lit, {int, R}}, A]);
|
||||||
pp_fexpr({get_state, R}) ->
|
pp_fexpr({get_state, R}) ->
|
||||||
pp_call(pp_text("get_state"), [{lit, {int, R}}]);
|
pp_call(pp_text("get_state"), [{lit, {int, R}}]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user