Skip to content

Commit 5a99866

Browse files
fast-interp: Fix stack recovery for else branch (#3100)
The issue was reported in #3090.
1 parent af318ba commit 5a99866

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

core/iwasm/interpreter/wasm_loader.c

+17-8
Original file line numberDiff line numberDiff line change
@@ -7980,20 +7980,29 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
79807980
#if WASM_ENABLE_FAST_INTERP != 0
79817981
/* Recover top param_count values of frame_offset stack */
79827982
if (block->available_param_num) {
7983-
uint32 size;
7984-
size = sizeof(int16) * block->available_param_num;
7985-
bh_memcpy_s(loader_ctx->frame_offset, size,
7986-
block->param_frame_offsets, size);
7987-
loader_ctx->frame_offset += (size / sizeof(int16));
7983+
uint32 available_param_cell_num = 0;
79887984

7989-
/* recover dynamic offset */
7985+
/* total cell num of available parameters */
79907986
for (i = 0; i < block->available_param_num; i++) {
7991-
if (block->param_frame_offsets[i]
7987+
uint32 cell_num = wasm_value_type_cell_num(
7988+
block->block_type.u.type->types[i]);
7989+
7990+
/* recover dynamic offset */
7991+
if (block->param_frame_offsets[available_param_cell_num]
79927992
>= loader_ctx->dynamic_offset) {
79937993
loader_ctx->dynamic_offset =
7994-
block->param_frame_offsets[i] + 1;
7994+
block->param_frame_offsets
7995+
[available_param_cell_num]
7996+
+ cell_num;
79957997
}
7998+
7999+
available_param_cell_num += cell_num;
79968000
}
8001+
8002+
bh_memcpy_s(
8003+
loader_ctx->frame_offset, available_param_cell_num,
8004+
block->param_frame_offsets, available_param_cell_num);
8005+
loader_ctx->frame_offset += available_param_cell_num;
79978006
}
79988007
#endif
79998008

core/iwasm/interpreter/wasm_mini_loader.c

+17-8
Original file line numberDiff line numberDiff line change
@@ -5819,20 +5819,29 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
58195819
#if WASM_ENABLE_FAST_INTERP != 0
58205820
/* Recover top param_count values of frame_offset stack */
58215821
if (block->available_param_num) {
5822-
uint32 size;
5823-
size = sizeof(int16) * block->available_param_num;
5824-
bh_memcpy_s(loader_ctx->frame_offset, size,
5825-
block->param_frame_offsets, size);
5826-
loader_ctx->frame_offset += (size / sizeof(int16));
5822+
uint32 available_param_cell_num = 0;
58275823

5828-
/* recover dynamic offset */
5824+
/* total cell num of available parameters */
58295825
for (i = 0; i < block->available_param_num; i++) {
5830-
if (block->param_frame_offsets[i]
5826+
uint32 cell_num = wasm_value_type_cell_num(
5827+
block->block_type.u.type->types[i]);
5828+
5829+
/* recover dynamic offset */
5830+
if (block->param_frame_offsets[available_param_cell_num]
58315831
>= loader_ctx->dynamic_offset) {
58325832
loader_ctx->dynamic_offset =
5833-
block->param_frame_offsets[i] + 1;
5833+
block->param_frame_offsets
5834+
[available_param_cell_num]
5835+
+ cell_num;
58345836
}
5837+
5838+
available_param_cell_num += cell_num;
58355839
}
5840+
5841+
bh_memcpy_s(
5842+
loader_ctx->frame_offset, available_param_cell_num,
5843+
block->param_frame_offsets, available_param_cell_num);
5844+
loader_ctx->frame_offset += available_param_cell_num;
58365845
}
58375846
#endif
58385847

0 commit comments

Comments
 (0)