Skip to content

Commit

Permalink
refactor: revert current implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
QuiiBz committed Apr 22, 2024
1 parent f227746 commit 392bbff
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 153 deletions.
136 changes: 21 additions & 115 deletions quickjs.c
Original file line number Diff line number Diff line change
Expand Up @@ -783,7 +783,6 @@ struct JSModuleDef {
int import_entries_count;
int import_entries_size;

JSValue promise;
JSValue module_ns;
JSValue func_obj; /* only used for JS modules */
JSModuleInitFunc *init_func; /* only used for C modules */
Expand Down Expand Up @@ -856,14 +855,6 @@ struct JSShape {
JSShapeProperty prop[0]; /* prop_size elements */
};

typedef struct JSPromiseData {
JSPromiseStateEnum promise_state;
/* 0=fulfill, 1=reject, list of JSPromiseReactionData.link */
struct list_head promise_reactions[2];
BOOL is_handled; /* Note: only useful to debug */
JSValue promise_result;
} JSPromiseData;

struct JSObject {
union {
JSGCObjectHeader header;
Expand Down Expand Up @@ -1105,12 +1096,8 @@ static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValue ctor,
static void gc_decref(JSRuntime *rt);
static int JS_NewClass1(JSRuntime *rt, JSClassID class_id,
const JSClassDef *class_def, JSAtom name);
static JSValue js_promise_all(JSContext *ctx, JSValue this_val,
int argc, JSValue *argv, int magic);
static JSValue js_promise_then(JSContext *ctx, JSValue this_val,
int argc, JSValue *argv);
static JSValue js_array_push(JSContext *ctx, JSValue this_val,
int argc, JSValue *argv, int unshift);
static JSValue js_array_push(JSContext *ctx, JSValueConst this_val,
int argc, JSValueConst *argv, int unshift);

typedef enum JSStrictEqModeEnum {
JS_EQ_STRICT,
Expand Down Expand Up @@ -25560,7 +25547,6 @@ static JSModuleDef *js_new_module_def(JSContext *ctx, JSAtom name)
}
m->header.ref_count = 1;
m->module_name = name;
m->promise = JS_UNDEFINED;
m->module_ns = JS_UNDEFINED;
m->func_obj = JS_UNDEFINED;
m->eval_exception = JS_UNDEFINED;
Expand All @@ -25582,7 +25568,6 @@ static void js_mark_module_def(JSRuntime *rt, JSModuleDef *m,
}
}

JS_MarkValue(rt, m->promise, mark_func);
JS_MarkValue(rt, m->module_ns, mark_func);
JS_MarkValue(rt, m->func_obj, mark_func);
JS_MarkValue(rt, m->eval_exception, mark_func);
Expand Down Expand Up @@ -25618,7 +25603,6 @@ static void js_free_module_def(JSContext *ctx, JSModuleDef *m)
}
js_free(ctx, m->import_entries);

JS_FreeValue(ctx, m->promise);
JS_FreeValue(ctx, m->module_ns);
JS_FreeValue(ctx, m->func_obj);
JS_FreeValue(ctx, m->eval_exception);
Expand Down Expand Up @@ -26736,18 +26720,6 @@ JSModuleDef *JS_RunModule(JSContext *ctx, const char *basename,
return m;
}

static JSValue js_dynamic_import_resolve(JSContext *ctx, JSValue this_val,
int argc, JSValue *argv, int magic, JSValue *func_data)
{
return JS_Call(ctx, func_data[0], JS_UNDEFINED, 1, &func_data[2]);
}

static JSValue js_dynamic_import_reject(JSContext *ctx, JSValue this_val,
int argc, JSValue *argv, int magic, JSValue *func_data)
{
return JS_Call(ctx, func_data[1], JS_UNDEFINED, 1, &argv[0]);
}

static JSValue js_dynamic_import_job(JSContext *ctx,
int argc, JSValue *argv)
{
Expand Down Expand Up @@ -26780,21 +26752,6 @@ static JSValue js_dynamic_import_job(JSContext *ctx,
if (JS_IsException(ns))
goto exception;

if (!JS_IsUndefined(m->promise)) {
JSValue args[] = {argv[0], argv[1], ns};
JSValue funcs[2];
funcs[0] = JS_NewCFunctionData(ctx, js_dynamic_import_resolve, 0, 0, 3, args);
funcs[1] = JS_NewCFunctionData(ctx, js_dynamic_import_reject, 0, 0, 3, args);
JS_FreeValue(ctx, js_promise_then(ctx, m->promise, 2, funcs));

JS_FreeValue(ctx, funcs[0]);
JS_FreeValue(ctx, funcs[1]);
JS_FreeValue(ctx, ns);
JS_FreeCString(ctx, basename);

return JS_UNDEFINED;
}

ret = JS_Call(ctx, resolving_funcs[0], JS_UNDEFINED,
1, &ns);
JS_FreeValue(ctx, ret); /* XXX: what to do if exception ? */
Expand Down Expand Up @@ -26846,12 +26803,6 @@ static JSValue js_dynamic_import(JSContext *ctx, JSValue specifier)
return promise;
}

static JSValue js_async_function_call2(JSContext *ctx, JSValue this_val,
int argc, JSValue *argv, int magic, JSValue *func_data)
{
return js_async_function_call(ctx, func_data[0], this_val, argc, argv, magic);
}

/* Run the <eval> function of the module and of all its requested
modules. */
static JSValue js_evaluate_module(JSContext *ctx, JSModuleDef *m)
Expand All @@ -26869,18 +26820,12 @@ static JSValue js_evaluate_module(JSContext *ctx, JSModuleDef *m)
if (m->eval_has_exception) {
return JS_Throw(ctx, js_dup(m->eval_exception));
} else {
return js_dup(m->promise);
return JS_UNDEFINED;
}
}

m->eval_mark = TRUE;

JSValue promises = JS_NewArray(ctx);
if (JS_IsException(promises))
return JS_EXCEPTION;

BOOL async = FALSE;
JSValue promise = JS_UNDEFINED;
for(i = 0; i < m->req_module_entries_count; i++) {
JSReqModuleEntry *rme = &m->req_module_entries[i];
m1 = rme->module;
Expand All @@ -26889,62 +26834,29 @@ static JSValue js_evaluate_module(JSContext *ctx, JSModuleDef *m)
if (JS_IsException(ret_val)) {
m->eval_mark = FALSE;
js_free_modules(ctx, JS_FREE_MODULE_NOT_EVALUATED);
goto clean;
}
if (!JS_IsUndefined(ret_val)) {
js_array_push(ctx, promises, 1, &ret_val, 0);
JS_FreeValue(ctx, ret_val);
async = TRUE;
return ret_val;
}
JS_FreeValue(ctx, ret_val);
}
}

