summaryrefslogtreecommitdiff
path: root/erts/preloaded/src/erlang.erl
diff options
context:
space:
mode:
Diffstat (limited to 'erts/preloaded/src/erlang.erl')
-rw-r--r--erts/preloaded/src/erlang.erl185
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).