diff options
author | Björn Gustavsson <[email protected]> | 2017-11-28 07:28:25 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-01-22 14:23:52 +0100 |
commit | 9b0122b65bdcafbae2a3cfd3299903da0948acab (patch) | |
tree | 59405671dad4d8240978faaf4ea8e3dcdff289b5 /lib/hipe/icode/hipe_icode_primops.erl | |
parent | b7ff9c0d76372f16d14ecaac04c6fbbbadaf9435 (diff) | |
download | otp-9b0122b65bdcafbae2a3cfd3299903da0948acab.tar.gz otp-9b0122b65bdcafbae2a3cfd3299903da0948acab.tar.bz2 otp-9b0122b65bdcafbae2a3cfd3299903da0948acab.zip |
Don't build a stacktrace if it's only passed to erlang:raise/3
Consider the following function:
function({function,Name,Arity,CLabel,Is0}, Lc0) ->
try
%% Optimize the code for the function.
catch
Class:Error:Stack ->
io:format("Function: ~w/~w\n", [Name,Arity]),
erlang:raise(Class, Error, Stack)
end.
The stacktrace is retrieved, but it is only used in the call
to erlang:raise/3. There is no need to build a stacktrace
in this function. We can avoid the building if we introduce
an instruction called raw_raise/3 that works exactly like
the erlang:raise/3 BIF except that its third argument must
be a raw stacktrace.
Diffstat (limited to 'lib/hipe/icode/hipe_icode_primops.erl')
-rw-r--r-- | lib/hipe/icode/hipe_icode_primops.erl | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/lib/hipe/icode/hipe_icode_primops.erl b/lib/hipe/icode/hipe_icode_primops.erl index 941516e8b1..a1f1128124 100644 --- a/lib/hipe/icode/hipe_icode_primops.erl +++ b/lib/hipe/icode/hipe_icode_primops.erl @@ -236,6 +236,7 @@ fails({hipe_bs_primop, {bs_append, _, _, _, _}}) -> true; fails({hipe_bs_primop, {bs_private_append, _, _}}) -> true; fails({hipe_bs_primop, bs_init_writable}) -> true; fails(build_stacktrace) -> false; +fails(raw_raise) -> true; fails(#mkfun{}) -> false; fails(#unsafe_element{}) -> false; fails(#unsafe_update_element{}) -> false; @@ -735,6 +736,8 @@ type(Primop, Args) -> erl_types:t_any(); build_stacktrace -> erl_types:t_list(); + raw_raise -> + erl_types:t_atom(); {M, F, A} -> erl_bif_types:type(M, F, A, Args) end. @@ -909,6 +912,8 @@ type(Primop) -> %%% Other build_stacktrace -> erl_types:t_any(); + raw_raise -> + erl_types:t_any(); #closure_element{} -> erl_types:t_any(); redtest -> |