Skip to content

Commit c6ce961

Browse files
committed
erts: Fix GC bug in bsl and bsr with small Op1
1 parent 0573efb commit c6ce961

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

erts/emulator/beam/beam_emu.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3032,6 +3032,7 @@ do { \
30323032
if (i == 0) {
30333033
StoreBifResult(4, Op1);
30343034
}
3035+
ires = big_size(Op1);
30353036
goto big_shift;
30363037
}
30373038
} else if (is_big(Op2)) {
@@ -3047,7 +3048,6 @@ do { \
30473048

30483049
OpCase(i_bsl_jIssd):
30493050
GetArg2(2, Op1, Op2);
3050-
30513051
do_bsl:
30523052
if (is_small(Op2)) {
30533053
i = signed_val(Op2);
@@ -3073,16 +3073,12 @@ do { \
30733073
StoreBifResult(4, Op1);
30743074
}
30753075
}
3076-
Op1 = small_to_big(ires, tmp_big);
3077-
#ifdef TAG_LITERAL_PTR
3078-
Op1 |= TAG_LITERAL_PTR;
3079-
#endif
3076+
ires = 1; /* big_size(small_to_big(Op1)) */
30803077

30813078
big_shift:
30823079
if (i > 0) { /* Left shift. */
3083-
ires = big_size(Op1) + (i / D_EXP);
3080+
ires += (i / D_EXP);
30843081
} else { /* Right shift. */
3085-
ires = big_size(Op1);
30863082
if (ires <= (-i / D_EXP))
30873083
ires = 3; /* ??? */
30883084
else
@@ -3101,6 +3097,9 @@ do { \
31013097
goto lb_Cl_error;
31023098
}
31033099
TestHeapPreserve(ires+1, Arg(1), Op1);
3100+
if (is_small(Op1)) {
3101+
Op1 = small_to_big(signed_val(Op1), tmp_big);
3102+
}
31043103
bigp = HTOP;
31053104
Op1 = big_lshift(Op1, i, bigp);
31063105
if (is_big(Op1)) {
@@ -3123,6 +3122,7 @@ do { \
31233122
if (i == 0) {
31243123
StoreBifResult(4, Op1);
31253124
}
3125+
ires = big_size(Op1);
31263126
goto big_shift;
31273127
}
31283128
} else if (is_big(Op2)) {

0 commit comments

Comments
 (0)