From f96daa00144b79c91727d351de84270cb2d91bea Mon Sep 17 00:00:00 2001 From: Richard Holland Date: Mon, 15 Jul 2024 15:57:05 +1000 Subject: [PATCH] TextEncoder/Decoder working in jshooks --- src/quickjs/quickjs-textcode.c | 60 +++++++++++++++------------------ src/quickjs/quickjs-textcode.h | 2 +- src/quickjs/quickjs.c | 4 +-- src/ripple/app/hook/applyHook.h | 5 +-- 4 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/quickjs/quickjs-textcode.c b/src/quickjs/quickjs-textcode.c index 58f81b256..4509867e9 100644 --- a/src/quickjs/quickjs-textcode.c +++ b/src/quickjs/quickjs-textcode.c @@ -625,10 +625,28 @@ static const JSCFunctionListEntry js_encoder_funcs[] = { JS_PROP_STRING_DEF("[Symbol.toStringTag]", "TextEncoder", JS_PROP_CONFIGURABLE), }; +extern +void JS_NewGlobalCConstructor2(JSContext *ctx, + JSValue func_obj, + const char *name, + JSValueConst proto); int -js_code_init(JSContext* ctx, JSModuleDef* m) { +js_code_init_textdecoder(JSContext* ctx, JSModuleDef* m) +{ + // RH TODO: check if this (possibly being called twice or for some other reason) produces a mem leak + JS_NewClassID(&js_encoder_class_id); + JS_NewClass(JS_GetRuntime(ctx), js_encoder_class_id, &js_encoder_class); + + textencoder_ctor = JS_NewCFunction2(ctx, js_encoder_constructor, "TextEncoder", 1, JS_CFUNC_constructor, 0); + textencoder_proto = JS_NewObject(ctx); + + JS_SetPropertyFunctionList(ctx, textencoder_proto, js_encoder_funcs, countof(js_encoder_funcs)); + JS_SetClassProto(ctx, js_encoder_class_id, textencoder_proto); + JS_SetConstructor(ctx, textencoder_ctor, textencoder_proto); + + JS_NewGlobalCConstructor2(ctx, textencoder_ctor, "TextEncoder", textencoder_proto); + - if(js_decoder_class_id == 0) { JS_NewClassID(&js_decoder_class_id); JS_NewClass(JS_GetRuntime(ctx), js_decoder_class_id, &js_decoder_class); @@ -639,33 +657,8 @@ js_code_init(JSContext* ctx, JSModuleDef* m) { JS_SetClassProto(ctx, js_decoder_class_id, textdecoder_proto); JS_SetConstructor(ctx, textdecoder_ctor, textdecoder_proto); - - JS_NewClassID(&js_encoder_class_id); - JS_NewClass(JS_GetRuntime(ctx), js_encoder_class_id, &js_encoder_class); - - textencoder_ctor = JS_NewCFunction2(ctx, js_encoder_constructor, "TextEncoder", 1, JS_CFUNC_constructor, 0); - textencoder_proto = JS_NewObject(ctx); - - JS_SetPropertyFunctionList(ctx, textencoder_proto, js_encoder_funcs, countof(js_encoder_funcs)); - JS_SetClassProto(ctx, js_encoder_class_id, textencoder_proto); - - JS_SetConstructor(ctx, textencoder_ctor, textencoder_proto); - - // js_set_inspect_method(ctx, textdecoder_proto, - // js_decoder_inspect); - } - - if(m) { - JS_SetModuleExport(ctx, m, "TextDecoder", textdecoder_ctor); - JS_SetModuleExport(ctx, m, "TextEncoder", textencoder_ctor); - - /* const char* module_name = JS_AtomToCString(ctx, m->module_name); - - if(!strcmp(module_name, "textdecoder")) - JS_SetModuleExport(ctx, m, "default", textdecoder_ctor); - - JS_FreeCString(ctx, module_name);*/ - } + + JS_NewGlobalCConstructor2(ctx, textdecoder_ctor, "TextDecoder", textdecoder_proto); return 0; } @@ -680,12 +673,13 @@ VISIBLE JSModuleDef* JS_INIT_MODULE(JSContext* ctx, const char* module_name) { JSModuleDef* m; - if((m = JS_NewCModule(ctx, module_name, js_code_init))) { + /*if((m = JS_NewCModule(ctx, module_name, js_code_init))) + { JS_AddModuleExport(ctx, m, "TextDecoder"); JS_AddModuleExport(ctx, m, "TextEncoder"); - /*if(!strcmp(module_name, "textdecoder")) - JS_AddModuleExport(ctx, m, "default");*/ - } + //if(!strcmp(module_name, "textdecoder")) + // JS_AddModuleExport(ctx, m, "default"); + }*/ return m; } diff --git a/src/quickjs/quickjs-textcode.h b/src/quickjs/quickjs-textcode.h index edde0684a..4dd433523 100644 --- a/src/quickjs/quickjs-textcode.h +++ b/src/quickjs/quickjs-textcode.h @@ -65,7 +65,7 @@ extern const char* const textcode_encodings[]; size_t textdecoder_length(TextDecoder*); JSValue textdecoder_read(TextDecoder*, JSContext* ctx); -int js_code_init(JSContext*, JSModuleDef* m); +int js_code_init_textdecoder(JSContext*, JSModuleDef* m); size_t textencoder_length(TextEncoder*); JSValue textencoder_read(TextEncoder*, JSContext* ctx); int js_encoder_init(JSContext*, JSModuleDef* m); diff --git a/src/quickjs/quickjs.c b/src/quickjs/quickjs.c index df8dc1d09..67db7c625 100644 --- a/src/quickjs/quickjs.c +++ b/src/quickjs/quickjs.c @@ -37052,7 +37052,7 @@ void JS_SetConstructor(JSContext *ctx, JSValueConst func_obj, 0, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); } -static void JS_NewGlobalCConstructor2(JSContext *ctx, +void JS_NewGlobalCConstructor2(JSContext *ctx, JSValue func_obj, const char *name, JSValueConst proto) @@ -37074,7 +37074,7 @@ static JSValueConst JS_NewGlobalCConstructor(JSContext *ctx, const char *name, return func_obj; } -static JSValueConst JS_NewGlobalCConstructorOnly(JSContext *ctx, const char *name, +JSValueConst JS_NewGlobalCConstructorOnly(JSContext *ctx, const char *name, JSCFunction *func, int length, JSValueConst proto) { diff --git a/src/ripple/app/hook/applyHook.h b/src/ripple/app/hook/applyHook.h index e9be489e4..9b46542aa 100644 --- a/src/ripple/app/hook/applyHook.h +++ b/src/ripple/app/hook/applyHook.h @@ -21,7 +21,7 @@ #include "quickjs-atom.h" extern "C" { - JSModuleDef* js_init_module_textdecoder(JSContext* ctx, const char* name); + int js_code_init_textdecoder(JSContext*, JSModuleDef* m); } namespace hook { @@ -1317,7 +1317,8 @@ public: JS_AddIntrinsicMapSet(ctx); JS_AddIntrinsicTypedArrays(ctx); JS_AddIntrinsicBigInt(ctx); - ::js_init_module_textdecoder(ctx, "textdecoder"); + //::js_init_module_textdecoder(ctx, "textdecoder"); + ::js_code_init_textdecoder(ctx, 0); JS_SetMaxStackSize(rt, 65535); JS_SetMemoryLimit(rt, 16 * 1024 * 1024);