From 7ff17ddfd337d1c49c1174d8d24b2ce0671b2c9e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?=
Date: Mon, 12 May 2014 14:26:30 +0200
Subject: BIFs should be considered exported
All BIFs now have stub functions and are exported. For example
in the erlang module:
-export([..., is_list/1, ...]).
.
.
.
is_list(_Term) ->
erlang:nif_error(undefined).
But erlang:function_exported(erlang, is_list, 1) returns false,
which is weird.
Change erlang:function_exported/3 to return true for BIFs.
---
erts/doc/src/erlang.xml | 9 +++++----
erts/emulator/beam/bif.c | 11 +++++++----
2 files changed, 12 insertions(+), 8 deletions(-)
(limited to 'erts')
diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index 0f4dfc0f98..03d184f4d2 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -1252,10 +1252,11 @@ true
Check if a function is exported and loaded
Returns true if the module Module is loaded
- and contains an exported function Function/Arity;
- otherwise false.
- Returns false for any BIF (functions implemented in C
- rather than in Erlang).
+ and contains an exported function Function/Arity,
+ or if there is a BIF (a built-in function implemented in C)
+ with the given name; otherwise returns false.
+ This function used to return false for built-in
+ functions before the 18.0 release.
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 06a1230ca0..787a3da1f4 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -3984,16 +3984,19 @@ BIF_RETTYPE halt_2(BIF_ALIST_2)
BIF_RETTYPE function_exported_3(BIF_ALIST_3)
{
+ int arity;
if (is_not_atom(BIF_ARG_1) ||
is_not_atom(BIF_ARG_2) ||
is_not_small(BIF_ARG_3)) {
BIF_ERROR(BIF_P, BADARG);
}
- if (erts_find_function(BIF_ARG_1, BIF_ARG_2, signed_val(BIF_ARG_3),
- erts_active_code_ix()) == NULL) {
- BIF_RET(am_false);
+ arity = signed_val(BIF_ARG_3);
+ if (erts_find_function(BIF_ARG_1, BIF_ARG_2, arity,
+ erts_active_code_ix()) != NULL ||
+ erts_is_builtin(BIF_ARG_1, BIF_ARG_2, arity)) {
+ BIF_RET(am_true);
}
- BIF_RET(am_true);
+ BIF_RET(am_false);
}
/**********************************************************************/
--
cgit v1.2.3