-
-
Save xeioex/dd8aca951987521697442cdb107a600a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| [1mdiff --git a/src/qjs.c b/src/qjs.c[m | |
| [1mindex 9c0fcdb4..ca2bdbbc 100644[m | |
| [1m--- a/src/qjs.c[m | |
| [1m+++ b/src/qjs.c[m | |
| [36m@@ -19,6 +19,12 @@[m [mtypedef struct {[m | |
| } qjs_signal_entry_t;[m | |
| [m | |
| [m | |
| [32m+[m[32mtypedef struct {[m | |
| [32m+[m[32m#define QJS_NJS_HOOK_EXIT 0[m | |
| [32m+[m[32m JSValue hooks[1];[m | |
| [32m+[m[32m} qjs_njs_t;[m | |
| [32m+[m | |
| [32m+[m | |
| typedef enum {[m | |
| QJS_ENCODING_UTF8,[m | |
| } qjs_encoding_t;[m | |
| [36m@@ -42,7 +48,11 @@[m [mtypedef struct {[m | |
| extern char **environ;[m | |
| [m | |
| [m | |
| [31m-static JSValue qjs_njs_getter(JSContext *ctx, JSValueConst this_val);[m | |
| [32m+[m[32mstatic int qjs_add_intrinsic_njs(JSContext *cx, JSValueConst global);[m | |
| [32m+[m[32mstatic JSValue qjs_njs_on(JSContext *ctx, JSValueConst this_val, int argc,[m | |
| [32m+[m[32m JSValueConst *argv);[m | |
| [32m+[m[32mstatic void qjs_njs_finalizer(JSRuntime *rt, JSValue val);[m | |
| [32m+[m | |
| static JSValue qjs_process_env(JSContext *ctx, JSValueConst this_val);[m | |
| static JSValue qjs_process_kill(JSContext *ctx, JSValueConst this_val,[m | |
| int argc, JSValueConst *argv);[m | |
| [36m@@ -99,10 +109,6 @@[m [mstatic qjs_encoding_label_t qjs_encoding_labels[] =[m | |
| };[m | |
| [m | |
| [m | |
| [31m-static const JSCFunctionListEntry qjs_global_proto[] = {[m | |
| [31m- JS_CGETSET_DEF("njs", qjs_njs_getter, NULL),[m | |
| [31m-};[m | |
| [31m-[m | |
| static const JSCFunctionListEntry qjs_text_decoder_proto[] = {[m | |
| JS_PROP_STRING_DEF("[Symbol.toStringTag]", "TextDecoder",[m | |
| JS_PROP_CONFIGURABLE),[m | |
| [36m@@ -126,6 +132,7 @@[m [mstatic const JSCFunctionListEntry qjs_njs_proto[] = {[m | |
| JS_PROP_INT32_DEF("version_number", NJS_VERSION_NUMBER,[m | |
| JS_PROP_C_W_E),[m | |
| JS_PROP_STRING_DEF("engine", "QuickJS", JS_PROP_C_W_E),[m | |
| [32m+[m[32m JS_CFUNC_DEF("on", 2, qjs_njs_on),[m | |
| };[m | |
| [m | |
| static const JSCFunctionListEntry qjs_process_proto[] = {[m | |
| [36m@@ -137,6 +144,12 @@[m [mstatic const JSCFunctionListEntry qjs_process_proto[] = {[m | |
| };[m | |
| [m | |
| [m | |
| [32m+[m[32mstatic JSClassDef qjs_njs_class = {[m | |
| [32m+[m[32m "TextDecoder",[m | |
| [32m+[m[32m .finalizer = qjs_njs_finalizer,[m | |
| [32m+[m[32m};[m | |
| [32m+[m | |
| [32m+[m | |
| static JSClassDef qjs_text_decoder_class = {[m | |
| "TextDecoder",[m | |
| .finalizer = qjs_text_decoder_finalizer,[m | |
| [36m@@ -186,6 +199,10 @@[m [mqjs_new_context(JSRuntime *rt, qjs_module_t **addons)[m | |
| [m | |
| global_obj = JS_GetGlobalObject(ctx);[m | |
| [m | |
| [32m+[m[32m if (qjs_add_intrinsic_njs(ctx, global_obj) < 0) {[m | |
| [32m+[m[32m return NULL;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| if (qjs_add_intrinsic_text_decoder(ctx, global_obj) < 0) {[m | |
| return NULL;[m | |
| }[m | |
| [36m@@ -194,9 +211,6 @@[m [mqjs_new_context(JSRuntime *rt, qjs_module_t **addons)[m | |
| return NULL;[m | |
| }[m | |
| [m | |
| [31m- JS_SetPropertyFunctionList(ctx, global_obj, qjs_global_proto,[m | |
| [31m- njs_nitems(qjs_global_proto));[m | |
| [31m-[m | |
| prop = JS_NewAtom(ctx, "eval");[m | |
| if (prop == JS_ATOM_NULL) {[m | |
| return NULL;[m | |
| [36m@@ -225,20 +239,143 @@[m [mqjs_new_context(JSRuntime *rt, qjs_module_t **addons)[m | |
| }[m | |
| [m | |
| [m | |
| [31m-static JSValue[m | |
| [31m-qjs_njs_getter(JSContext *ctx, JSValueConst this_val)[m | |
| [32m+[m[32mvoid[m | |
| [32m+[m[32mqjs_free_context(JSContext *ctx)[m | |
| {[m | |
| [31m- JSValue obj;[m | |
| [32m+[m[32m JSValue global, obj, ret;[m | |
| [32m+[m[32m qjs_njs_t *njs;[m | |
| [m | |
| [31m- obj = JS_NewObject(ctx);[m | |
| [32m+[m[32m global = JS_GetGlobalObject(ctx);[m | |
| [32m+[m | |
| [32m+[m[32m obj = JS_GetPropertyStr(ctx, global, "njs");[m | |
| [32m+[m[32m if (JS_IsException(obj) || JS_IsUndefined(obj)) {[m | |
| [32m+[m[32m goto done;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m njs = JS_GetOpaque(obj, QJS_CORE_CLASS_ID_NJS);[m | |
| [32m+[m[32m if (njs != NULL && JS_IsFunction(ctx, njs->hooks[QJS_NJS_HOOK_EXIT])) {[m | |
| [32m+[m[32m ret = JS_Call(ctx, njs->hooks[QJS_NJS_HOOK_EXIT], JS_UNDEFINED,[m | |
| [32m+[m[32m 0, NULL);[m | |
| [32m+[m | |
| [32m+[m[32m JS_FreeValue(ctx, ret);[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32mdone:[m | |
| [32m+[m | |
| [32m+[m[32m JS_FreeValue(ctx, obj);[m | |
| [32m+[m[32m JS_FreeValue(ctx, global);[m | |
| [32m+[m | |
| [32m+[m[32m JS_FreeContext(ctx);[m | |
| [32m+[m[32m}[m | |
| [32m+[m | |
| [32m+[m | |
| [32m+[m[32mstatic int[m | |
| [32m+[m[32mqjs_add_intrinsic_njs(JSContext *cx, JSValueConst global)[m | |
| [32m+[m[32m{[m | |
| [32m+[m[32m JSValue obj, proto;[m | |
| [32m+[m | |
| [32m+[m[32m if (JS_NewClass(JS_GetRuntime(cx), QJS_CORE_CLASS_ID_NJS,[m | |
| [32m+[m[32m &qjs_njs_class) < 0)[m | |
| [32m+[m[32m {[m | |
| [32m+[m[32m return -1;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m proto = JS_NewObject(cx);[m | |
| [32m+[m[32m if (JS_IsException(proto)) {[m | |
| [32m+[m[32m return -1;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m JS_SetPropertyFunctionList(cx, proto, qjs_njs_proto,[m | |
| [32m+[m[32m njs_nitems(qjs_njs_proto));[m | |
| [32m+[m | |
| [32m+[m[32m JS_SetClassProto(cx, QJS_CORE_CLASS_ID_NJS, proto);[m | |
| [32m+[m | |
| [32m+[m[32m obj = JS_NewObjectClass(cx, QJS_CORE_CLASS_ID_NJS);[m | |
| if (JS_IsException(obj)) {[m | |
| [32m+[m[32m return -1;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m if (JS_SetPropertyStr(cx, global, "njs", obj) < 0) {[m | |
| [32m+[m[32m JS_FreeValue(cx, obj);[m | |
| [32m+[m[32m return -1;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m return 0;[m | |
| [32m+[m[32m}[m | |
| [32m+[m | |
| [32m+[m | |
| [32m+[m[32mstatic void[m | |
| [32m+[m[32mqjs_njs_finalizer(JSRuntime *rt, JSValue val)[m | |
| [32m+[m[32m{[m | |
| [32m+[m[32m unsigned i;[m | |
| [32m+[m[32m qjs_njs_t *njs;[m | |
| [32m+[m | |
| [32m+[m[32m njs = JS_GetOpaque(val, QJS_CORE_CLASS_ID_NJS);[m | |
| [32m+[m[32m if (njs != NULL) {[m | |
| [32m+[m[32m for (i = 0; i < njs_nitems(njs->hooks); i++) {[m | |
| [32m+[m[32m JS_FreeValueRT(rt, njs->hooks[i]);[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m js_free_rt(rt, njs);[m | |
| [32m+[m[32m }[m | |
| [32m+[m[32m}[m | |
| [32m+[m | |
| [32m+[m | |
| [32m+[m | |
| [32m+[m[32mstatic JSValue[m | |
| [32m+[m[32mqjs_njs_on(JSContext *ctx, JSValueConst this_val, int argc,[m | |
| [32m+[m[32m JSValueConst *argv)[m | |
| [32m+[m[32m{[m | |
| [32m+[m[32m unsigned i, n;[m | |
| [32m+[m[32m qjs_njs_t *njs;[m | |
| [32m+[m[32m njs_str_t name;[m | |
| [32m+[m | |
| [32m+[m[32m static const njs_str_t hooks[] = {[m | |
| [32m+[m[32m njs_str("exit"),[m | |
| [32m+[m[32m };[m | |
| [32m+[m | |
| [32m+[m[32m njs = JS_GetOpaque(this_val, QJS_CORE_CLASS_ID_NJS);[m | |
| [32m+[m[32m if (njs == NULL) {[m | |
| [32m+[m[32m njs = js_mallocz(ctx, sizeof(qjs_njs_t));[m | |
| [32m+[m[32m if (njs == NULL) {[m | |
| [32m+[m[32m return JS_ThrowOutOfMemory(ctx);[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m JS_SetOpaque(this_val, njs);[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m name.start = (u_char *) JS_ToCStringLen(ctx, &name.length, argv[0]);[m | |
| [32m+[m[32m if (name.start == NULL) {[m | |
| return JS_EXCEPTION;[m | |
| }[m | |
| [m | |
| [31m- JS_SetPropertyFunctionList(ctx, obj, qjs_njs_proto,[m | |
| [31m- njs_nitems(qjs_njs_proto));[m | |
| [32m+[m[32m i = 0;[m | |
| [32m+[m[32m n = njs_nitems(hooks);[m | |
| [m | |
| [31m- return obj;[m | |
| [32m+[m[32m while (i < n) {[m | |
| [32m+[m[32m if (njs_strstr_eq(&name, &hooks[i])) {[m | |
| [32m+[m[32m break;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m i++;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m if (i == n) {[m | |
| [32m+[m[32m JS_ThrowTypeError(ctx, "unknown hook \"%s\"", name.start);[m | |
| [32m+[m[32m JS_FreeCString(ctx, (const char *) name.start);[m | |
| [32m+[m[32m return JS_EXCEPTION;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m JS_FreeCString(ctx, (const char *) name.start);[m | |
| [32m+[m | |
| [32m+[m[32m if (!JS_IsFunction(ctx, argv[1]) && !JS_IsNull(argv[1])) {[m | |
| [32m+[m[32m JS_ThrowTypeError(ctx, "callback is not a function or null");[m | |
| [32m+[m[32m return JS_EXCEPTION;[m | |
| [32m+[m[32m }[m | |
| [32m+[m | |
| [32m+[m[32m njs->hooks[i] = JS_DupValue(ctx, argv[1]);[m | |
| [32m+[m | |
| [32m+[m[32m return JS_UNDEFINED;[m | |
| }[m | |
| [m | |
| [m | |
| [1mdiff --git a/src/qjs.h b/src/qjs.h[m | |
| [1mindex 18efad18..33357b36 100644[m | |
| [1m--- a/src/qjs.h[m | |
| [1m+++ b/src/qjs.h[m | |
| [36m@@ -42,6 +42,7 @@[m [menum {[m | |
| QJS_CORE_CLASS_ID_UINT8_ARRAY_CTOR,[m | |
| QJS_CORE_CLASS_ID_TEXT_DECODER,[m | |
| QJS_CORE_CLASS_ID_TEXT_ENCODER,[m | |
| [32m+[m[32m QJS_CORE_CLASS_ID_NJS,[m | |
| QJS_CORE_CLASS_ID_FS_STATS,[m | |
| QJS_CORE_CLASS_ID_FS_DIRENT,[m | |
| QJS_CORE_CLASS_ID_FS_FILEHANDLE,[m | |
| [36m@@ -64,6 +65,7 @@[m [mtypedef struct {[m | |
| [m | |
| [m | |
| JSContext *qjs_new_context(JSRuntime *rt, qjs_module_t **addons);[m | |
| [32m+[m[32mvoid qjs_free_context(JSContext *ctx);[m | |
| [m | |
| [m | |
| JSValue qjs_new_uint8_array(JSContext *ctx, int argc, JSValueConst *argv);[m |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment