forked from cory/tildefriends
quickjs-2024-01-13.tar.xz
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4765 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
64
deps/quickjs/run-test262.c
vendored
64
deps/quickjs/run-test262.c
vendored
@@ -1174,7 +1174,7 @@ static int eval_buf(JSContext *ctx, const char *buf, size_t buf_len,
|
||||
{
|
||||
JSValue res_val, exception_val;
|
||||
int ret, error_line, pos, pos_line;
|
||||
BOOL is_error, has_error_line;
|
||||
BOOL is_error, has_error_line, ret_promise;
|
||||
const char *error_name;
|
||||
|
||||
pos = skip_comments(buf, 1, &pos_line);
|
||||
@@ -1183,12 +1183,19 @@ static int eval_buf(JSContext *ctx, const char *buf, size_t buf_len,
|
||||
exception_val = JS_UNDEFINED;
|
||||
error_name = NULL;
|
||||
|
||||
/* a module evaluation returns a promise */
|
||||
ret_promise = ((eval_flags & JS_EVAL_TYPE_MODULE) != 0);
|
||||
async_done = 0; /* counter of "Test262:AsyncTestComplete" messages */
|
||||
|
||||
|
||||
res_val = JS_Eval(ctx, buf, buf_len, filename, eval_flags);
|
||||
|
||||
if (is_async && !JS_IsException(res_val)) {
|
||||
JS_FreeValue(ctx, res_val);
|
||||
if ((is_async || ret_promise) && !JS_IsException(res_val)) {
|
||||
JSValue promise = JS_UNDEFINED;
|
||||
if (ret_promise) {
|
||||
promise = res_val;
|
||||
} else {
|
||||
JS_FreeValue(ctx, res_val);
|
||||
}
|
||||
for(;;) {
|
||||
JSContext *ctx1;
|
||||
ret = JS_ExecutePendingJob(JS_GetRuntime(ctx), &ctx1);
|
||||
@@ -1196,15 +1203,27 @@ static int eval_buf(JSContext *ctx, const char *buf, size_t buf_len,
|
||||
res_val = JS_EXCEPTION;
|
||||
break;
|
||||
} else if (ret == 0) {
|
||||
/* test if the test called $DONE() once */
|
||||
if (async_done != 1) {
|
||||
res_val = JS_ThrowTypeError(ctx, "$DONE() not called");
|
||||
if (is_async) {
|
||||
/* test if the test called $DONE() once */
|
||||
if (async_done != 1) {
|
||||
res_val = JS_ThrowTypeError(ctx, "$DONE() not called");
|
||||
} else {
|
||||
res_val = JS_UNDEFINED;
|
||||
}
|
||||
} else {
|
||||
res_val = JS_UNDEFINED;
|
||||
/* check that the returned promise is fulfilled */
|
||||
JSPromiseStateEnum state = JS_PromiseState(ctx, promise);
|
||||
if (state == JS_PROMISE_FULFILLED)
|
||||
res_val = JS_UNDEFINED;
|
||||
else if (state == JS_PROMISE_REJECTED)
|
||||
res_val = JS_Throw(ctx, JS_PromiseResult(ctx, promise));
|
||||
else
|
||||
res_val = JS_ThrowTypeError(ctx, "promise is pending");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
JS_FreeValue(ctx, promise);
|
||||
}
|
||||
|
||||
if (JS_IsException(res_val)) {
|
||||
@@ -1498,7 +1517,7 @@ void update_stats(JSRuntime *rt, const char *filename) {
|
||||
#undef update
|
||||
}
|
||||
|
||||
int run_test_buf(const char *filename, char *harness, namelist_t *ip,
|
||||
int run_test_buf(const char *filename, const char *harness, namelist_t *ip,
|
||||
char *buf, size_t buf_len, const char* error_type,
|
||||
int eval_flags, BOOL is_negative, BOOL is_async,
|
||||
BOOL can_block)
|
||||
@@ -1582,6 +1601,8 @@ int run_test(const char *filename, int index)
|
||||
if (p) {
|
||||
snprintf(harnessbuf, sizeof(harnessbuf), "%.*s%s",
|
||||
(int)(p - filename), filename, "harness");
|
||||
} else {
|
||||
pstrcpy(harnessbuf, sizeof(harnessbuf), "");
|
||||
}
|
||||
harness = harnessbuf;
|
||||
}
|
||||
@@ -1669,6 +1690,8 @@ int run_test(const char *filename, int index)
|
||||
if (p) {
|
||||
snprintf(harnessbuf, sizeof(harnessbuf), "%.*s%s",
|
||||
(int)(p - filename), filename, "test/harness");
|
||||
} else {
|
||||
pstrcpy(harnessbuf, sizeof(harnessbuf), "");
|
||||
}
|
||||
harness = harnessbuf;
|
||||
}
|
||||
@@ -1835,17 +1858,32 @@ int run_test262_harness_test(const char *filename, BOOL is_module)
|
||||
js_std_dump_error(ctx);
|
||||
ret_code = 1;
|
||||
} else {
|
||||
JS_FreeValue(ctx, res_val);
|
||||
JSValue promise = JS_UNDEFINED;
|
||||
if (is_module) {
|
||||
promise = res_val;
|
||||
} else {
|
||||
JS_FreeValue(ctx, res_val);
|
||||
}
|
||||
for(;;) {
|
||||
JSContext *ctx1;
|
||||
ret = JS_ExecutePendingJob(JS_GetRuntime(ctx), &ctx1);
|
||||
if (ret < 0) {
|
||||
js_std_dump_error(ctx1);
|
||||
ret_code = 1;
|
||||
js_std_dump_error(ctx1);
|
||||
ret_code = 1;
|
||||
} else if (ret == 0) {
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* dump the error if the module returned an error. */
|
||||
if (is_module) {
|
||||
JSPromiseStateEnum state = JS_PromiseState(ctx, promise);
|
||||
if (state == JS_PROMISE_REJECTED) {
|
||||
JS_Throw(ctx, JS_PromiseResult(ctx, promise));
|
||||
js_std_dump_error(ctx);
|
||||
ret_code = 1;
|
||||
}
|
||||
}
|
||||
JS_FreeValue(ctx, promise);
|
||||
}
|
||||
free(buf);
|
||||
#ifdef CONFIG_AGENT
|
||||
|
Reference in New Issue
Block a user