Skip to content

Instantly share code, notes, and snippets.

@devsnek
Created December 27, 2022 03:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devsnek/e7aabb4e93ce26ef217ceedc7fe85e24 to your computer and use it in GitHub Desktop.
Save devsnek/e7aabb4e93ce26ef217ceedc7fe85e24 to your computer and use it in GitHub Desktop.
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 41ba66062f..255bbc92b1 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -2404,7 +2473,7 @@ do_send(Process *p, Eterm to, Eterm msg, Eterm return_term, Eterm *refp,
}
}
-BIF_RETTYPE send_3(BIF_ALIST_3)
+BIF_RETTYPE erts_internal_send_3(BIF_ALIST_3)
{
BIF_RETTYPE retval;
Eterm ref;
@@ -2464,7 +2533,7 @@ BIF_RETTYPE send_3(BIF_ALIST_3)
break;
case SEND_YIELD:
if (suspend) {
- ERTS_BIF_PREP_YIELD3(retval, BIF_TRAP_EXPORT(BIF_send_3), p, to, msg, opts);
+ ERTS_BIF_PREP_YIELD3(retval, BIF_TRAP_EXPORT(BIF_erts_internal_send_3), p, to, msg, opts);
} else {
ERTS_BIF_PREP_RET(retval, am_nosuspend);
}
@@ -2506,7 +2575,7 @@ done:
return retval;
}
-BIF_RETTYPE send_2(BIF_ALIST_2)
+BIF_RETTYPE erts_internal_send_2(BIF_ALIST_2)
{
return erl_send(BIF_P, BIF_ARG_1, BIF_ARG_2);
}
@@ -2579,7 +2648,7 @@ Eterm erl_send(Process *p, Eterm to, Eterm msg)
ERTS_BIF_PREP_RET(retval, msg);
break;
case SEND_YIELD:
- ERTS_BIF_PREP_YIELD2(retval, BIF_TRAP_EXPORT(BIF_send_2), p, to, msg);
+ ERTS_BIF_PREP_YIELD2(retval, BIF_TRAP_EXPORT(BIF_erts_internal_send_2), p, to, msg);
break;
case SEND_YIELD_RETURN:
yield_return:
diff --git a/erts/emulator/beam/bif.tab b/erts/emulator/beam/bif.tab
index e1ca5a961b..3986297667 100644
--- a/erts/emulator/beam/bif.tab
+++ b/erts/emulator/beam/bif.tab
@@ -324,8 +324,8 @@ ubif erlang:'+'/1 splus_1
# internal references have been updated to the new ebif_... entries.
bif erlang:'!'/2 ebif_bang_2
-bif erlang:send/2
-bif erlang:send/3
+bif erts_internal:send/2
+bif erts_internal:send/3
bif erlang:'++'/2 ebif_plusplus_2
bif erlang:append/2
bif erlang:'--'/2 ebif_minusminus_2
diff --git a/erts/emulator/beam/jit/arm/instr_bif.cpp b/erts/emulator/beam/jit/arm/instr_bif.cpp
index 66efc4beba..2a506ffa8d 100644
--- a/erts/emulator/beam/jit/arm/instr_bif.cpp
+++ b/erts/emulator/beam/jit/arm/instr_bif.cpp
@@ -593,8 +593,8 @@ void BeamModuleAssembler::emit_send() {
* do it in the loader. */
a.bind(entry);
- a.ldr(ARG4, embed_constant(BIF_TRAP_EXPORT(BIF_send_2), disp32K));
- a.ldr(ARG8, embed_constant(send_2, disp32K));
+ a.ldr(ARG4, embed_constant(BIF_TRAP_EXPORT(BIF_erts_internal_send_2), disp32K));
+ a.ldr(ARG8, embed_constant(erts_internal_send_2, disp32K));
a.adr(ARG3, entry);
fragment_call(ga->get_call_light_bif_shared());
diff --git a/erts/emulator/beam/jit/x86/instr_bif.cpp b/erts/emulator/beam/jit/x86/instr_bif.cpp
index 33e80c6b90..15dfa5f336 100644
--- a/erts/emulator/beam/jit/x86/instr_bif.cpp
+++ b/erts/emulator/beam/jit/x86/instr_bif.cpp
@@ -648,8 +648,8 @@ void BeamModuleAssembler::emit_send() {
align_erlang_cp();
a.bind(entry);
- a.mov(ARG4, imm(BIF_TRAP_EXPORT(BIF_send_2)));
- a.mov(RET, imm(send_2));
+ a.mov(ARG4, imm(BIF_TRAP_EXPORT(BIF_erts_internal_send_2)));
+ a.mov(RET, imm(erts_internal_send_2));
a.lea(ARG3, x86::qword_ptr(entry));
fragment_call(ga->get_call_light_bif_shared());
diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl
index b650eb70aa..2afc46cb55 100644
--- a/erts/preloaded/src/erlang.erl
+++ b/erts/preloaded/src/erlang.erl
@@ -2589,16 +2589,16 @@ process_info(_Pid,_ItemSpec) ->
-spec erlang:send(Dest, Msg) -> Msg when
Dest :: send_destination(),
Msg :: term().
-send(_Dest,_Msg) ->
- erlang:nif_error(undefined).
+send(Dest, Msg) ->
+ erts_internal:send(Dest, Msg).
-spec erlang:send(Dest, Msg, Options) -> Res when
Dest :: send_destination(),
Msg :: term(),
Options :: [nosuspend | noconnect],
Res :: ok | nosuspend | noconnect.
-send(_Dest,_Msg,_Options) ->
- erlang:nif_error(undefined).
+send(Dest, Msg, Options) ->
+ erts_internal:send(Dest, Msg, Options).
%% Not documented
-spec erlang:seq_trace_info(send) -> {send, boolean()};
diff --git a/erts/preloaded/src/erts_internal.erl b/erts/preloaded/src/erts_internal.erl
index 2aa8739388..8cb0c18424 100644
--- a/erts/preloaded/src/erts_internal.erl
+++ b/erts/preloaded/src/erts_internal.erl
@@ -29,6 +29,8 @@
-module(erts_internal).
+-export([send/2, send/3]).
+
-export([await_port_send_result/3]).
-export([cmp_term/2]).
-export([map_to_tuple_keys/1, term_type/1, map_hashmap_children/1,
@@ -118,6 +120,26 @@
-export([dynamic_node_name/0, dynamic_node_name/1]).
+-type send_destination() :: pid()
+ | reference()
+ | port()
+ | (RegName :: atom())
+ | {RegName :: atom(), Node :: node()}.
+
+-spec erts_internal:send(Dest, Msg) -> Msg when
+ Dest :: send_destination(),
+ Msg :: term().
+send(_Dest, _Msg) ->
+ erlang:nif_error(undefined).
+
+-spec erts_internal:send(Dest, Msg, Options) -> Res when
+ Dest :: send_destination(),
+ Msg :: term(),
+ Options :: [nosuspend | noconnect],
+ Res :: ok | nosuspend | noconnect.
+send(_Dest, _Msg, _Options) ->
+ erlang:nif_error(undefined).
+
%%
%% Await result of send to port
%%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment