details: https://github.com/nginx/njs/commit/b70ab370b8fd8c7e37a6491697dfe357031f4632 branches: master commit: b70ab370b8fd8c7e37a6491697dfe357031f4632 user: Dmitry Volyntsev <xei...@nginx.com> date: Mon, 8 Jul 2024 23:35:12 -0700 description: QuickJS: moving njs object creation to common code.
So it will be shared between modules and CLI. --- external/njs_shell.c | 87 ++-------------------------------------------- src/qjs.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/qjs.h | 1 + 3 files changed, 102 insertions(+), 84 deletions(-) diff --git a/external/njs_shell.c b/external/njs_shell.c index ec2a3875..addf5a34 100644 --- a/external/njs_shell.c +++ b/external/njs_shell.c @@ -1901,46 +1901,6 @@ njs_qjs_clear_timeout(JSContext *ctx, JSValueConst this_val, int argc, } -static njs_int_t -njs_qjs_set_to_string_tag(JSContext *ctx, JSValueConst val, const char *tag) -{ - JSAtom atom; - JSValue global_obj, symbol, toStringTag; - njs_int_t ret; - - global_obj = JS_GetGlobalObject(ctx); - - symbol = JS_GetPropertyStr(ctx, global_obj, "Symbol"); - JS_FreeValue(ctx, global_obj); - if (JS_IsException(symbol)) { - return -1; - } - - toStringTag = JS_GetPropertyStr(ctx, symbol, "toStringTag"); - if (JS_IsException(toStringTag)) { - JS_FreeValue(ctx, symbol); - return -1; - } - - atom = JS_ValueToAtom(ctx, toStringTag); - - JS_FreeValue(ctx, symbol); - JS_FreeValue(ctx, toStringTag); - - if (atom == JS_ATOM_NULL) { - JS_ThrowInternalError(ctx, "failed to get atom"); - return -1; - } - - ret = JS_DefinePropertyValue(ctx, val, atom, JS_NewString(ctx, tag), - JS_PROP_C_W_E); - - JS_FreeAtom(ctx, atom); - - return ret; -} - - static JSValue njs_qjs_process_getter(JSContext *ctx, JSValueConst this_val) { @@ -1963,7 +1923,7 @@ njs_qjs_process_getter(JSContext *ctx, JSValueConst this_val) return JS_EXCEPTION; } - ret = njs_qjs_set_to_string_tag(ctx, obj, "process"); + ret = qjs_set_to_string_tag(ctx, obj, "process"); if (ret == -1) { JS_FreeValue(ctx, obj); return JS_EXCEPTION; @@ -2066,46 +2026,6 @@ error: return obj; } -static JSValue -njs_qjs_njs_getter(JSContext *ctx, JSValueConst this_val) -{ - JSValue obj; - njs_int_t ret; - - obj = JS_NewObject(ctx); - if (JS_IsException(obj)) { - return JS_EXCEPTION; - } - - ret = njs_qjs_set_to_string_tag(ctx, obj, "njs"); - if (ret == -1) { - JS_FreeValue(ctx, obj); - return JS_EXCEPTION; - } - - ret = JS_SetPropertyStr(ctx, obj, "version_number", - JS_NewInt32(ctx, NJS_VERSION_NUMBER)); - if (ret == -1) { - JS_FreeValue(ctx, obj); - return JS_EXCEPTION; - } - - ret = JS_SetPropertyStr(ctx, obj, "version", - JS_NewString(ctx, NJS_VERSION)); - if (ret == -1) { - JS_FreeValue(ctx, obj); - return JS_EXCEPTION; - } - - ret = JS_SetPropertyStr(ctx, obj, "engine", JS_NewString(ctx, "QuickJS")); - if (ret == -1) { - JS_FreeValue(ctx, obj); - return JS_EXCEPTION; - } - - return obj; -} - static njs_int_t njs_qjs_global_init(JSContext *ctx, JSValue global_obj); static void njs_qjs_dump_error(JSContext *ctx); @@ -2656,7 +2576,6 @@ njs_qjs_new_262(JSContext *ctx, JSValueConst this_val) static const JSCFunctionListEntry njs_qjs_global_proto[] = { JS_CFUNC_DEF("clearTimeout", 1, njs_qjs_clear_timeout), JS_CFUNC_MAGIC_DEF("print", 0, njs_qjs_console_log, NJS_LOG_INFO), - JS_CGETSET_DEF("njs", njs_qjs_njs_getter, NULL), JS_CGETSET_DEF("process", njs_qjs_process_getter, NULL), JS_CFUNC_MAGIC_DEF("setImmediate", 0, njs_qjs_set_timer, 1), JS_CFUNC_MAGIC_DEF("setTimeout", 0, njs_qjs_set_timer, 0), @@ -2840,9 +2759,9 @@ njs_engine_qjs_init(njs_engine_t *engine, njs_opts_t *opts) goto done; } - ret = njs_qjs_set_to_string_tag(ctx, obj, "Console"); + ret = qjs_set_to_string_tag(ctx, obj, "Console"); if (ret == -1) { - njs_stderror("njs_qjs_set_to_string_tag() failed\n"); + njs_stderror("qjs_set_to_string_tag() failed\n"); ret = NJS_ERROR; goto done; } diff --git a/src/qjs.c b/src/qjs.c index 0a31b748..de6bf17b 100644 --- a/src/qjs.c +++ b/src/qjs.c @@ -5,11 +5,21 @@ */ #include <qjs.h> +#include <njs.h> /* NJS_VERSION */ + + +static JSValue qjs_njs_getter(JSContext *ctx, JSValueConst this_val); + + +static const JSCFunctionListEntry qjs_global_proto[] = { + JS_CGETSET_DEF("njs", qjs_njs_getter, NULL), +}; JSContext * qjs_new_context(JSRuntime *rt, _Bool eval) { + JSValue global_obj; JSContext *ctx; qjs_module_t **module; @@ -38,10 +48,98 @@ qjs_new_context(JSRuntime *rt, _Bool eval) } } + global_obj = JS_GetGlobalObject(ctx); + + JS_SetPropertyFunctionList(ctx, global_obj, qjs_global_proto, + njs_nitems(qjs_global_proto)); + + JS_FreeValue(ctx, global_obj); + return ctx; } +static JSValue +qjs_njs_getter(JSContext *ctx, JSValueConst this_val) +{ + int ret; + JSValue obj; + + obj = JS_NewObject(ctx); + if (JS_IsException(obj)) { + return JS_EXCEPTION; + } + + ret = qjs_set_to_string_tag(ctx, obj, "njs"); + if (ret == -1) { + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + + ret = JS_SetPropertyStr(ctx, obj, "version_number", + JS_NewInt32(ctx, NJS_VERSION_NUMBER)); + if (ret == -1) { + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + + ret = JS_SetPropertyStr(ctx, obj, "version", + JS_NewString(ctx, NJS_VERSION)); + if (ret == -1) { + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + + ret = JS_SetPropertyStr(ctx, obj, "engine", JS_NewString(ctx, "QuickJS")); + if (ret == -1) { + JS_FreeValue(ctx, obj); + return JS_EXCEPTION; + } + + return obj; +} + + +int +qjs_set_to_string_tag(JSContext *ctx, JSValueConst val, const char *tag) +{ + int ret; + JSAtom atom; + JSValue global_obj, symbol, toStringTag; + + global_obj = JS_GetGlobalObject(ctx); + + symbol = JS_GetPropertyStr(ctx, global_obj, "Symbol"); + JS_FreeValue(ctx, global_obj); + if (JS_IsException(symbol)) { + return -1; + } + + toStringTag = JS_GetPropertyStr(ctx, symbol, "toStringTag"); + if (JS_IsException(toStringTag)) { + JS_FreeValue(ctx, symbol); + return -1; + } + + atom = JS_ValueToAtom(ctx, toStringTag); + + JS_FreeValue(ctx, symbol); + JS_FreeValue(ctx, toStringTag); + + if (atom == JS_ATOM_NULL) { + JS_ThrowInternalError(ctx, "failed to get atom"); + return -1; + } + + ret = JS_DefinePropertyValue(ctx, val, atom, JS_NewString(ctx, tag), + JS_PROP_C_W_E); + + JS_FreeAtom(ctx, atom); + + return ret; +} + + int qjs_to_bytes(JSContext *ctx, qjs_bytes_t *bytes, JSValueConst value) { diff --git a/src/qjs.h b/src/qjs.h index f8eabefa..563a5b15 100644 --- a/src/qjs.h +++ b/src/qjs.h @@ -64,6 +64,7 @@ typedef struct { const qjs_buffer_encoding_t *qjs_buffer_encoding(JSContext *ctx, JSValueConst value, JS_BOOL thrw); +int qjs_set_to_string_tag(JSContext *ctx, JSValueConst val, const char *tag); typedef struct { int tag; _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel