From e342a33b4f79ec73dbb0c288a933aeedd51f5bb0 Mon Sep 17 00:00:00 2001 From: cybran Date: Fri, 11 Aug 2023 21:43:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8=E5=87=BD=E6=95=B0=20function*=20=E4=B8=AD=E5=B8=A6?= =?UTF-8?q?=E6=9C=89=20try=20catch=20=E5=AF=BC=E8=87=B4=20unconsistent=20s?= =?UTF-8?q?tack=20size=20=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deps/miniv8/src/quickjs.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/deps/miniv8/src/quickjs.c b/deps/miniv8/src/quickjs.c index 49bbf3c5..903a6f84 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: -- Gitee