Add require builtin
This commit is contained in:
@@ -380,7 +380,8 @@ global_env() ->
|
||||
{"RelativeTTL", Fun1(Int, TTL)},
|
||||
{"FixedTTL", Fun1(Int, TTL)},
|
||||
%% Abort
|
||||
{"abort", Fun1(String, A)}])
|
||||
{"abort", Fun1(String, A)},
|
||||
{"require", Fun([Bool, String], A)}])
|
||||
, types = MkDefs(
|
||||
[{"int", 0}, {"bool", 0}, {"char", 0}, {"string", 0}, {"address", 0},
|
||||
{"hash", {[], {alias_t, Bytes(32)}}},
|
||||
|
||||
@@ -170,7 +170,7 @@ builtins() ->
|
||||
MkName = fun(NS, Fun) ->
|
||||
list_to_atom(string:to_lower(string:join(NS ++ [Fun], "_")))
|
||||
end,
|
||||
Scopes = [{[], [{"abort", 1}]},
|
||||
Scopes = [{[], [{"abort", 1}, {"require", 2}]},
|
||||
{["Chain"], [{"spend", 2}, {"balance", 1}, {"block_hash", 1}, {"coinbase", none},
|
||||
{"timestamp", none}, {"block_height", none}, {"difficulty", none},
|
||||
{"gas_limit", none}]},
|
||||
@@ -765,6 +765,8 @@ op_builtins() ->
|
||||
bits_difference, int_to_str, address_to_str, crypto_ecverify,
|
||||
crypto_ecverify_secp256k1, crypto_sha3, crypto_sha256, crypto_blake2b].
|
||||
|
||||
builtin_to_fcode(require, [Cond, Msg]) ->
|
||||
make_if(Cond, {tuple, []}, {builtin, abort, [Msg]});
|
||||
builtin_to_fcode(map_delete, [Key, Map]) ->
|
||||
{op, map_delete, [Map, Key]};
|
||||
builtin_to_fcode(map_member, [Key, Map]) ->
|
||||
|
||||
@@ -174,6 +174,8 @@ ast_body({qid, _, [Con, "put"]}, #{ contract_name := Con }) ->
|
||||
%% Abort
|
||||
ast_body(?id_app("abort", [String], _, _), Icode) ->
|
||||
builtin_call(abort, [ast_body(String, Icode)]);
|
||||
ast_body(?id_app("require", [Bool, String], _, _), Icode) ->
|
||||
builtin_call(require, [ast_body(Bool, Icode), ast_body(String, Icode)]);
|
||||
|
||||
%% Authentication
|
||||
ast_body({qid, _, ["Auth", "tx_hash"]}, _Icode) ->
|
||||
|
||||
@@ -45,6 +45,7 @@ builtin_deps1({baseX_int, X}) -> [{baseX_int_pad, X}];
|
||||
builtin_deps1({baseX_int_pad, X}) -> [{baseX_int_encode, X}];
|
||||
builtin_deps1({baseX_int_encode, X}) -> [{baseX_int_encode_, X}, {baseX_tab, X}, {baseX_digits, X}];
|
||||
builtin_deps1(string_reverse) -> [string_reverse_];
|
||||
builtin_deps1(require) -> [abort];
|
||||
builtin_deps1(_) -> [].
|
||||
|
||||
dep_closure(Deps) ->
|
||||
@@ -131,6 +132,7 @@ builtin_function(BF) ->
|
||||
case BF of
|
||||
{event, EventT} -> bfun(BF, builtin_event(EventT));
|
||||
abort -> bfun(BF, builtin_abort());
|
||||
require -> bfun(BF, builtin_require());
|
||||
{map_lookup, Type} -> bfun(BF, builtin_map_lookup(Type));
|
||||
map_put -> bfun(BF, builtin_map_put());
|
||||
map_delete -> bfun(BF, builtin_map_delete());
|
||||
@@ -201,6 +203,11 @@ builtin_abort() ->
|
||||
A(?REVERT)]}, %% Stack: 0,Ptr
|
||||
{tuple,[]}}.
|
||||
|
||||
builtin_require() ->
|
||||
{[{"c", word}, {"msg", string}],
|
||||
{ifte, ?V(c), {tuple, []}, ?call(abort, [?V(msg)])},
|
||||
{tuple, []}}.
|
||||
|
||||
%% Map primitives
|
||||
builtin_map_lookup(Type) ->
|
||||
Ret = aeso_icode:option_typerep(Type),
|
||||
|
||||
Reference in New Issue
Block a user