mirror of
https://github.com/bellard/quickjs.git
synced 2024-11-22 05:38:11 +08:00
fixed async generator in case of exception in the implicit await in the 'return' statement
This commit is contained in:
parent
a42681a4a3
commit
57105c7f23
29
quickjs.c
29
quickjs.c
@ -19182,7 +19182,7 @@ static int js_async_generator_completed_return(JSContext *ctx,
|
|||||||
// exception should be delivered to the catch handler.
|
// exception should be delivered to the catch handler.
|
||||||
if (JS_IsException(promise)) {
|
if (JS_IsException(promise)) {
|
||||||
JSValue err = JS_GetException(ctx);
|
JSValue err = JS_GetException(ctx);
|
||||||
promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, &err,
|
promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, (JSValueConst *)&err,
|
||||||
/*is_reject*/1);
|
/*is_reject*/1);
|
||||||
JS_FreeValue(ctx, err);
|
JS_FreeValue(ctx, err);
|
||||||
if (JS_IsException(promise))
|
if (JS_IsException(promise))
|
||||||
@ -19235,7 +19235,6 @@ static void js_async_generator_resume_next(JSContext *ctx,
|
|||||||
} else if (next->completion_type == GEN_MAGIC_RETURN) {
|
} else if (next->completion_type == GEN_MAGIC_RETURN) {
|
||||||
s->state = JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN;
|
s->state = JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN;
|
||||||
js_async_generator_completed_return(ctx, s, next->result);
|
js_async_generator_completed_return(ctx, s, next->result);
|
||||||
goto done;
|
|
||||||
} else {
|
} else {
|
||||||
js_async_generator_reject(ctx, s, next->result);
|
js_async_generator_reject(ctx, s, next->result);
|
||||||
}
|
}
|
||||||
@ -19266,7 +19265,7 @@ static void js_async_generator_resume_next(JSContext *ctx,
|
|||||||
js_async_generator_reject(ctx, s, value);
|
js_async_generator_reject(ctx, s, value);
|
||||||
JS_FreeValue(ctx, value);
|
JS_FreeValue(ctx, value);
|
||||||
} else if (JS_VALUE_GET_TAG(func_ret) == JS_TAG_INT) {
|
} else if (JS_VALUE_GET_TAG(func_ret) == JS_TAG_INT) {
|
||||||
int func_ret_code;
|
int func_ret_code, ret;
|
||||||
value = s->func_state.frame.cur_sp[-1];
|
value = s->func_state.frame.cur_sp[-1];
|
||||||
s->func_state.frame.cur_sp[-1] = JS_UNDEFINED;
|
s->func_state.frame.cur_sp[-1] = JS_UNDEFINED;
|
||||||
func_ret_code = JS_VALUE_GET_INT(func_ret);
|
func_ret_code = JS_VALUE_GET_INT(func_ret);
|
||||||
@ -19281,8 +19280,13 @@ static void js_async_generator_resume_next(JSContext *ctx,
|
|||||||
JS_FreeValue(ctx, value);
|
JS_FreeValue(ctx, value);
|
||||||
break;
|
break;
|
||||||
case FUNC_RET_AWAIT:
|
case FUNC_RET_AWAIT:
|
||||||
js_async_generator_await(ctx, s, value);
|
ret = js_async_generator_await(ctx, s, value);
|
||||||
JS_FreeValue(ctx, value);
|
JS_FreeValue(ctx, value);
|
||||||
|
if (ret < 0) {
|
||||||
|
/* exception: throw it */
|
||||||
|
s->func_state.throw_flag = TRUE;
|
||||||
|
goto resume_exec;
|
||||||
|
}
|
||||||
goto done;
|
goto done;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
@ -25436,6 +25440,18 @@ static void emit_return(JSParseState *s, BOOL hasval)
|
|||||||
BlockEnv *top;
|
BlockEnv *top;
|
||||||
int drop_count;
|
int drop_count;
|
||||||
|
|
||||||
|
if (s->cur_func->func_kind != JS_FUNC_NORMAL) {
|
||||||
|
if (!hasval) {
|
||||||
|
/* no value: direct return in case of async generator */
|
||||||
|
emit_op(s, OP_undefined);
|
||||||
|
hasval = TRUE;
|
||||||
|
} else if (s->cur_func->func_kind == JS_FUNC_ASYNC_GENERATOR) {
|
||||||
|
/* the await must be done before handling the "finally" in
|
||||||
|
case it raises an exception */
|
||||||
|
emit_op(s, OP_await);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
drop_count = 0;
|
drop_count = 0;
|
||||||
top = s->cur_func->top_break;
|
top = s->cur_func->top_break;
|
||||||
while (top != NULL) {
|
while (top != NULL) {
|
||||||
@ -25514,11 +25530,6 @@ static void emit_return(JSParseState *s, BOOL hasval)
|
|||||||
emit_label(s, label_return);
|
emit_label(s, label_return);
|
||||||
emit_op(s, OP_return);
|
emit_op(s, OP_return);
|
||||||
} else if (s->cur_func->func_kind != JS_FUNC_NORMAL) {
|
} else if (s->cur_func->func_kind != JS_FUNC_NORMAL) {
|
||||||
if (!hasval) {
|
|
||||||
emit_op(s, OP_undefined);
|
|
||||||
} else if (s->cur_func->func_kind == JS_FUNC_ASYNC_GENERATOR) {
|
|
||||||
emit_op(s, OP_await);
|
|
||||||
}
|
|
||||||
emit_op(s, OP_return_async);
|
emit_op(s, OP_return_async);
|
||||||
} else {
|
} else {
|
||||||
emit_op(s, hasval ? OP_return : OP_return_undef);
|
emit_op(s, hasval ? OP_return : OP_return_undef);
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
test262/test/annexB/language/eval-code/direct/script-decl-lex-collision-in-sloppy-mode.js:13: Test262Error: Expected a SyntaxError to be thrown but no exception was thrown at all
|
test262/test/annexB/language/eval-code/direct/script-decl-lex-collision-in-sloppy-mode.js:13: Test262Error: Expected a SyntaxError to be thrown but no exception was thrown at all
|
||||||
test262/test/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js:39: TypeError: $DONE() not called
|
|
||||||
test262/test/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js:39: strict mode: TypeError: $DONE() not called
|
|
||||||
test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js:20: Test262Error: Expected a ReferenceError but got a different error constructor with the same name
|
test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js:20: Test262Error: Expected a ReferenceError but got a different error constructor with the same name
|
||||||
test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js:20: strict mode: Test262Error: Expected a ReferenceError but got a different error constructor with the same name
|
test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js:20: strict mode: Test262Error: Expected a ReferenceError but got a different error constructor with the same name
|
||||||
test262/test/built-ins/RegExp/lookahead-quantifier-match-groups.js:27: Test262Error: Expected [a, abc] and [a, undefined] to have the same contents. ? quantifier
|
test262/test/built-ins/RegExp/lookahead-quantifier-match-groups.js:27: Test262Error: Expected [a, abc] and [a, undefined] to have the same contents. ? quantifier
|
||||||
|
Loading…
Reference in New Issue
Block a user