promise = js_promise_all(ctx, ctx->promise_ctor, 1, &promises, 0);
if (JS_IsException(promise)) {
JS_FreeValue(ctx, promises);
return JS_EXCEPTION;
}

if (m->init_func) {
/* C module init */
if (m->init_func(ctx, m) < 0)
ret_val = JS_EXCEPTION;
else
ret_val = JS_UNDEFINED;
} else if (!async) {
ret_val = js_async_function_call(ctx, m->func_obj, JS_UNDEFINED, 0, NULL, 0);
JS_FreeValue(ctx, m->func_obj);
m->func_obj = JS_UNDEFINED;
JSPromiseData *s = JS_GetOpaque(ret_val, JS_CLASS_PROMISE);
if (s->promise_state != JS_PROMISE_PENDING) {
JSValue ret_val2 = ret_val;
if (s->promise_state == JS_PROMISE_REJECTED)
ret_val = JS_Throw(ctx, js_dup(s->promise_result));
else
ret_val = js_dup(s->promise_result);
JS_FreeValue(ctx, ret_val2);
}
} else {
JSValue funcs[2];
funcs[0] = JS_NewCFunctionData(ctx, js_async_function_call2, 0, 0, 1, &m->func_obj);
funcs[1] = JS_UNDEFINED;
ret_val = js_promise_then(ctx, promise, 2, funcs);
JS_FreeValue(ctx, funcs[0]);
JS_FreeValue(ctx, m->func_obj);
ret_val = JS_CallFree(ctx, m->func_obj, JS_UNDEFINED, 0, NULL);
m->func_obj = JS_UNDEFINED;
}
if (JS_IsException(ret_val)) {
/* save the thrown exception value */
m->eval_has_exception = TRUE;
m->eval_exception = js_dup(ctx->rt->current_exception);
} else if (!JS_IsUndefined(ret_val)) {
m->promise = js_dup(ret_val);
}
m->eval_mark = FALSE;
m->evaluated = TRUE;
clean:
JS_FreeValue(ctx, promises);
JS_FreeValue(ctx, promise);
return ret_val;
}

Expand Down Expand Up @@ -32195,7 +32107,7 @@ static __exception int js_parse_program(JSParseState *s)

emit_op(s, OP_return);
} else {
emit_return(s, FALSE);
emit_op(s, OP_return_undef);
}

