/source/otp_src_R14B02/lib/compiler/src/erl_bifs.erl

https://github.com/cparedes/omnibus · Erlang · 219 lines · 155 code · 13 blank · 51 comment · 0 complexity · 1c1bcfafed2d6c48c382609d5002156f MD5 · raw file

  1. %%
  2. %% %CopyrightBegin%
  3. %%
  4. %% Copyright Ericsson AB 2001-2010. All Rights Reserved.
  5. %%
  6. %% The contents of this file are subject to the Erlang Public License,
  7. %% Version 1.1, (the "License"); you may not use this file except in
  8. %% compliance with the License. You should have received a copy of the
  9. %% Erlang Public License along with this software. If not, it can be
  10. %% retrieved online at http://www.erlang.org/.
  11. %%
  12. %% Software distributed under the License is distributed on an "AS IS"
  13. %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  14. %% the License for the specific language governing rights and limitations
  15. %% under the License.
  16. %%
  17. %% %CopyrightEnd%
  18. %%
  19. %% Purpose: Information about the Erlang built-in functions.
  20. -module(erl_bifs).
  21. -export([is_pure/3, is_safe/3, is_exit_bif/3]).
  22. %% =====================================================================
  23. %% is_pure(Module, Name, Arity) -> boolean()
  24. %%
  25. %% Module = Name = atom()
  26. %% Arity = integer()
  27. %%
  28. %% Returns `true' if the function `Module:Name/Arity' does not
  29. %% affect the state, nor depend on the state, although its
  30. %% evaluation is not guaranteed to complete normally for all input.
  31. -spec is_pure(atom(), atom(), arity()) -> boolean().
  32. is_pure(erlang, '*', 2) -> true;
  33. is_pure(erlang, '+', 1) -> true; % (even for non-numbers)
  34. is_pure(erlang, '+', 2) -> true;
  35. is_pure(erlang, '++', 2) -> true;
  36. is_pure(erlang, '-', 1) -> true;
  37. is_pure(erlang, '-', 2) -> true;
  38. is_pure(erlang, '--', 2) -> true;
  39. is_pure(erlang, '/', 2) -> true;
  40. is_pure(erlang, '/=', 2) -> true;
  41. is_pure(erlang, '<', 2) -> true;
  42. is_pure(erlang, '=/=', 2) -> true;
  43. is_pure(erlang, '=:=', 2) -> true;
  44. is_pure(erlang, '=<', 2) -> true;
  45. is_pure(erlang, '==', 2) -> true;
  46. is_pure(erlang, '>', 2) -> true;
  47. is_pure(erlang, '>=', 2) -> true;
  48. is_pure(erlang, 'and', 2) -> true;
  49. is_pure(erlang, 'band', 2) -> true;
  50. is_pure(erlang, 'bnot', 1) -> true;
  51. is_pure(erlang, 'bor', 2) -> true;
  52. is_pure(erlang, 'bsl', 2) -> true;
  53. is_pure(erlang, 'bsr', 2) -> true;
  54. is_pure(erlang, 'bxor', 2) -> true;
  55. is_pure(erlang, 'div', 2) -> true;
  56. is_pure(erlang, 'not', 1) -> true;
  57. is_pure(erlang, 'or', 2) -> true;
  58. is_pure(erlang, 'rem', 2) -> true;
  59. is_pure(erlang, 'xor', 2) -> true;
  60. is_pure(erlang, abs, 1) -> true;
  61. is_pure(erlang, atom_to_binary, 2) -> true;
  62. is_pure(erlang, atom_to_list, 1) -> true;
  63. is_pure(erlang, binary_part, 2) -> true;
  64. is_pure(erlang, binary_part, 3) -> true;
  65. is_pure(erlang, binary_to_atom, 2) -> true;
  66. is_pure(erlang, binary_to_list, 1) -> true;
  67. is_pure(erlang, binary_to_list, 3) -> true;
  68. is_pure(erlang, bit_size, 1) -> true;
  69. is_pure(erlang, byte_size, 1) -> true;
  70. is_pure(erlang, concat_binary, 1) -> true;
  71. is_pure(erlang, element, 2) -> true;
  72. is_pure(erlang, float, 1) -> true;
  73. is_pure(erlang, float_to_list, 1) -> true;
  74. is_pure(erlang, hash, 2) -> false;
  75. is_pure(erlang, hd, 1) -> true;
  76. is_pure(erlang, integer_to_list, 1) -> true;
  77. is_pure(erlang, is_atom, 1) -> true;
  78. is_pure(erlang, is_boolean, 1) -> true;
  79. is_pure(erlang, is_binary, 1) -> true;
  80. is_pure(erlang, is_bitstring, 1) -> true;
  81. %% erlang:is_builtin/3 depends on the state (i.e. the version of the emulator).
  82. is_pure(erlang, is_float, 1) -> true;
  83. is_pure(erlang, is_function, 1) -> true;
  84. is_pure(erlang, is_integer, 1) -> true;
  85. is_pure(erlang, is_list, 1) -> true;
  86. is_pure(erlang, is_number, 1) -> true;
  87. is_pure(erlang, is_pid, 1) -> true;
  88. is_pure(erlang, is_port, 1) -> true;
  89. is_pure(erlang, is_record, 2) -> true;
  90. is_pure(erlang, is_record, 3) -> true;
  91. is_pure(erlang, is_reference, 1) -> true;
  92. is_pure(erlang, is_tuple, 1) -> true;
  93. is_pure(erlang, length, 1) -> true;
  94. is_pure(erlang, list_to_atom, 1) -> true;
  95. is_pure(erlang, list_to_binary, 1) -> true;
  96. is_pure(erlang, list_to_float, 1) -> true;
  97. is_pure(erlang, list_to_integer, 1) -> true;
  98. is_pure(erlang, list_to_pid, 1) -> true;
  99. is_pure(erlang, list_to_tuple, 1) -> true;
  100. is_pure(erlang, max, 2) -> true;
  101. is_pure(erlang, min, 2) -> true;
  102. is_pure(erlang, phash, 2) -> false;
  103. is_pure(erlang, pid_to_list, 1) -> true;
  104. is_pure(erlang, round, 1) -> true;
  105. is_pure(erlang, setelement, 3) -> true;
  106. is_pure(erlang, size, 1) -> true;
  107. is_pure(erlang, split_binary, 2) -> true;
  108. is_pure(erlang, term_to_binary, 1) -> true;
  109. is_pure(erlang, tl, 1) -> true;
  110. is_pure(erlang, trunc, 1) -> true;
  111. is_pure(erlang, tuple_size, 1) -> true;
  112. is_pure(erlang, tuple_to_list, 1) -> true;
  113. is_pure(lists, append, 2) -> true;
  114. is_pure(lists, subtract, 2) -> true;
  115. is_pure(math, acos, 1) -> true;
  116. is_pure(math, acosh, 1) -> true;
  117. is_pure(math, asin, 1) -> true;
  118. is_pure(math, asinh, 1) -> true;
  119. is_pure(math, atan, 1) -> true;
  120. is_pure(math, atan2, 2) -> true;
  121. is_pure(math, atanh, 1) -> true;
  122. is_pure(math, cos, 1) -> true;
  123. is_pure(math, cosh, 1) -> true;
  124. is_pure(math, erf, 1) -> true;
  125. is_pure(math, erfc, 1) -> true;
  126. is_pure(math, exp, 1) -> true;
  127. is_pure(math, log, 1) -> true;
  128. is_pure(math, log10, 1) -> true;
  129. is_pure(math, pow, 2) -> true;
  130. is_pure(math, sin, 1) -> true;
  131. is_pure(math, sinh, 1) -> true;
  132. is_pure(math, sqrt, 1) -> true;
  133. is_pure(math, tan, 1) -> true;
  134. is_pure(math, tanh, 1) -> true;
  135. is_pure(_, _, _) -> false.
  136. %% =====================================================================
  137. %% is_safe(Module, Name, Arity) -> boolean()
  138. %%
  139. %% Module = Name = atom()
  140. %% Arity = integer()
  141. %%
  142. %% Returns `true' if the function `Module:Name/Arity' is completely
  143. %% effect free, i.e., if its evaluation always completes normally
  144. %% and does not affect the state (although the value it returns
  145. %% might depend on the state).
  146. %%
  147. %% Note: is_function/2 and is_record/3 are NOT safe: is_function(X, foo)
  148. %% and is_record(X, foo, bar) will fail.
  149. -spec is_safe(atom(), atom(), arity()) -> boolean().
  150. is_safe(erlang, '/=', 2) -> true;
  151. is_safe(erlang, '<', 2) -> true;
  152. is_safe(erlang, '=/=', 2) -> true;
  153. is_safe(erlang, '=:=', 2) -> true;
  154. is_safe(erlang, '=<', 2) -> true;
  155. is_safe(erlang, '==', 2) -> true;
  156. is_safe(erlang, '>', 2) -> true;
  157. is_safe(erlang, '>=', 2) -> true;
  158. is_safe(erlang, date, 0) -> true;
  159. is_safe(erlang, get, 0) -> true;
  160. is_safe(erlang, get, 1) -> true;
  161. is_safe(erlang, get_cookie, 0) -> true;
  162. is_safe(erlang, get_keys, 1) -> true;
  163. is_safe(erlang, group_leader, 0) -> true;
  164. is_safe(erlang, is_alive, 0) -> true;
  165. is_safe(erlang, is_atom, 1) -> true;
  166. is_safe(erlang, is_boolean, 1) -> true;
  167. is_safe(erlang, is_binary, 1) -> true;
  168. is_safe(erlang, is_bitstring, 1) -> true;
  169. is_safe(erlang, is_float, 1) -> true;
  170. is_safe(erlang, is_function, 1) -> true;
  171. is_safe(erlang, is_integer, 1) -> true;
  172. is_safe(erlang, is_list, 1) -> true;
  173. is_safe(erlang, is_number, 1) -> true;
  174. is_safe(erlang, is_pid, 1) -> true;
  175. is_safe(erlang, is_port, 1) -> true;
  176. is_safe(erlang, is_reference, 1) -> true;
  177. is_safe(erlang, is_tuple, 1) -> true;
  178. is_safe(erlang, make_ref, 0) -> true;
  179. is_safe(erlang, max, 2) -> true;
  180. is_safe(erlang, min, 2) -> true;
  181. is_safe(erlang, node, 0) -> true;
  182. is_safe(erlang, nodes, 0) -> true;
  183. is_safe(erlang, ports, 0) -> true;
  184. is_safe(erlang, pre_loaded, 0) -> true;
  185. is_safe(erlang, processes, 0) -> true;
  186. is_safe(erlang, registered, 0) -> true;
  187. is_safe(erlang, self, 0) -> true;
  188. is_safe(erlang, term_to_binary, 1) -> true;
  189. is_safe(erlang, time, 0) -> true;
  190. is_safe(error_logger, warning_map, 0) -> true;
  191. is_safe(_, _, _) -> false.
  192. %% =====================================================================
  193. %% is_exit_bif(Module, Name, Arity) -> boolean()
  194. %%
  195. %% Module = Name = atom()
  196. %% Arity = integer()
  197. %%
  198. %% Returns `true' if the function `Module:Name/Arity' never returns
  199. %% normally, i.e., if it always causes an exception regardless of
  200. %% its arguments.
  201. -spec is_exit_bif(atom(), atom(), arity()) -> boolean().
  202. is_exit_bif(erlang, exit, 1) -> true;
  203. is_exit_bif(erlang, throw, 1) -> true;
  204. is_exit_bif(erlang, error, 1) -> true;
  205. is_exit_bif(erlang, error, 2) -> true;
  206. is_exit_bif(_, _, _) -> false.