diff options
author | Björn Gustavsson <[email protected]> | 2018-12-06 10:19:09 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-12-06 10:19:09 +0100 |
commit | 111661b9500e2d499987d1f17bd08a5170131445 (patch) | |
tree | 2cec6bb869b3f653f88f102d94d0a9e54bbce5ba /lib/compiler/src | |
parent | 5cc2687c40882beac4d3eac20e279c2cbf6d0134 (diff) | |
parent | 32d28de92aea46967b7c0c4d805b453b3a4759e8 (diff) | |
download | otp-111661b9500e2d499987d1f17bd08a5170131445.tar.gz otp-111661b9500e2d499987d1f17bd08a5170131445.tar.bz2 otp-111661b9500e2d499987d1f17bd08a5170131445.zip |
Merge branch 'maint'
* maint:
Fix unsafe optimization of stack trace building
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/sys_core_fold.erl | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl index d848cd8f19..43c99be982 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -2667,12 +2667,20 @@ opt_build_stacktrace(#c_let{vars=[#c_var{name=Cooked}], #c_call{module=#c_literal{val=erlang}, name=#c_literal{val=raise}, args=[Class,Exp,#c_var{name=Cooked}]} -> - %% The stacktrace is only used in a call to erlang:raise/3. - %% There is no need to build the stacktrace. Replace the - %% call to erlang:raise/3 with the the raw_raise/3 instruction, - %% which will use a raw stacktrace. - #c_primop{name=#c_literal{val=raw_raise}, - args=[Class,Exp,RawStk]}; + case core_lib:is_var_used(Cooked, #c_cons{hd=Class,tl=Exp}) of + true -> + %% Not safe. The stacktrace is used in the class or + %% reason. + Let; + false -> + %% The stacktrace is only used in the last + %% argument for erlang:raise/3. There is no need + %% to build the stacktrace. Replace the call to + %% erlang:raise/3 with the the raw_raise/3 + %% instruction, which will use a raw stacktrace. + #c_primop{name=#c_literal{val=raw_raise}, + args=[Class,Exp,RawStk]} + end; #c_let{vars=[#c_var{name=V}],arg=Arg,body=B0} when V =/= Cooked -> case core_lib:is_var_used(Cooked, Arg) of false -> |