return 0;
Expand Down Expand Up @@ -32306,10 +32218,6 @@ static JSValue __JS_EvalInternal(JSContext *ctx, JSValue this_obj,
fd = js_new_function_def(ctx, NULL, TRUE, FALSE, filename, 1, 1);
if (!fd)
goto fail1;
if (m != NULL) {
fd->in_function_body = TRUE;
fd->func_kind = JS_FUNC_ASYNC;
}
s->cur_func = fd;
fd->eval_type = eval_type;
fd->has_this_binding = (eval_type != JS_EVAL_TYPE_DIRECT);
Expand Down Expand Up @@ -45581,6 +45489,20 @@ static const JSCFunctionListEntry js_generator_proto_funcs[] = {

/* Promise */

typedef enum JSPromiseStateEnum {
JS_PROMISE_PENDING,
JS_PROMISE_FULFILLED,
JS_PROMISE_REJECTED,
} JSPromiseStateEnum;

typedef struct JSPromiseData {
JSPromiseStateEnum promise_state;
/* 0=fulfill, 1=reject, list of JSPromiseReactionData.link */
struct list_head promise_reactions[2];
BOOL is_handled; /* Note: only useful to debug */
JSValue promise_result;
} JSPromiseData;

typedef struct JSPromiseFunctionDataResolved {
int ref_count;
BOOL already_resolved;
Expand All @@ -45597,22 +45519,6 @@ typedef struct JSPromiseReactionData {
JSValue handler;
} JSPromiseReactionData;

JSPromiseStateEnum JS_PromiseState(JSContext *ctx, JSValue promise)
{
JSPromiseData *s = JS_GetOpaque(promise, JS_CLASS_PROMISE);
if (!s)
return JS_INVALID_PROMISE_STATE;
return s->promise_state;
}

JSValue JS_PromiseResult(JSContext *ctx, JSValue promise)
{
JSPromiseData *s = JS_GetOpaque(promise, JS_CLASS_PROMISE);
if (!s)
return JS_UNDEFINED;
return js_dup(s->promise_result);
}

static int js_create_resolving_functions(JSContext *ctx, JSValue *args,
JSValue promise);

Expand Down
15 changes: 0 additions & 15 deletions quickjs.h
Original file line number Diff line number Diff line change
Expand Up @@ -978,21 +978,6 @@ JS_EXTERN int JS_SetModuleExport(JSContext *ctx, JSModuleDef *m, const char *exp
JS_EXTERN int JS_SetModuleExportList(JSContext *ctx, JSModuleDef *m,
const JSCFunctionListEntry *tab, int len);

/* Promise */

#define JS_INVALID_PROMISE_STATE (-1)

typedef enum JSPromiseStateEnum {
JS_PROMISE_PENDING,
JS_PROMISE_FULFILLED,
JS_PROMISE_REJECTED,
} JSPromiseStateEnum;

/* Returns JSPromiseReactionEnum for the promise or JS_INVALID_PROMISE_STATE if the value is not a promise. */
JS_EXTERN JSPromiseStateEnum JS_PromiseState(JSContext *ctx, JSValue promise);
/* Return the result of the promise if the promise's state is in the FULFILLED or REJECTED state. Otherwise returns JS_UNDEFINED. */
JS_EXTERN JSValue JS_PromiseResult(JSContext *ctx, JSValue promise);

/* Version */

#define QJS_VERSION_MAJOR 0
Expand Down
23 changes: 0 additions & 23 deletions run-test262.c
Original file line number Diff line number Diff line change
Expand Up @@ -1229,29 +1229,6 @@ static int eval_buf(JSContext *ctx, const char *buf, size_t buf_len,
break;
}
}
} else if ((eval_flags & JS_EVAL_TYPE_MODULE) &&
!JS_IsUndefined(res_val) &&
!JS_IsException(res_val)) {
JSValue promise = res_val;
for(;;) {
JSContext *ctx1;
ret = JS_ExecutePendingJob(JS_GetRuntime(ctx), &ctx1);
if (ret < 0) {
res_val = JS_EXCEPTION;
break;
}
if (ret == 0) {
JSPromiseStateEnum s = JS_PromiseState(ctx, promise);
if (s == JS_PROMISE_FULFILLED)
res_val = JS_UNDEFINED;
else if (s == JS_PROMISE_REJECTED)
res_val = JS_Throw(ctx, JS_PromiseResult(ctx, promise));
else
res_val = JS_EXCEPTION;
break;
}
}
JS_FreeValue(ctx, promise);
}

if (JS_IsException(res_val)) {
Expand Down

0 comments on commit 392bbff

Please sign in to comment.