diff options
author | Erlang/OTP <[email protected]> | 2019-06-03 11:34:51 +0200 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2019-06-03 11:34:51 +0200 |
commit | a4a35c8cfd19781875a84dda9db56fe839004d64 (patch) | |
tree | 9b089f764debf7fbd25b8faf43580d3daff0a136 /erts/emulator/test | |
parent | 2bcc317861b118461376766692968775ab405cef (diff) | |
parent | 5959fb00182048d50f55d04684723d383d1aeee8 (diff) | |
download | otp-a4a35c8cfd19781875a84dda9db56fe839004d64.tar.gz otp-a4a35c8cfd19781875a84dda9db56fe839004d64.tar.bz2 otp-a4a35c8cfd19781875a84dda9db56fe839004d64.zip |
Merge branch 'bjorn/erts/fix-wrong-class/ERIERL-367/OTP-15834' into maint-21
* bjorn/erts/fix-wrong-class/ERIERL-367/OTP-15834:
Fix sticky class in exception
Diffstat (limited to 'erts/emulator/test')
-rw-r--r-- | erts/emulator/test/exception_SUITE.erl | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/erts/emulator/test/exception_SUITE.erl b/erts/emulator/test/exception_SUITE.erl index aec66cb9a3..6e6f7d78ab 100644 --- a/erts/emulator/test/exception_SUITE.erl +++ b/erts/emulator/test/exception_SUITE.erl @@ -23,6 +23,7 @@ -export([all/0, suite/0, badmatch/1, pending_errors/1, nil_arith/1, top_of_stacktrace/1, stacktrace/1, nested_stacktrace/1, raise/1, gunilla/1, per/1, + change_exception_class/1, exception_with_heap_frag/1, backtrace_depth/1, line_numbers/1]). @@ -43,6 +44,7 @@ suite() -> all() -> [badmatch, pending_errors, nil_arith, top_of_stacktrace, stacktrace, nested_stacktrace, raise, gunilla, per, + change_exception_class, exception_with_heap_frag, backtrace_depth, line_numbers]. -define(try_match(E), @@ -507,6 +509,38 @@ t1(_,X,_) -> t2(_,X,_) -> (X bsl 1) + 1. +change_exception_class(_Config) -> + try + change_exception_class_1(fun() -> throw(arne) end) + catch + error:arne -> + ok; + Class:arne -> + ct:fail({wrong_exception_class,Class}) + end. + +change_exception_class_1(F) -> + try + change_exception_class_2(F) + after + %% The exception would be caught and rethrown using + %% an i_raise instruction. Before the correction + %% of the raw_raise instruction, the change of class + %% would not stick. + io:put_chars("Exception automatically rethrown here\n") + end. + +change_exception_class_2(F) -> + try + F() + catch + throw:Reason:Stack -> + %% Translated to a raw_raise instruction. + %% The change of exception class would not stick + %% if the i_raise instruction was later executed. + erlang:raise(error, Reason, Stack) + end. + %% %% Make sure that even if a BIF builds an heap fragment, then causes an exception, %% the stacktrace term will still be OK (specifically, that it does not contain |