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