Fix fully initializing JSStackFrame (#328)

Fixes: https://github.com/quickjs-ng/quickjs/issues/323
This commit is contained in:
Saúl Ibarra Corretgé 2024-03-24 22:06:57 +01:00 committed by GitHub
parent 1796b36db7
commit 18f2898f52
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 6 deletions

View file

@ -6517,6 +6517,10 @@ static void build_backtrace(JSContext *ctx, JSValue error_obj,
const char *atom_str;
int line_num1, col_num1;
/* Bytecode functions must have cur_pc set in the stack frame. */
if (sf->cur_pc == NULL)
abort();
line_num1 = find_line_num(ctx, b,
sf->cur_pc - b->byte_code_buf - 1,
&col_num1);
@ -14611,6 +14615,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
stack_buf = var_buf + b->var_count;
sp = stack_buf;
pc = b->byte_code_buf;
sf->cur_pc = NULL; /* It's != NULL for bytecode functions. */
sf->prev_frame = rt->current_stack_frame;
rt->current_stack_frame = sf;
ctx = b->realm; /* set the current realm */
@ -14666,6 +14671,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
BREAK;
CASE(OP_get_length):
{
sf->cur_pc = pc;
JSValue val;
val = JS_GetProperty(ctx, sp[-1], JS_ATOM_length);
@ -15017,6 +15023,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
int magic;
magic = get_u16(pc);
pc += 2;
sf->cur_pc = pc;
ret_val = js_function_apply(ctx, sp[-3], 2, &sp[-2], magic);
if (unlikely(JS_IsException(ret_val)))
@ -15837,6 +15844,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
JSAtom atom;
atom = get_u32(pc);
pc += 4;
sf->cur_pc = pc;
val = JS_GetPropertyInternal2(ctx, sp[-1], atom, sp[-1], ic, FALSE);
if (unlikely(JS_IsException(val)))
goto exception;
@ -15859,6 +15867,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
ic_offset = get_u32(pc);
atom = get_ic_atom(ic, ic_offset);
pc += 4;
sf->cur_pc = pc;
val = JS_GetPropertyInternalWithIC(ctx, sp[-1], atom, sp[-1], ic, ic_offset, FALSE);
ic->updated = FALSE;
if (unlikely(JS_IsException(val)))
@ -15873,6 +15882,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
JSAtom atom;
atom = get_u32(pc);
pc += 4;
sf->cur_pc = pc;
val = JS_GetPropertyInternal2(ctx, sp[-1], atom, sp[-1], NULL, FALSE);
if (unlikely(JS_IsException(val)))
goto exception;
@ -15894,6 +15904,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
ic_offset = get_u32(pc);
atom = get_ic_atom(ic, ic_offset);
pc += 4;
sf->cur_pc = pc;
val = JS_GetPropertyInternalWithIC(ctx, sp[-1], atom, sp[-1], ic, ic_offset, FALSE);
ic->updated = FALSE;
if (unlikely(JS_IsException(val)))
@ -15908,6 +15919,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
JSAtom atom;
atom = get_u32(pc);
pc += 4;
sf->cur_pc = pc;
ret = JS_SetPropertyInternal2(ctx,
sp[-2], atom,
sp[-1], sp[-2],
@ -15933,6 +15945,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
ic_offset = get_u32(pc);
atom = get_ic_atom(ic, ic_offset);
pc += 4;
sf->cur_pc = pc;
ret = JS_SetPropertyInternalWithIC(ctx, sp[-2], atom, sp[-1], JS_PROP_THROW_STRICT, ic, ic_offset);
ic->updated = FALSE;
JS_FreeValue(ctx, sp[-2]);
@ -16286,6 +16299,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
JSValue op1, op2;
op1 = sp[-2];
op2 = sp[-1];
sf->cur_pc = pc;
if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) {
int64_t r;
r = (int64_t)JS_VALUE_GET_INT(op1) + JS_VALUE_GET_INT(op2);
@ -16311,6 +16325,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
int idx;
idx = *pc;
pc += 1;
sf->cur_pc = pc;
pv = &var_buf[idx];
if (likely(JS_VALUE_IS_BOTH_INT(*pv, sp[-1]))) {
@ -16720,11 +16735,13 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
OP_CMP(OP_strict_neq, !=, js_strict_eq_slow(ctx, sp, 1));
CASE(OP_in):
sf->cur_pc = pc;
if (js_operator_in(ctx, sp))
goto exception;
sp--;
BREAK;
CASE(OP_instanceof):
sf->cur_pc = pc;
if (js_operator_instanceof(ctx, sp))
goto exception;
sp--;

6
v8.txt
View file

@ -762,12 +762,6 @@ Failure (testClassNames doesn't contain expected[1] stack = at MyObj (stack-
at <eval> (stack-traces.js:291:49)
): expected <true> found <false>
Failure (UnintendedCallerCensorship didn't contain new ReferenceError): expected <true> found <false>
Failure: expected <"abc"> found <undefined>
Failure: expected <"abc"> found <" at <eval> (stack-traces.js:371:13)\n">
Failure: expected <undefined> found <" at <eval> (stack-traces.js:375:13)\n">
TypeError: not a function
at <eval> (stack-traces.js:381:1)
=== str-to-num.js
Failure: expected <7.922816251426436e+28> found <7.922816251426434e+28>
=== stress-array-push.js