diff --git a/src/scripting/smjs/core.c b/src/scripting/smjs/core.c index 5673c23ad..87bd490da 100644 --- a/src/scripting/smjs/core.c +++ b/src/scripting/smjs/core.c @@ -22,6 +22,8 @@ #include "util/file.h" #include "util/string.h" +#include +#include #define SMJS_HOOKS_FILENAME "hooks.js" @@ -192,18 +194,27 @@ smjs_do_file(char *path) opts.setNoScriptRval(true); JS::RootedValue rval(smjs_ctx); - JS_BeginRequest(smjs_ctx); - JSCompartment *prev = JS_EnterCompartment(smjs_ctx, smjs_elinks_object); + JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object); - if (!add_file_to_string(&script, path) - || false == JS::Evaluate(smjs_ctx, opts, - script.source, script.length, &rval)) { + if (add_file_to_string(&script, path)) { + JS::SourceText srcBuf; + + if (!srcBuf.init(smjs_ctx, script.source, script.length, JS::SourceOwnership::Borrowed)) { + alert_smjs_error("error loading script file"); + ret = 0; + } else { + if (!JS::Evaluate(smjs_ctx, opts, + srcBuf, &rval)) { + alert_smjs_error("error loading script file"); + ret = 0; + } + } + } else { alert_smjs_error("error loading script file"); ret = 0; } - JS_LeaveCompartment(smjs_ctx, prev); - JS_EndRequest(smjs_ctx); + JS::LeaveRealm(smjs_ctx, prev); done_string(&script); return ret; @@ -252,7 +263,8 @@ init_smjs(struct module *module) return; } - JS::SetWarningReporter(smjs_ctx, error_reporter); +/// TODO +/// JS::SetWarningReporter(smjs_ctx, error_reporter); smjs_init_global_object(); @@ -299,65 +311,15 @@ JSString * utf8_to_jsstring(JSContext *ctx, const char *str, int length) { size_t in_bytes; - const char *in_end; - size_t utf16_alloc; - char16_t *utf16; - size_t utf16_used; - JSString *jsstr; if (length == -1) in_bytes = strlen(str); else in_bytes = length; - /* Each byte of input can become at most one UTF-16 unit. - * Check whether the multiplication could overflow. */ - assert(!needs_utf16_surrogates(UCS_REPLACEMENT_CHARACTER)); - if (in_bytes > ((size_t) -1) / sizeof(char16_t)) { -#ifdef HAVE_JS_REPORTALLOCATIONOVERFLOW - JS_ReportAllocationOverflow(ctx); -#else - JS_ReportOutOfMemory(ctx); -#endif - return NULL; - } - utf16_alloc = in_bytes; - /* Use malloc because SpiderMonkey will handle the memory after - * this routine finishes. */ - utf16 = malloc(utf16_alloc * sizeof(char16_t)); - if (utf16 == NULL) { - JS_ReportOutOfMemory(ctx); - return NULL; - } + JS::ConstUTF8CharsZ utf8chars(str, in_bytes); - in_end = str + in_bytes; - - utf16_used = 0; - for (;;) { - unicode_val_T unicode; - - unicode = utf8_to_unicode((char **) &str, in_end); - if (unicode == UCS_NO_CHAR) - break; - - if (needs_utf16_surrogates(unicode)) { - assert(utf16_alloc - utf16_used >= 2); - if_assert_failed { free(utf16); return NULL; } - utf16[utf16_used++] = get_utf16_high_surrogate(unicode); - utf16[utf16_used++] = get_utf16_low_surrogate(unicode); - } else { - assert(utf16_alloc - utf16_used >= 1); - if_assert_failed { free(utf16); return NULL; } - utf16[utf16_used++] = unicode; - } - } - - jsstr = JS_NewUCString(ctx, utf16, utf16_used); - /* Do not free if JS_NewUCString was successful because it takes over - * handling of the memory. */ - if (jsstr == NULL) free(utf16); - - return jsstr; + return JS_NewStringCopyUTF8Z(ctx, utf8chars); } /** Convert a char16_t array to UTF-8 and append it to struct string. diff --git a/src/scripting/smjs/global_object.c b/src/scripting/smjs/global_object.c index f24bd7214..22947e445 100644 --- a/src/scripting/smjs/global_object.c +++ b/src/scripting/smjs/global_object.c @@ -30,8 +30,7 @@ static JSObject * smjs_get_global_object(void) { assert(smjs_ctx); - JSAutoRequest ar(smjs_ctx); - JS::CompartmentOptions opts; + JS::RealmOptions opts; // if (!JS::InitSelfHostedCode(smjs_ctx)) { // return NULL; @@ -41,9 +40,9 @@ smjs_get_global_object(void) if (!jsobj) return NULL; - new JSAutoCompartment(smjs_ctx, jsobj); + new JSAutoRealm(smjs_ctx, jsobj); - JS_InitStandardClasses(smjs_ctx, jsobj); + JS::InitRealmStandardClasses(smjs_ctx); return jsobj; } diff --git a/src/scripting/smjs/hooks.c b/src/scripting/smjs/hooks.c index 1f407e3e9..90079108d 100644 --- a/src/scripting/smjs/hooks.c +++ b/src/scripting/smjs/hooks.c @@ -33,8 +33,7 @@ script_hook_url(va_list ap, void *data) if (*url == NULL) return EVENT_HOOK_STATUS_NEXT; - JS_BeginRequest(smjs_ctx); - JSCompartment *prev = JS_EnterCompartment(smjs_ctx, smjs_elinks_object); + JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object); smjs_ses = ses; args[2].setString(JS_NewStringCopyZ(smjs_ctx, *url)); @@ -51,8 +50,7 @@ script_hook_url(va_list ap, void *data) } smjs_ses = NULL; - JS_LeaveCompartment(smjs_ctx, prev); - JS_EndRequest(smjs_ctx); + JS::LeaveRealm(smjs_ctx, prev); return ret; } @@ -67,8 +65,7 @@ script_hook_pre_format_html(va_list ap, void *data) JS::Value args[4]; JS::RootedValue r_rval(smjs_ctx); - JS_BeginRequest(smjs_ctx); - JSCompartment *prev = JS_EnterCompartment(smjs_ctx, smjs_elinks_object); + JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object); evhook_use_params(ses && cached); @@ -99,8 +96,7 @@ script_hook_pre_format_html(va_list ap, void *data) end: - JS_LeaveCompartment(smjs_ctx, prev); - JS_EndRequest(smjs_ctx); + JS::LeaveRealm(smjs_ctx, prev); smjs_ses = NULL; return ret; } diff --git a/src/scripting/smjs/keybinding.c b/src/scripting/smjs/keybinding.c index 262309219..a898cf16d 100644 --- a/src/scripting/smjs/keybinding.c +++ b/src/scripting/smjs/keybinding.c @@ -162,7 +162,7 @@ keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS: struct string event_name = NULL_STRING; JSObject *jsobj = &hvp.toObject(); - if (false == JS_ObjectIsFunction(ctx, jsobj)) + if (false == JS_ObjectIsFunction(jsobj)) return false; if (!init_string(&event_name)) return false; diff --git a/src/scripting/smjs/terminal_object.c b/src/scripting/smjs/terminal_object.c index b8cbdeb06..1202b8b26 100644 --- a/src/scripting/smjs/terminal_object.c +++ b/src/scripting/smjs/terminal_object.c @@ -44,9 +44,36 @@ enum terminal_prop { TERMINAL_TAB, }; + +static bool +terminal_get_property_tab(JSContext *ctx, unsigned int argc, JS::Value *vp) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct terminal *term; + + term = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &terminal_class, NULL); + if (!term) return false; /* already detached */ + + JSObject *obj = smjs_get_session_array_object(term); + + if (obj) { + args.rval().setObject(*obj); + } else { + args.rval().setUndefined(); + } + + return true; +} + static const JSPropertySpec terminal_props[] = { - { "tab", TERMINAL_TAB, JSPROP_ENUMERATE | JSPROP_READONLY }, - { NULL } + JS_PSG("tab", terminal_get_property_tab, JSPROP_ENUMERATE), + JS_PS_END }; /* @terminal_class.getProperty */ @@ -210,7 +237,7 @@ static const JSClassOps terminal_array_ops = { nullptr, // call nullptr, // hasInstance nullptr, // construct - nullptr // trace JS_GlobalObjectTraceHook + JS_GlobalObjectTraceHook }; static const JSClass terminal_array_class = {