Skip to content

Commit 171d517

Browse files
FKubisSWMmat-hek
authored andcommitted
Fixed reraise not caught issue
Signed-off-by: Mateusz Front <[email protected]>
1 parent d7581ac commit 171d517

File tree

6 files changed

+56
-0
lines changed

6 files changed

+56
-0
lines changed

src/libAtomVM/opcodesswitch.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,6 +1415,10 @@ static bool sort_kv_pairs(struct kv_pair *kv, int size, GlobalContext *global)
14151415
return true;
14161416
}
14171417

1418+
static bool is_exception_class(term t) {
1419+
return t == ERROR_ATOM || t == LOWERCASE_EXIT_ATOM || t == THROW_ATOM;
1420+
}
1421+
14181422
static term maybe_alloc_boxed_integer_fragment(Context *ctx, avm_int64_t value)
14191423
{
14201424
#if BOXED_TERMS_REQUIRED_FOR_INT64 > 1
@@ -3746,6 +3750,12 @@ HOT_FUNC int scheduler_entry_point(GlobalContext *glb)
37463750
#ifdef IMPL_EXECUTE_LOOP
37473751
TRACE("raise/2 stacktrace=0x%lx exc_value=0x%lx\n", stacktrace, exc_value);
37483752
if (stacktrace_is_built(stacktrace)) {
3753+
// FIXME: This is a temporary solution as in some niche cases of reraise the x_regs[0] is
3754+
// overwritten and it does not represent exception class
3755+
if (!is_exception_class(x_regs[0])) {
3756+
x_regs[0] = ERROR_ATOM;
3757+
}
3758+
x_regs[1] = exc_value;
37493759
x_regs[2] = stacktrace;
37503760
} else {
37513761
x_regs[0] = stacktrace_exception_class(stacktrace);

tests/erlang_tests/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,10 @@ compile_assembler(test_op_bs_start_match_asm)
551551
compile_erlang(test_op_bs_create_bin)
552552
compile_assembler(test_op_bs_create_bin_asm)
553553

554+
compile_erlang(test_reraise)
555+
compile_erlang(reraise_reraiser)
556+
compile_erlang(reraise_raiser)
557+
554558
if(Erlang_VERSION VERSION_GREATER_EQUAL "23")
555559
set(OTP23_OR_GREATER_TESTS
556560
test_op_bs_start_match_asm.beam
@@ -1073,6 +1077,10 @@ add_custom_target(erlang_test_modules DEPENDS
10731077
test_op_bs_start_match.beam
10741078
test_op_bs_create_bin.beam
10751079

1080+
test_reraise.beam
1081+
reraise_reraiser.beam
1082+
reraise_raiser.beam
1083+
10761084
${OTP23_OR_GREATER_TESTS}
10771085
${OTP25_OR_GREATER_TESTS}
10781086
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-module(reraise_raiser).
2+
3+
-export([raise_error/0]).
4+
5+
raise_error() ->
6+
error("foo").
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-module(reraise_reraiser).
2+
3+
-export([reraise_error/0]).
4+
5+
reraise_error() ->
6+
try
7+
reraise_raiser:raise_error()
8+
catch
9+
Class:Reason:Stacktrace ->
10+
erlang:error(erlang:raise(Class, Reason, Stacktrace))
11+
end.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-module(test_reraise).
2+
3+
-export([start/0]).
4+
5+
start() ->
6+
try
7+
reraise_reraiser:reraise_error()
8+
catch
9+
Class:Reason:Stacktrace ->
10+
error = Class,
11+
"foo" = Reason,
12+
13+
[
14+
{reraise_raiser, raise_error, 0, _Meta1},
15+
{reraise_reraiser, reraise_error, 0, _Meta2}
16+
| _Rest
17+
] = Stacktrace
18+
end,
19+
0.

tests/test.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,8 @@ struct Test tests[] = {
598598
TEST_CASE(test_ets),
599599
TEST_CASE(test_node),
600600

601+
TEST_CASE(test_reraise),
602+
601603
// TEST CRASHES HERE: TEST_CASE(memlimit),
602604

603605
{ NULL, 0, false, false }

0 commit comments

Comments
 (0)