diff --git a/deps/miniv8/src/quickjs.c b/deps/miniv8/src/quickjs.c index 49bbf3c5e7fa279da5a499f79b85df1c7bc34e95..903a6f84724b0f0f73f6d5cfe1bc282a17e60b5d 100644 --- a/deps/miniv8/src/quickjs.c +++ b/deps/miniv8/src/quickjs.c @@ -77,11 +77,7 @@ struct timeval { #endif #endif // HAVE_STRUCT_TIMEVAL -#ifndef _DEBUG #define OPTIMIZE 1 -#else -#define OPTIMIZE 0 -#endif #define SHORT_OPCODES 1 #if defined(EMSCRIPTEN) @@ -34012,7 +34008,23 @@ static __exception int compute_stack_size(JSContext *ctx, break; case OP_gosub: diff = get_u32(bc_buf + pos + 1); - if (ss_check(ctx, s, pos + 1 + diff, op, stack_len + 1)) + /* 解决多个 OP_gosub 设置同一个字节码的栈大小导致的异常 + * 原因: + * 分析字节码发现, 在 compute_stack_size() 中, 有多个 OP_gosub 跳转到同一个字节码, + * 分别在 ss_check() 中根据自身当前栈的情况设置了跳转后字节码的使用栈大小, 如果设置的栈大小不一致, 就会报错. + * 解决: + * 由于 s(即 StackSizeState) 只是用来计算一个函数栈的最大大小等的结构, 按其中大的栈数量设置即可, 这样最后可以获得函数所有路径中的 stack_len_max + * TODO: 尝试使用优化字节码的方法解决问题 + */ + int go_pos = pos + 1 + diff; + if (s->stack_level_tab[go_pos] != 0xffff) { + if (s->stack_level_tab[go_pos] >= stack_len + 1) { + stack_len = s->stack_level_tab[go_pos] - 1; + } else { + s->stack_level_tab[go_pos] = stack_len + 1; + } + } + if (ss_check(ctx, s, go_pos, op, stack_len + 1)) goto fail; break; case OP_with_get_var: