1%% ``Licensed under the Apache License, Version 2.0 (the "License"); 2%% you may not use this file except in compliance with the License. 3%% You may obtain a copy of the License at 4%% 5%% http://www.apache.org/licenses/LICENSE-2.0 6%% 7%% Unless required by applicable law or agreed to in writing, software 8%% distributed under the License is distributed on an "AS IS" BASIS, 9%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10%% See the License for the specific language governing permissions and 11%% limitations under the License. 12%% 13%% The Initial Developer of the Original Code is Ericsson Utvecklings AB. 14%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings 15%% AB. All Rights Reserved.'' 16%% 17%% $Id: erl_bifs.erl,v 1.2 2009/09/17 09:46:19 kostis Exp $ 18%% 19%% Purpose: Information about the Erlang built-in functions. 20 21-module(erl_bifs). 22 23-export([is_bif/3, is_guard_bif/3, is_pure/3, is_safe/3]). 24 25 26%% ===================================================================== 27%% is_bif(Module, Name, Arity) -> boolean() 28%% 29%% Module = Name = atom() 30%% Arity = integer() 31%% 32%% Returns `true' if the function `Module:Name/Arity' is a Built-In 33%% Function (BIF) of Erlang. BIFs "come with the implementation", 34%% and can be assumed to exist and have the same behaviour in any 35%% later versions of the same implementation of the language. Being 36%% a BIF does *not* imply that the function belongs to the module 37%% `erlang', nor that it is implemented in C or assembler (cf. 38%% `erlang:is_builtin/3'), or that it is auto-imported by the 39%% compiler (cf. `erl_internal:bif/3'). 40 41is_bif(erlang, '!', 2) -> true; 42is_bif(erlang, '*', 2) -> true; 43is_bif(erlang, '+', 1) -> true; 44is_bif(erlang, '+', 2) -> true; 45is_bif(erlang, '++', 2) -> true; 46is_bif(erlang, '-', 1) -> true; 47is_bif(erlang, '-', 2) -> true; 48is_bif(erlang, '--', 2) -> true; 49is_bif(erlang, '/', 2) -> true; 50is_bif(erlang, '/=', 2) -> true; 51is_bif(erlang, '<', 2) -> true; 52is_bif(erlang, '=/=', 2) -> true; 53is_bif(erlang, '=:=', 2) -> true; 54is_bif(erlang, '=<', 2) -> true; 55is_bif(erlang, '==', 2) -> true; 56is_bif(erlang, '>', 2) -> true; 57is_bif(erlang, '>=', 2) -> true; 58is_bif(erlang, 'and', 2) -> true; 59is_bif(erlang, 'band', 2) -> true; 60is_bif(erlang, 'bnot', 1) -> true; 61is_bif(erlang, 'bor', 2) -> true; 62is_bif(erlang, 'bsl', 2) -> true; 63is_bif(erlang, 'bsr', 2) -> true; 64is_bif(erlang, 'bxor', 2) -> true; 65is_bif(erlang, 'div', 2) -> true; 66is_bif(erlang, 'not', 1) -> true; 67is_bif(erlang, 'or', 2) -> true; 68is_bif(erlang, 'rem', 2) -> true; 69is_bif(erlang, 'xor', 2) -> true; 70is_bif(erlang, abs, 1) -> true; 71is_bif(erlang, append_element, 2) -> true; 72is_bif(erlang, apply, 2) -> true; 73is_bif(erlang, apply, 3) -> true; 74is_bif(erlang, atom_to_list, 1) -> true; 75is_bif(erlang, binary_to_list, 1) -> true; 76is_bif(erlang, binary_to_list, 3) -> true; 77is_bif(erlang, binary_to_term, 1) -> true; 78is_bif(erlang, cancel_timer, 1) -> true; 79is_bif(erlang, concat_binary, 1) -> true; 80is_bif(erlang, date, 0) -> true; 81is_bif(erlang, demonitor, 1) -> true; 82is_bif(erlang, disconnect_node, 1) -> true; 83is_bif(erlang, display, 1) -> true; 84is_bif(erlang, element, 2) -> true; 85is_bif(erlang, erase, 0) -> true; 86is_bif(erlang, erase, 1) -> true; 87is_bif(erlang, error, 1) -> true; 88is_bif(erlang, error, 2) -> true; 89is_bif(erlang, exit, 1) -> true; 90is_bif(erlang, exit, 2) -> true; 91is_bif(erlang, fault, 1) -> true; 92is_bif(erlang, fault, 2) -> true; 93is_bif(erlang, float, 1) -> true; 94is_bif(erlang, float_to_list, 1) -> true; 95is_bif(erlang, fun_info, 1) -> true; 96is_bif(erlang, fun_info, 2) -> true; 97is_bif(erlang, fun_to_list, 1) -> true; 98is_bif(erlang, get, 0) -> true; 99is_bif(erlang, get, 1) -> true; 100is_bif(erlang, get_cookie, 0) -> true; 101is_bif(erlang, get_keys, 1) -> true; 102is_bif(erlang, group_leader, 0) -> true; 103is_bif(erlang, group_leader, 2) -> true; 104is_bif(erlang, halt, 0) -> false; 105is_bif(erlang, halt, 1) -> false; 106is_bif(erlang, hash, 2) -> false; 107is_bif(erlang, hd, 1) -> true; 108is_bif(erlang, info, 1) -> true; 109is_bif(erlang, integer_to_list, 1) -> true; 110is_bif(erlang, is_alive, 0) -> true; 111is_bif(erlang, is_atom, 1) -> true; 112is_bif(erlang, is_binary, 1) -> true; 113is_bif(erlang, is_boolean, 1) -> true; 114is_bif(erlang, is_builtin, 3) -> true; 115is_bif(erlang, is_constant, 1) -> true; 116is_bif(erlang, is_float, 1) -> true; 117is_bif(erlang, is_function, 1) -> true; 118is_bif(erlang, is_integer, 1) -> true; 119is_bif(erlang, is_list, 1) -> true; 120is_bif(erlang, is_number, 1) -> true; 121is_bif(erlang, is_pid, 1) -> true; 122is_bif(erlang, is_port, 1) -> true; 123is_bif(erlang, is_process_alive, 1) -> true; 124is_bif(erlang, is_record, 3) -> true; 125is_bif(erlang, is_reference, 1) -> true; 126is_bif(erlang, is_tuple, 1) -> true; 127is_bif(erlang, length, 1) -> true; 128is_bif(erlang, link, 1) -> true; 129is_bif(erlang, list_to_atom, 1) -> true; 130is_bif(erlang, list_to_binary, 1) -> true; 131is_bif(erlang, list_to_float, 1) -> true; 132is_bif(erlang, list_to_integer, 1) -> true; 133is_bif(erlang, list_to_pid, 1) -> true; 134is_bif(erlang, list_to_tuple, 1) -> true; 135is_bif(erlang, loaded, 0) -> true; 136is_bif(erlang, localtime, 0) -> true; 137is_bif(erlang, localtime_to_universaltime, 1) -> true; 138is_bif(erlang, make_ref, 0) -> true; 139is_bif(erlang, make_tuple, 2) -> true; 140is_bif(erlang, md5, 1) -> true; 141is_bif(erlang, md5_final, 1) -> true; 142is_bif(erlang, md5_init, 0) -> true; 143is_bif(erlang, md5_update, 2) -> true; 144is_bif(erlang, monitor, 2) -> true; 145is_bif(erlang, monitor_node, 2) -> true; 146is_bif(erlang, node, 0) -> true; 147is_bif(erlang, node, 1) -> true; 148is_bif(erlang, nodes, 0) -> true; 149is_bif(erlang, now, 0) -> true; 150is_bif(erlang, open_port, 2) -> true; 151is_bif(erlang, phash, 2) -> true; 152is_bif(erlang, pid_to_list, 1) -> true; 153is_bif(erlang, port_close, 2) -> true; 154is_bif(erlang, port_command, 2) -> true; 155is_bif(erlang, port_connect, 2) -> true; 156is_bif(erlang, port_control, 3) -> true; 157is_bif(erlang, port_info, 2) -> true; 158is_bif(erlang, port_to_list, 1) -> true; 159is_bif(erlang, ports, 0) -> true; 160is_bif(erlang, pre_loaded, 0) -> true; 161is_bif(erlang, process_display, 2) -> true; 162is_bif(erlang, process_flag, 2) -> true; 163is_bif(erlang, process_flag, 3) -> true; 164is_bif(erlang, process_info, 1) -> true; 165is_bif(erlang, process_info, 2) -> true; 166is_bif(erlang, processes, 0) -> true; 167is_bif(erlang, put, 2) -> true; 168is_bif(erlang, read_timer, 1) -> true; 169is_bif(erlang, ref_to_list, 1) -> true; 170is_bif(erlang, register, 2) -> true; 171is_bif(erlang, registered, 0) -> true; 172is_bif(erlang, resume_process, 1) -> true; 173is_bif(erlang, round, 1) -> true; 174is_bif(erlang, self, 0) -> true; 175is_bif(erlang, send_after, 3) -> true; 176is_bif(erlang, set_cookie, 2) -> true; 177is_bif(erlang, setelement, 3) -> true; 178is_bif(erlang, size, 1) -> true; 179is_bif(erlang, spawn, 1) -> true; 180is_bif(erlang, spawn, 2) -> true; 181is_bif(erlang, spawn, 3) -> true; 182is_bif(erlang, spawn, 4) -> true; 183is_bif(erlang, spawn_link, 1) -> true; 184is_bif(erlang, spawn_link, 2) -> true; 185is_bif(erlang, spawn_link, 3) -> true; 186is_bif(erlang, spawn_link, 4) -> true; 187is_bif(erlang, spawn_opt, 4) -> true; 188is_bif(erlang, split_binary, 2) -> true; 189is_bif(erlang, start_timer, 3) -> true; 190is_bif(erlang, statistics, 1) -> true; 191is_bif(erlang, suspend_process, 1) -> true; 192is_bif(erlang, system_flag, 2) -> true; 193is_bif(erlang, system_info, 1) -> true; 194is_bif(erlang, term_to_binary, 1) -> true; 195is_bif(erlang, term_to_binary, 2) -> true; 196is_bif(erlang, throw, 1) -> true; 197is_bif(erlang, time, 0) -> true; 198is_bif(erlang, tl, 1) -> true; 199is_bif(erlang, trace, 3) -> true; 200is_bif(erlang, trace_info, 2) -> true; 201is_bif(erlang, trace_pattern, 2) -> true; 202is_bif(erlang, trace_pattern, 3) -> true; 203is_bif(erlang, trunc, 1) -> true; 204is_bif(erlang, tuple_to_list, 1) -> true; 205is_bif(erlang, universaltime, 0) -> true; 206is_bif(erlang, universaltime_to_localtime, 1) -> true; 207is_bif(erlang, unlink, 1) -> true; 208is_bif(erlang, unregister, 1) -> true; 209is_bif(erlang, whereis, 1) -> true; 210is_bif(erlang, yield, 0) -> true; 211is_bif(lists, append, 2) -> true; 212is_bif(lists, reverse, 1) -> true; 213is_bif(lists, reverse, 2) -> true; 214is_bif(lists, subtract, 2) -> true; 215is_bif(math, acos, 1) -> true; 216is_bif(math, acosh, 1) -> true; 217is_bif(math, asin, 1) -> true; 218is_bif(math, asinh, 1) -> true; 219is_bif(math, atan, 1) -> true; 220is_bif(math, atan2, 2) -> true; 221is_bif(math, atanh, 1) -> true; 222is_bif(math, cos, 1) -> true; 223is_bif(math, cosh, 1) -> true; 224is_bif(math, erf, 1) -> true; 225is_bif(math, erfc, 1) -> true; 226is_bif(math, exp, 1) -> true; 227is_bif(math, log, 1) -> true; 228is_bif(math, log10, 1) -> true; 229is_bif(math, pow, 2) -> true; 230is_bif(math, sin, 1) -> true; 231is_bif(math, sinh, 1) -> true; 232is_bif(math, sqrt, 1) -> true; 233is_bif(math, tan, 1) -> true; 234is_bif(math, tanh, 1) -> true; 235is_bif(_, _, _) -> false. 236 237 238%% ===================================================================== 239%% is_guard_bif(Module, Name, Arity) -> boolean() 240%% 241%% Module = Name = atom() 242%% Arity = integer() 243%% 244%% Returns `true' if the built-in function `Module:Name/Arity' may 245%% be called from a clause guard. Note that such "guard BIFs" are 246%% not necessarily "pure", since some (notably `erlang:self/0') may 247%% depend on the current state, nor "safe", since many guard BIFs 248%% can fail. Also note that even a "pure" function could be 249%% unsuitable for calling from a guard because of its time or space 250%% complexity. 251 252is_guard_bif(erlang, '*', 2) -> true; 253is_guard_bif(erlang, '+', 1) -> true; 254is_guard_bif(erlang, '+', 2) -> true; 255is_guard_bif(erlang, '-', 1) -> true; 256is_guard_bif(erlang, '-', 2) -> true; 257is_guard_bif(erlang, '/', 2) -> true; 258is_guard_bif(erlang, '/=', 2) -> true; 259is_guard_bif(erlang, '<', 2) -> true; 260is_guard_bif(erlang, '=/=', 2) -> true; 261is_guard_bif(erlang, '=:=', 2) -> true; 262is_guard_bif(erlang, '=<', 2) -> true; 263is_guard_bif(erlang, '==', 2) -> true; 264is_guard_bif(erlang, '>', 2) -> true; 265is_guard_bif(erlang, '>=', 2) -> true; 266is_guard_bif(erlang, 'and', 2) -> true; 267is_guard_bif(erlang, 'band', 2) -> true; 268is_guard_bif(erlang, 'bnot', 1) -> true; 269is_guard_bif(erlang, 'bor', 2) -> true; 270is_guard_bif(erlang, 'bsl', 2) -> true; 271is_guard_bif(erlang, 'bsr', 2) -> true; 272is_guard_bif(erlang, 'bxor', 2) -> true; 273is_guard_bif(erlang, 'div', 2) -> true; 274is_guard_bif(erlang, 'not', 1) -> true; 275is_guard_bif(erlang, 'or', 2) -> true; 276is_guard_bif(erlang, 'rem', 2) -> true; 277is_guard_bif(erlang, 'xor', 2) -> true; 278is_guard_bif(erlang, abs, 1) -> true; 279is_guard_bif(erlang, element, 2) -> true; 280is_guard_bif(erlang, error, 1) -> true; % unorthodox 281is_guard_bif(erlang, exit, 1) -> true; % unorthodox 282is_guard_bif(erlang, fault, 1) -> true; % unorthodox 283is_guard_bif(erlang, float, 1) -> true; % (the type coercion function) 284is_guard_bif(erlang, hd, 1) -> true; 285is_guard_bif(erlang, is_atom, 1) -> true; 286is_guard_bif(erlang, is_boolean, 1) -> true; 287is_guard_bif(erlang, is_binary, 1) -> true; 288is_guard_bif(erlang, is_constant, 1) -> true; 289is_guard_bif(erlang, is_float, 1) -> true; 290is_guard_bif(erlang, is_function, 1) -> true; 291is_guard_bif(erlang, is_integer, 1) -> true; 292is_guard_bif(erlang, is_list, 1) -> true; 293is_guard_bif(erlang, is_number, 1) -> true; 294is_guard_bif(erlang, is_pid, 1) -> true; 295is_guard_bif(erlang, is_port, 1) -> true; 296is_guard_bif(erlang, is_reference, 1) -> true; 297is_guard_bif(erlang, is_tuple, 1) -> true; 298is_guard_bif(erlang, length, 1) -> true; 299is_guard_bif(erlang, list_to_atom, 1) -> true; % unorthodox 300is_guard_bif(erlang, node, 0) -> true; % (not pure) 301is_guard_bif(erlang, node, 1) -> true; % (not pure) 302is_guard_bif(erlang, round, 1) -> true; 303is_guard_bif(erlang, self, 0) -> true; % (not pure) 304is_guard_bif(erlang, size, 1) -> true; 305is_guard_bif(erlang, throw, 1) -> true; % unorthodox 306is_guard_bif(erlang, tl, 1) -> true; 307is_guard_bif(erlang, trunc, 1) -> true; 308is_guard_bif(math, acos, 1) -> true; % unorthodox 309is_guard_bif(math, acosh, 1) -> true; % unorthodox 310is_guard_bif(math, asin, 1) -> true; % unorthodox 311is_guard_bif(math, asinh, 1) -> true; % unorthodox 312is_guard_bif(math, atan, 1) -> true; % unorthodox 313is_guard_bif(math, atan2, 2) -> true; % unorthodox 314is_guard_bif(math, atanh, 1) -> true; % unorthodox 315is_guard_bif(math, cos, 1) -> true; % unorthodox 316is_guard_bif(math, cosh, 1) -> true; % unorthodox 317is_guard_bif(math, erf, 1) -> true; % unorthodox 318is_guard_bif(math, erfc, 1) -> true; % unorthodox 319is_guard_bif(math, exp, 1) -> true; % unorthodox 320is_guard_bif(math, log, 1) -> true; % unorthodox 321is_guard_bif(math, log10, 1) -> true; % unorthodox 322is_guard_bif(math, pow, 2) -> true; % unorthodox 323is_guard_bif(math, sin, 1) -> true; % unorthodox 324is_guard_bif(math, sinh, 1) -> true; % unorthodox 325is_guard_bif(math, sqrt, 1) -> true; % unorthodox 326is_guard_bif(math, tan, 1) -> true; % unorthodox 327is_guard_bif(math, tanh, 1) -> true; % unorthodox 328is_guard_bif(_, _, _) -> false. 329 330 331%% ===================================================================== 332%% is_pure(Module, Name, Arity) -> boolean() 333%% 334%% Module = Name = atom() 335%% Arity = integer() 336%% 337%% Returns `true' if the function `Module:Name/Arity' does not 338%% affect the state, nor depend on the state, although its 339%% evaluation is not guaranteed to complete normally for all input. 340 341is_pure(erlang, '*', 2) -> true; 342is_pure(erlang, '+', 1) -> true; % (even for non-numbers) 343is_pure(erlang, '+', 2) -> true; 344is_pure(erlang, '++', 2) -> true; 345is_pure(erlang, '-', 1) -> true; 346is_pure(erlang, '-', 2) -> true; 347is_pure(erlang, '--', 2) -> true; 348is_pure(erlang, '/', 2) -> true; 349is_pure(erlang, '/=', 2) -> true; 350is_pure(erlang, '<', 2) -> true; 351is_pure(erlang, '=/=', 2) -> true; 352is_pure(erlang, '=:=', 2) -> true; 353is_pure(erlang, '=<', 2) -> true; 354is_pure(erlang, '==', 2) -> true; 355is_pure(erlang, '>', 2) -> true; 356is_pure(erlang, '>=', 2) -> true; 357is_pure(erlang, 'and', 2) -> true; 358is_pure(erlang, 'band', 2) -> true; 359is_pure(erlang, 'bnot', 1) -> true; 360is_pure(erlang, 'bor', 2) -> true; 361is_pure(erlang, 'bsl', 2) -> true; 362is_pure(erlang, 'bsr', 2) -> true; 363is_pure(erlang, 'bxor', 2) -> true; 364is_pure(erlang, 'div', 2) -> true; 365is_pure(erlang, 'not', 1) -> true; 366is_pure(erlang, 'or', 2) -> true; 367is_pure(erlang, 'rem', 2) -> true; 368is_pure(erlang, 'xor', 2) -> true; 369is_pure(erlang, abs, 1) -> true; 370is_pure(erlang, atom_to_list, 1) -> true; 371is_pure(erlang, binary_to_list, 1) -> true; 372is_pure(erlang, binary_to_list, 3) -> true; 373is_pure(erlang, concat_binary, 1) -> true; 374is_pure(erlang, element, 2) -> true; 375is_pure(erlang, float, 1) -> true; 376is_pure(erlang, float_to_list, 1) -> true; 377is_pure(erlang, hash, 2) -> false; 378is_pure(erlang, hd, 1) -> true; 379is_pure(erlang, integer_to_list, 1) -> true; 380is_pure(erlang, is_atom, 1) -> true; 381is_pure(erlang, is_boolean, 1) -> true; 382is_pure(erlang, is_binary, 1) -> true; 383is_pure(erlang, is_builtin, 3) -> true; 384is_pure(erlang, is_constant, 1) -> true; 385is_pure(erlang, is_float, 1) -> true; 386is_pure(erlang, is_function, 1) -> true; 387is_pure(erlang, is_integer, 1) -> true; 388is_pure(erlang, is_list, 1) -> true; 389is_pure(erlang, is_number, 1) -> true; 390is_pure(erlang, is_pid, 1) -> true; 391is_pure(erlang, is_port, 1) -> true; 392is_pure(erlang, is_record, 3) -> true; 393is_pure(erlang, is_reference, 1) -> true; 394is_pure(erlang, is_tuple, 1) -> true; 395is_pure(erlang, length, 1) -> true; 396is_pure(erlang, list_to_atom, 1) -> true; 397is_pure(erlang, list_to_binary, 1) -> true; 398is_pure(erlang, list_to_float, 1) -> true; 399is_pure(erlang, list_to_integer, 1) -> true; 400is_pure(erlang, list_to_pid, 1) -> true; 401is_pure(erlang, list_to_tuple, 1) -> true; 402is_pure(erlang, phash, 2) -> false; 403is_pure(erlang, pid_to_list, 1) -> true; 404is_pure(erlang, round, 1) -> true; 405is_pure(erlang, setelement, 3) -> true; 406is_pure(erlang, size, 1) -> true; 407is_pure(erlang, split_binary, 2) -> true; 408is_pure(erlang, term_to_binary, 1) -> true; 409is_pure(erlang, tl, 1) -> true; 410is_pure(erlang, trunc, 1) -> true; 411is_pure(erlang, tuple_to_list, 1) -> true; 412is_pure(lists, append, 2) -> true; 413is_pure(lists, subtract, 2) -> true; 414is_pure(math, acos, 1) -> true; 415is_pure(math, acosh, 1) -> true; 416is_pure(math, asin, 1) -> true; 417is_pure(math, asinh, 1) -> true; 418is_pure(math, atan, 1) -> true; 419is_pure(math, atan2, 2) -> true; 420is_pure(math, atanh, 1) -> true; 421is_pure(math, cos, 1) -> true; 422is_pure(math, cosh, 1) -> true; 423is_pure(math, erf, 1) -> true; 424is_pure(math, erfc, 1) -> true; 425is_pure(math, exp, 1) -> true; 426is_pure(math, log, 1) -> true; 427is_pure(math, log10, 1) -> true; 428is_pure(math, pow, 2) -> true; 429is_pure(math, sin, 1) -> true; 430is_pure(math, sinh, 1) -> true; 431is_pure(math, sqrt, 1) -> true; 432is_pure(math, tan, 1) -> true; 433is_pure(math, tanh, 1) -> true; 434is_pure(_, _, _) -> false. 435 436 437%% ===================================================================== 438%% is_safe(Module, Name, Arity) -> boolean() 439%% 440%% Module = Name = atom() 441%% Arity = integer() 442%% 443%% Returns `true' if the function `Module:Name/Arity' is completely 444%% effect free, i.e., if its evaluation always completes normally 445%% and does not affect the state (although the value it returns 446%% might depend on the state). 447 448is_safe(erlang, '/=', 2) -> true; 449is_safe(erlang, '<', 2) -> true; 450is_safe(erlang, '=/=', 2) -> true; 451is_safe(erlang, '=:=', 2) -> true; 452is_safe(erlang, '=<', 2) -> true; 453is_safe(erlang, '==', 2) -> true; 454is_safe(erlang, '>', 2) -> true; 455is_safe(erlang, '>=', 2) -> true; 456is_safe(erlang, date, 0) -> true; 457is_safe(erlang, get, 0) -> true; 458is_safe(erlang, get, 1) -> true; 459is_safe(erlang, get_cookie, 0) -> true; 460is_safe(erlang, get_keys, 1) -> true; 461is_safe(erlang, group_leader, 0) -> true; 462is_safe(erlang, is_alive, 0) -> true; 463is_safe(erlang, is_atom, 1) -> true; 464is_safe(erlang, is_boolean, 1) -> true; 465is_safe(erlang, is_binary, 1) -> true; 466is_safe(erlang, is_constant, 1) -> true; 467is_safe(erlang, is_float, 1) -> true; 468is_safe(erlang, is_function, 1) -> true; 469is_safe(erlang, is_integer, 1) -> true; 470is_safe(erlang, is_list, 1) -> true; 471is_safe(erlang, is_number, 1) -> true; 472is_safe(erlang, is_pid, 1) -> true; 473is_safe(erlang, is_port, 1) -> true; 474is_safe(erlang, is_record, 3) -> true; 475is_safe(erlang, is_reference, 1) -> true; 476is_safe(erlang, is_tuple, 1) -> true; 477is_safe(erlang, make_ref, 0) -> true; 478is_safe(erlang, node, 0) -> true; 479is_safe(erlang, nodes, 0) -> true; 480is_safe(erlang, ports, 0) -> true; 481is_safe(erlang, pre_loaded, 0) -> true; 482is_safe(erlang, processes, 0) -> true; 483is_safe(erlang, registered, 0) -> true; 484is_safe(erlang, self, 0) -> true; 485is_safe(erlang, term_to_binary, 1) -> true; 486is_safe(erlang, time, 0) -> true; 487is_safe(_, _, _) -> false. 488