diff options
Diffstat (limited to 'erts/preloaded/src/erlang.erl')
-rw-r--r-- | erts/preloaded/src/erlang.erl | 185 |
1 files changed, 90 insertions, 95 deletions
diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl index ab42ff437f..41471e51e2 100644 --- a/erts/preloaded/src/erlang.erl +++ b/erts/preloaded/src/erlang.erl @@ -36,7 +36,7 @@ -export([dmonitor_node/3]). -export([delay_trap/2]). -export([set_cookie/1, set_cookie/2, get_cookie/0, get_cookie/1]). --export([nodes/0]). +-export([nodes/0, nodes/1, nodes/2]). -export([integer_to_list/2]). -export([integer_to_binary/2]). @@ -92,8 +92,8 @@ -type integer() :: integer(). -type iodata() :: iolist() | binary(). -type iolist() :: maybe_improper_list(byte() | binary() | iolist(), binary() | []). --type list() :: list(). --type list(ContentType) :: list(ContentType). +-type list() :: [any()]. +-type list(ContentType) :: [ContentType]. -type map() :: #{ any() => any() }. -type maybe_improper_list() :: maybe_improper_list(any(), any()). -type maybe_improper_list(ContentType, TerminationType) :: maybe_improper_list(ContentType, TerminationType). @@ -187,6 +187,9 @@ -type iovec() :: [binary()]. -export_type([iovec/0]). +%% Type for the destination of sends. +-export_type([send_destination/0]). + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Native code BIF stubs and their types %% (BIF's actually implemented in this module goes last in the file) @@ -266,7 +269,7 @@ is_list/1, is_map/1, is_number/1, is_pid/1, is_port/1, is_record/2, is_record/3, is_reference/1, is_tuple/1, load_module/2, load_nif/2, localtime_to_universaltime/2, make_fun/3, - make_tuple/2, make_tuple/3, nodes/1, open_port/2, + make_tuple/2, make_tuple/3, open_port/2, port_call/2, port_call/3, port_info/1, port_info/2, process_flag/2, process_info/2, send/2, send/3, seq_trace_info/1, setelement/3, @@ -1004,7 +1007,8 @@ float_to_binary(_Float) -> Options :: [Option], Option :: {decimals, Decimals :: 0..253} | {scientific, Decimals :: 0..249} | - compact. + compact | + short. float_to_binary(_Float, _Options) -> erlang:nif_error(undefined). @@ -1020,7 +1024,8 @@ float_to_list(_Float) -> Options :: [Option], Option :: {decimals, Decimals :: 0..253} | {scientific, Decimals :: 0..249} | - compact. + compact | + short. float_to_list(_Float, _Options) -> erlang:nif_error(undefined). @@ -1274,7 +1279,7 @@ iolist_to_iovec(_IoListOrBinary) -> %% is_alive/0 -spec is_alive() -> boolean(). is_alive() -> - erlang:nif_error(undefined). + erlang:node() =/= nonode@nohost orelse erts_internal:dynamic_node_name(). %% is_builtin/3 -spec erlang:is_builtin(Module, Function, Arity) -> boolean() when @@ -1794,6 +1799,7 @@ put(_Key, _Val) -> erlang:nif_error(undefined). %% raise/3 +%% Shadowed by erl_bif_types: erlang:raise/3 -spec erlang:raise(Class, Reason, Stacktrace) -> 'badarg' when Class :: 'error' | 'exit' | 'throw', Reason :: term(), @@ -1914,8 +1920,8 @@ setnode(_P1, _P2) -> -spec erlang:setnode(Node, DistCtrlr, Opts) -> dist_handle() when Node :: atom(), DistCtrlr :: port() | pid(), - Opts :: {integer(), integer(), pos_integer()}. -setnode(Node, DistCtrlr, {_Flags, _Ver, _Creation} = Opts) -> + Opts :: {integer(), pos_integer()}. +setnode(Node, DistCtrlr, {_Flags, _Creation} = Opts) -> case case erts_internal:create_dist_channel(Node, DistCtrlr, Opts) of {ok, DH} -> DH; {message, Ref} -> receive {Ref, Res} -> Res end; @@ -2307,18 +2313,30 @@ is_tuple(_Term) -> -spec load_module(Module, Binary) -> {module, Module} | {error, Reason} when Module :: module(), Binary :: binary(), - Reason :: badfile | not_purged | on_load. + Reason :: badfile | not_purged | on_load + | {features_not_allowed, [atom()]}. load_module(Mod, Code) -> try - case erlang:prepare_loading(Mod, Code) of - {error,_}=Error -> - Error; - Prep when erlang:is_reference(Prep) -> - case erlang:finish_loading([Prep]) of - ok -> - {module,Mod}; - {Error,[Mod]} -> - {error,Error} + Allowed = + case erlang:module_loaded(erl_features) of + true -> + erl_features:load_allowed(Code); + false -> ok + end, + case Allowed of + {not_allowed, NotEnabled} -> + {error, {features_not_allowed, NotEnabled}}; + ok -> + case erlang:prepare_loading(Mod, Code) of + {error,_}=Error -> + Error; + Prep when erlang:is_reference(Prep) -> + case erlang:finish_loading([Prep]) of + ok -> + {module,Mod}; + {Error,[Mod]} -> + {error,Error} + end end end catch @@ -2366,13 +2384,6 @@ make_tuple(_Arity,_InitialValue) -> make_tuple(_Arity,_DefaultValue,_InitList) -> erlang:nif_error(undefined). --spec nodes(Arg) -> Nodes when - Arg :: NodeType | [NodeType], - NodeType :: visible | hidden | connected | this | known, - Nodes :: [node()]. -nodes(_Arg) -> - erlang:nif_error(undefined). - -spec open_port(PortName, PortSettings) -> port() when PortName :: {spawn, Command :: string() | binary()} | {spawn_driver, Command :: string() | binary()} | @@ -2414,7 +2425,10 @@ open_port(PortName, PortSettings) -> -type message_queue_data() :: off_heap | on_heap. --spec process_flag(trap_exit, Boolean) -> OldBoolean when +-spec process_flag(async_dist, Boolean) -> OldBoolean when + Boolean :: boolean(), + OldBoolean :: boolean(); + (trap_exit, Boolean) -> OldBoolean when Boolean :: boolean(), OldBoolean :: boolean(); (error_handler, Module) -> OldModule when @@ -2452,6 +2466,7 @@ process_flag(_Flag, _Value) -> erlang:nif_error(undefined). -type process_info_item() :: + async_dist | backtrace | binary | catchlevel | @@ -2475,6 +2490,7 @@ process_flag(_Flag, _Value) -> monitored_by | monitors | message_queue_data | + parent | priority | reductions | registered_name | @@ -2487,6 +2503,7 @@ process_flag(_Flag, _Value) -> trap_exit. -type process_info_result_item() :: + {async_dist, Enabled :: boolean()} | {backtrace, Bin :: binary()} | {binary, BinInfo :: [{non_neg_integer(), non_neg_integer(), @@ -2519,6 +2536,7 @@ process_flag(_Flag, _Value) -> Monitors :: [{process | port, Pid :: pid() | port() | {RegName :: atom(), Node :: node()}}]} | {message_queue_data, MQD :: message_queue_data()} | + {parent, pid() | undefined} | {priority, Level :: priority_level()} | {reductions, Number :: non_neg_integer()} | {registered_name, [] | (Atom :: atom())} | @@ -2555,13 +2573,13 @@ process_info(_Pid,_ItemSpec) -> erlang:nif_error(undefined). -spec erlang:send(Dest, Msg) -> Msg when - Dest :: dst(), + Dest :: send_destination(), Msg :: term(). send(_Dest,_Msg) -> erlang:nif_error(undefined). -spec erlang:send(Dest, Msg, Options) -> Res when - Dest :: dst(), + Dest :: send_destination(), Msg :: term(), Options :: [nosuspend | noconnect], Res :: ok | nosuspend | noconnect. @@ -2868,8 +2886,8 @@ tuple_to_list(_Tuple) -> (dirty_io_schedulers) -> non_neg_integer(); (dist) -> binary(); (dist_buf_busy_limit) -> non_neg_integer(); - (dist_ctrl) -> {Node :: node(), - ControllingEntity :: port() | pid()}; + (dist_ctrl) -> [{Node :: node(), + ControllingEntity :: port() | pid()}]; (driver_version) -> string(); (dynamic_trace) -> none | dtrace | systemtap; (dynamic_trace_probes) -> boolean(); @@ -2936,6 +2954,7 @@ tuple_to_list(_Tuple) -> (update_cpu_info) -> changed | unchanged; (version) -> string(); (wordsize | {wordsize, internal} | {wordsize, external}) -> 4 | 8; + (async_dist) -> boolean(); (overview) -> boolean(); %% Deliberately left undocumented (sequential_tracer) -> {sequential_tracer, pid() | port() | {module(),term()} | false}. @@ -3065,7 +3084,8 @@ spawn_monitor(M, F, A) -> | {min_heap_size, Size :: non_neg_integer()} | {min_bin_vheap_size, VSize :: non_neg_integer()} | {max_heap_size, Size :: max_heap_size()} - | {message_queue_data, MQD :: message_queue_data()}. + | {message_queue_data, MQD :: message_queue_data()} + | {async_dist, Enabled :: boolean()}. -spec spawn_opt(Fun, Options) -> pid() | {pid(), reference()} when Fun :: function(), @@ -3247,68 +3267,20 @@ spawn_opt(N, M, F, A, O) when erlang:is_atom(N), end; {spawn_reply, Ref, error, badopt} -> badarg_with_cause([N, M, F, A, O], badopt); - {spawn_reply, Ref, error, noconnection} -> - try + {spawn_reply, Ref, error, Err0} when Err0 == noconnection; + Err0 == notsup -> + try erlang:spawn_opt(erts_internal,crasher, - [N,M,F,A,O,noconnection], O) + [N,M,F,A,O,Err0], O) catch _:Err1 -> error_with_info(Err1, [N, M, F, A, O]) end; - {spawn_reply, Ref, error, notsup} -> - case old_remote_spawn_opt(N, M, F, A, O) of - Pid when erlang:is_pid(Pid) -> - Pid; - Err2 -> - error_with_info(Err2, [N, M, F, A, O]) - end; - {spawn_reply, Ref, error, Err3} -> - error_with_info(Err3, [N, M, F, A, O]) + {spawn_reply, Ref, error, Err2} -> + error_with_info(Err2, [N, M, F, A, O]) end; spawn_opt(N,M,F,A,O) -> badarg_with_info([N,M,F,A,O]). - -old_remote_spawn_opt(N, M, F, A, O) -> - case lists:member(monitor, O) of - true -> - badarg; - _ -> - {L,NO} = lists:foldl(fun (link, {_, NewOpts}) -> - {link, NewOpts}; - (Opt, {LO, NewOpts}) -> - {LO, [Opt|NewOpts]} - end, - {no_link,[]}, - O), - case catch gen_server:call({net_kernel,N}, - {spawn_opt,M,F,A,NO,L,erlang:group_leader()}, - infinity) of - Pid when erlang:is_pid(Pid) -> - Pid; - Error -> - case remote_spawn_error(Error, {L, N, M, F, A, NO}) of - {fault, Fault} -> - Fault; - Pid -> - Pid - end - end - end. - -remote_spawn_error({'EXIT', {{nodedown,N}, _}}, {L, N, M, F, A, O}) -> - {Opts, LL} = case L =:= link of - true -> - {[link|O], [link]}; - false -> - {O, []} - end, - erlang:spawn_opt(erts_internal,crasher,[N,M,F,A,Opts,noconnection], LL); -remote_spawn_error({'EXIT', {Reason, _}}, _) -> - {fault, Reason}; -remote_spawn_error({'EXIT', Reason}, _) -> - {fault, Reason}; -remote_spawn_error(Other, _) -> - {fault, Other}. %% %% spawn_request/1 @@ -3495,7 +3467,28 @@ yield() -> -spec nodes() -> Nodes when Nodes :: [node()]. nodes() -> - erlang:nodes(visible). + erlang:nif_error(undefined). + +-spec nodes(Arg) -> Nodes when + Arg :: NodeType | [NodeType], + NodeType :: visible | hidden | connected | this | known, + Nodes :: [node()]. +nodes(_Arg) -> + erlang:nif_error(undefined). + +-spec nodes(Arg, InfoOpts) -> [NodeInfo] when + NodeType :: visible | hidden | connected | this | known, + Arg :: NodeType | [NodeType], + InfoOpts :: #{connection_id => boolean(), + node_type => boolean()}, + NodeTypeInfo :: visible | hidden | this | known, + ConnectionId :: undefined | integer(), + Info :: #{connection_id => ConnectionId, + node_type => NodeTypeInfo}, + NodeInfo :: {node(), Info}. + +nodes(_Args, _Opts) -> + erlang:nif_error(undefined). -spec disconnect_node(Node) -> boolean() | ignored when Node :: node(). @@ -3520,14 +3513,14 @@ fun_info_1([K|Ks], Fun, A) -> end; fun_info_1([], _, A) -> A. --type dst() :: pid() - | reference() - | port() - | (RegName :: atom()) - | {RegName :: atom(), Node :: node()}. +-type send_destination() :: pid() + | reference() + | port() + | (RegName :: atom()) + | {RegName :: atom(), Node :: node()}. -spec erlang:send_nosuspend(Dest, Msg) -> boolean() when - Dest :: dst(), + Dest :: send_destination(), Msg :: term(). send_nosuspend(Pid, Msg) -> try @@ -3537,7 +3530,7 @@ send_nosuspend(Pid, Msg) -> end. -spec erlang:send_nosuspend(Dest, Msg, Options) -> boolean() when - Dest :: dst(), + Dest :: send_destination(), Msg :: term(), Options :: [noconnect]. send_nosuspend(Pid, Msg, Opts) -> @@ -4032,6 +4025,7 @@ rvrs(Xs) -> rvrs(Xs, []). rvrs([],Ys) -> Ys; rvrs([X|Xs],Ys) -> rvrs(Xs, [X|Ys]). +%% Shadowed by erl_bif_types: erlang:min/2 -spec min(Term1, Term2) -> Minimum when Term1 :: term(), Term2 :: term(), @@ -4039,6 +4033,7 @@ rvrs([X|Xs],Ys) -> rvrs(Xs, [X|Ys]). min(A, B) when A > B -> B; min(A, _) -> A. +%% Shadowed by erl_bif_types: erlang:max/2 -spec max(Term1, Term2) -> Maximum when Term1 :: term(), Term2 :: term(), @@ -4459,7 +4454,7 @@ gc_info(Ref, N, {OrigColls,OrigRecl}) -> 'not'(_A) -> erlang:nif_error(undefined). --spec erlang:'!'(dst(), term()) -> term(). +-spec erlang:'!'(send_destination(), term()) -> term(). '!'(_Dst, _Msg) -> erlang:nif_error(undefined). |