From 8233c780e40cc95078d1ece7c5c8a54bf1be52c3 Mon Sep 17 00:00:00 2001 From: Ulf Norell Date: Tue, 7 May 2019 10:05:16 +0200 Subject: [PATCH] Tag for literals in fcode to make code cleaner --- src/aeso_ast_to_fcode.erl | 74 ++++++++++++++------------------------ src/aeso_fcode_to_fate.erl | 33 ++++++----------- 2 files changed, 38 insertions(+), 69 deletions(-) diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index 270e2dd..91ea6d7 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -33,13 +33,15 @@ string_concat | bits_set | bits_clear | bits_test | bits_sum | bits_intersection | bits_union | bits_difference. --type fexpr() :: {int, integer()} - | {string, binary()} - | {account_pubkey, binary()} - | {contract_pubkey, binary()} - | {oracle_pubkey, binary()} - | {oracle_query_id, binary()} - | {bool, false | true} +-type flit() :: {int, integer()} + | {string, binary()} + | {account_pubkey, binary()} + | {contract_pubkey, binary()} + | {oracle_pubkey, binary()} + | {oracle_query_id, binary()} + | {bool, false | true}. + +-type fexpr() :: {lit, flit()} | nil | {var, var_name()} | {def, fun_name(), [fexpr()]} @@ -336,16 +338,16 @@ expr_to_fcode(Env, Expr) -> -spec expr_to_fcode(env(), aeso_syntax:type() | no_type, aeso_syntax:expr()) -> fexpr(). %% Literals -expr_to_fcode(_Env, _Type, {int, _, N}) -> {int, N}; -expr_to_fcode(_Env, _Type, {char, _, N}) -> {int, N}; -expr_to_fcode(_Env, _Type, {bool, _, B}) -> {bool, B}; -expr_to_fcode(_Env, _Type, {string, _, S}) -> {string, S}; -expr_to_fcode(_Env, _Type, {account_pubkey, _, K}) -> {account_pubkey, K}; -expr_to_fcode(_Env, _Type, {contract_pubkey, _, K}) -> {contract_pubkey, K}; -expr_to_fcode(_Env, _Type, {oracle_pubkey, _, K}) -> {oracle_pubkey, K}; -expr_to_fcode(_Env, _Type, {oracle_query_id, _, K}) -> {oracle_query_id, K}; +expr_to_fcode(_Env, _Type, {int, _, N}) -> {lit, {int, N}}; +expr_to_fcode(_Env, _Type, {char, _, N}) -> {lit, {int, N}}; +expr_to_fcode(_Env, _Type, {bool, _, B}) -> {lit, {bool, B}}; +expr_to_fcode(_Env, _Type, {string, _, S}) -> {lit, {string, S}}; +expr_to_fcode(_Env, _Type, {account_pubkey, _, K}) -> {lit, {account_pubkey, K}}; +expr_to_fcode(_Env, _Type, {contract_pubkey, _, K}) -> {lit, {contract_pubkey, K}}; +expr_to_fcode(_Env, _Type, {oracle_pubkey, _, K}) -> {lit, {oracle_pubkey, K}}; +expr_to_fcode(_Env, _Type, {oracle_query_id, _, K}) -> {lit, {oracle_query_id, K}}; -expr_to_fcode(_Env, _Type, {bytes, _, Bin}) -> {string, Bin}; +expr_to_fcode(_Env, _Type, {bytes, _, Bin}) -> {lit, {string, Bin}}; %% Variables expr_to_fcode(Env, _Type, {id, _, X}) -> resolve_var(Env, [X]); @@ -449,7 +451,7 @@ expr_to_fcode(Env, _Type, {app, _Ann, {Op, _}, [A, B]}) when is_atom(Op) -> {op, Op, [expr_to_fcode(Env, A), expr_to_fcode(Env, B)]}; expr_to_fcode(Env, _Type, {app, _Ann, {Op, _}, [A]}) when is_atom(Op) -> case Op of - '-' -> {op, '-', [{int, 0}, expr_to_fcode(Env, A)]}; + '-' -> {op, '-', [{lit, {int, 0}}, expr_to_fcode(Env, A)]}; '!' -> {op, '!', [expr_to_fcode(Env, A)]} end; @@ -704,8 +706,8 @@ expr_to_decision_tree(Env, {typed, _, Expr, _}) -> expr_to_decision_tree(Env, Ex expr_to_decision_tree(Env, Expr) -> {atom, expr_to_fcode(Env, Expr)}. -decision_tree_to_fcode(false) -> {bool, false}; -decision_tree_to_fcode(true) -> {bool, true}; +decision_tree_to_fcode(false) -> {lit, {bool, false}}; +decision_tree_to_fcode(true) -> {lit, {bool, true}}; decision_tree_to_fcode({atom, B}) -> B; decision_tree_to_fcode({'if', A, Then, Else}) -> X = fresh_name(), @@ -806,13 +808,7 @@ lambda_lift_expr({remote_u, Ct, F, Ar}) -> make_closure(FVs, Xs, {remote, Ct1, F, Args}); lambda_lift_expr(Expr) -> case Expr of - {int, _} -> Expr; - {string, _} -> Expr; - {account_pubkey, _} -> Expr; - {contract_pubkey, _} -> Expr; - {oracle_pubkey, _} -> Expr; - {oracle_query_id, _} -> Expr; - {bool, _} -> Expr; + {lit, _} -> Expr; nil -> Expr; {var, _} -> Expr; {closure, _, _} -> Expr; @@ -987,13 +983,7 @@ free_vars(Xs) when is_list(Xs) -> free_vars(Expr) -> case Expr of {var, X} -> [X]; - {int, _} -> []; - {string, _} -> []; - {account_pubkey, _} -> []; - {contract_pubkey, _} -> []; - {oracle_pubkey, _} -> []; - {oracle_query_id, _} -> []; - {bool, _} -> []; + {lit, _} -> []; nil -> []; {def, _, As} -> free_vars(As); {def_u, _, _} -> []; @@ -1034,13 +1024,7 @@ get_named_arg({named_arg_t, _, {id, _, Name}, _, Default}, Args) -> -spec rename([{var_name(), var_name()}], fexpr()) -> fexpr(). rename(Ren, Expr) -> case Expr of - {int, _} -> Expr; - {string, _} -> Expr; - {account_pubkey, _} -> Expr; - {contract_pubkey, _} -> Expr; - {oracle_pubkey, _} -> Expr; - {oracle_query_id, _} -> Expr; - {bool, _} -> Expr; + {lit, _} -> Expr; nil -> nil; {var, X} -> {var, rename_var(Ren, X)}; {def, D, Es} -> {def, D, [rename(Ren, E) || E <- Es]}; @@ -1207,13 +1191,7 @@ pp_punctuate(Sep, [X | Xs]) -> [pp_beside(X, Sep) | pp_punctuate(Sep, Xs)]. pp_par([]) -> prettypr:empty(); pp_par(Xs) -> prettypr:par(Xs). -pp_fexpr({Tag, Lit}) when Tag == int; - Tag == string; - Tag == bool; - Tag == account_pubkey; - Tag == contract_pubkey; - Tag == oracle_pubkey; - Tag == oracle_query_id -> +pp_fexpr({lit, {Tag, Lit}}) -> aeso_pretty:expr({Tag, [], Lit}); pp_fexpr(nil) -> pp_text("[]"); @@ -1304,6 +1282,8 @@ pp_pat({tuple, Xs}) -> pp_fexpr({tuple, [{var, X} || X <- Xs]}); pp_pat({'::', X, Xs}) -> pp_fexpr({op, '::', [{var, X}, {var, Xs}]}); pp_pat({con, As, I, Xs}) -> pp_fexpr({con, As, I, [{var, X} || X <- Xs]}); pp_pat({var, X}) -> pp_fexpr({var, X}); +pp_pat(P = {Tag, _}) when Tag == bool; Tag == int; Tag == string + -> pp_fexpr({lit, P}); pp_pat(Pat) -> pp_fexpr(Pat). is_infix(Op) -> diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index 03275bc..026ec5f 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -177,27 +177,16 @@ lookup_var(#env{vars = Vars}, X) -> %% -- The compiler -- -to_scode(_Env, {int, N}) -> - [push(?i(N))]; - -to_scode(_Env, {string, S}) -> - [push(?i(aeb_fate_data:make_string(S)))]; - -to_scode(_Env, {bool, B}) -> - [push(?i(B))]; - -to_scode(_Env, {account_pubkey, K}) -> - [push(?i(aeb_fate_data:make_address(K)))]; - -to_scode(_Env, {contract_pubkey, K}) -> - [push(?i(aeb_fate_data:make_address(K)))]; - -to_scode(_Env, {oracle_pubkey, K}) -> - [push(?i(aeb_fate_data:make_oracle(K)))]; - -to_scode(_Env, {oracle_query_id, K}) -> - %% Not actually in FATE yet - [push(?i(aeb_fate_data:make_oracle_query(K)))]; +to_scode(_Env, {lit, L}) -> + case L of + {int, N} -> [push(?i(N))]; + {string, S} -> [push(?i(aeb_fate_data:make_string(S)))]; + {bool, B} -> [push(?i(B))]; + {account_pubkey, K} -> [push(?i(aeb_fate_data:make_address(K)))]; + {contract_pubkey, K} -> [push(?i(aeb_fate_data:make_address(K)))]; + {oracle_pubkey, K} -> [push(?i(aeb_fate_data:make_oracle(K)))]; + {oracle_query_id, K} -> [push(?i(aeb_fate_data:make_oracle_query(K)))] %% TODO: Not actually in FATE yet + end; to_scode(_Env, nil) -> [aeb_fate_code:nil(?a)]; @@ -254,7 +243,7 @@ to_scode(Env, {remote, Ct, Fun, [_Gas, _Value | Args]}) -> call_to_scode(Env, [to_scode(Env, Ct), Call], Args); to_scode(Env, {closure, Fun, FVs}) -> - to_scode(Env, {tuple, [{string, make_function_name(Fun)}, FVs]}); + to_scode(Env, {tuple, [{lit, {string, make_function_name(Fun)}}, FVs]}); to_scode(Env, {switch, Case}) -> split_to_scode(Env, Case);