tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 6cee990e76ea813369281f8f1d895fc180a3bb37
parent 638623097e2709d2158e8e0232b5fa72d436de26
Author: Daniel Minor <dminor@mozilla.com>
Date:   Thu, 13 Nov 2025 14:40:20 +0000

Bug 1999788 - Track module type in ShellModuleObjectWrapper; r=arai

Currently we use hasSyntheticModule fields to distinguish between
JavaScript and JSON modules in shell code, but with the addition of bytes modules,
this is no longer valid. This adds a slot to ShellModuleObjectWrapper to
track the module type.

Differential Revision: https://phabricator.services.mozilla.com/D272332

Diffstat:
Mjs/src/shell/ShellModuleObjectWrapper.cpp | 23++++++++++++++++++++++-
Mjs/src/shell/ShellModuleObjectWrapper.h | 8+++++---
Mjs/src/shell/js.cpp | 17++++++++---------
3 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/js/src/shell/ShellModuleObjectWrapper.cpp b/js/src/shell/ShellModuleObjectWrapper.cpp @@ -569,7 +569,28 @@ DEFINE_NATIVE_CREATE(ImportEntry, ShellImportEntryWrapper_accessors, nullptr) DEFINE_NATIVE_CREATE(ExportEntry, ShellExportEntryWrapper_accessors, nullptr) DEFINE_NATIVE_CREATE(RequestedModule, ShellRequestedModuleWrapper_accessors, nullptr) -DEFINE_CREATE(ModuleObject, ShellModuleObjectWrapper_accessors, nullptr) #undef DEFINE_CREATE #undef DEFINE_NATIVE_CREATE + +JS::ModuleType ShellModuleObjectWrapper::getModuleType() { + return static_cast<JS::ModuleType>(getReservedSlot(ModuleTypeSlot).toInt32()); +} + +ShellModuleObjectWrapper* ShellModuleObjectWrapper::create( + JSContext* cx, JS::Handle<ModuleObject*> target, + JS::ModuleType moduleType) { + JS::Rooted<JSObject*> obj(cx, JS_NewObject(cx, &class_)); + if (!obj) { + return nullptr; + } + if (!DefinePropertiesAndFunctions(cx, obj, ShellModuleObjectWrapper_accessors, + nullptr)) { + return nullptr; + } + auto* wrapper = &obj->as<ShellModuleObjectWrapper>(); + wrapper->initReservedSlot(TargetSlot, ObjectValue(*target)); + wrapper->initReservedSlot(ModuleTypeSlot, + Int32Value(static_cast<int32_t>(moduleType))); + return wrapper; +} diff --git a/js/src/shell/ShellModuleObjectWrapper.h b/js/src/shell/ShellModuleObjectWrapper.h @@ -23,11 +23,13 @@ namespace shell { class ShellModuleObjectWrapper : public js::NativeObject { public: using Target = ModuleObject; - enum ModuleSlot { TargetSlot = 0, SlotCount }; + enum ModuleSlot { TargetSlot = 0, ModuleTypeSlot, SlotCount }; static const JSClass class_; - static ShellModuleObjectWrapper* create(JSContext* cx, - JS::Handle<ModuleObject*> moduleObj); + static ShellModuleObjectWrapper* create( + JSContext* cx, JS::Handle<ModuleObject*> moduleObj, + JS::ModuleType moduleType = JS::ModuleType::JavaScript); ModuleObject* get(); + JS::ModuleType getModuleType(); }; } // namespace shell diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp @@ -5731,7 +5731,7 @@ static bool ParseModule(JSContext* cx, unsigned argc, Value* vp) { UniqueChars filename; CompileOptions options(cx); - bool jsonModule = false; + JS::ModuleType moduleType = JS::ModuleType::JavaScript; if (args.length() > 1) { if (!args[1].isString()) { const char* typeName = InformalValueTypeName(args[1]); @@ -5761,7 +5761,7 @@ static bool ParseModule(JSContext* cx, unsigned argc, Value* vp) { return false; } if (JS_LinearStringEqualsLiteral(linearStr, "json")) { - jsonModule = true; + moduleType = JS::ModuleType::JSON; } else if (!JS_LinearStringEqualsLiteral(linearStr, "js")) { JS_ReportErrorASCII(cx, "moduleType string ('js' or 'json') expected"); return false; @@ -5782,7 +5782,7 @@ static bool ParseModule(JSContext* cx, unsigned argc, Value* vp) { } RootedObject module(cx); - if (jsonModule) { + if (moduleType == JS::ModuleType::JSON) { module = JS::CompileJsonModule(cx, options, srcBuf); } else { options.setModule(); @@ -5793,7 +5793,8 @@ static bool ParseModule(JSContext* cx, unsigned argc, Value* vp) { } Rooted<ShellModuleObjectWrapper*> wrapper( - cx, ShellModuleObjectWrapper::create(cx, module.as<ModuleObject>())); + cx, ShellModuleObjectWrapper::create(cx, module.as<ModuleObject>(), + moduleType)); if (!wrapper) { return false; } @@ -6052,10 +6053,8 @@ static bool RegisterModule(JSContext* cx, unsigned argc, Value* vp) { return false; } - JS::ModuleType moduleType = JS::ModuleType::JavaScript; - if (module->hasSyntheticModuleFields()) { - moduleType = JS::ModuleType::JSON; - } + JS::ModuleType moduleType = + args[1].toObject().as<ShellModuleObjectWrapper>().getModuleType(); RootedObject moduleRequest( cx, ModuleRequestObject::create(cx, specifier, moduleType)); @@ -6068,7 +6067,7 @@ static bool RegisterModule(JSContext* cx, unsigned argc, Value* vp) { } Rooted<ShellModuleObjectWrapper*> wrapper( - cx, ShellModuleObjectWrapper::create(cx, module)); + cx, ShellModuleObjectWrapper::create(cx, module, moduleType)); if (!wrapper) { return false; }