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:
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;
}