diff --git a/js/src/builtin/ModuleObject.cpp b/js/src/builtin/ModuleObject.cpp index d4193e6a854f..c879fadb86a9 100644 --- a/js/src/builtin/ModuleObject.cpp +++ b/js/src/builtin/ModuleObject.cpp @@ -300,10 +300,10 @@ ModuleNamespaceObject::module() return GetProxyPrivate(this).toObject().as(); } -ArrayObject& +JSObject& ModuleNamespaceObject::exports() { - ArrayObject* exports = module().namespaceExports(); + JSObject* exports = module().namespaceExports(); MOZ_ASSERT(exports); return *exports; } @@ -498,15 +498,17 @@ ModuleNamespaceObject::ProxyHandler::ownPropertyKeys(JSContext* cx, HandleObject AutoIdVector& props) const { Rooted ns(cx, &proxy->as()); - RootedArrayObject exports(cx, &ns->exports()); - uint32_t count = exports->length(); - if (!props.reserve(props.length() + count)) + RootedObject exports(cx, &ns->exports()); + uint32_t count; + if (!GetLengthProperty(cx, exports, &count) || !props.reserve(props.length() + count)) return false; - for (uint32_t i = 0; i < count; i++) { - Value value = exports->getDenseElement(i); - props.infallibleAppend(AtomToId(&value.toString()->asAtom())); - } + Rooted names(cx, ValueVector(cx)); + if (!names.resize(count) || !GetElements(cx, exports, count, names.begin())) + return false; + + for (uint32_t i = 0; i < count; i++) + props.infallibleAppend(AtomToId(&names[i].toString()->asAtom())); return true; } @@ -631,14 +633,14 @@ ModuleObject::importBindings() return *static_cast(getReservedSlot(ImportBindingsSlot).toPrivate()); } -ArrayObject* +JSObject* ModuleObject::namespaceExports() { Value value = getReservedSlot(NamespaceExportsSlot); if (value.isUndefined()) return nullptr; - return &value.toObject().as(); + return &value.toObject(); } IndirectBindingMap* @@ -820,9 +822,10 @@ ModuleObject::evaluate(JSContext* cx, HandleModuleObject self, MutableHandleValu } /* static */ ModuleNamespaceObject* -ModuleObject::createNamespace(JSContext* cx, HandleModuleObject self, HandleArrayObject exports) +ModuleObject::createNamespace(JSContext* cx, HandleModuleObject self, HandleObject exports) { MOZ_ASSERT(!self->namespace_()); + MOZ_ASSERT(exports->is() || exports->is()); RootedModuleNamespaceObject ns(cx, ModuleNamespaceObject::create(cx, self)); if (!ns) diff --git a/js/src/builtin/ModuleObject.h b/js/src/builtin/ModuleObject.h index 973e026a5ba6..640802a21665 100644 --- a/js/src/builtin/ModuleObject.h +++ b/js/src/builtin/ModuleObject.h @@ -133,7 +133,7 @@ class ModuleNamespaceObject : public ProxyObject static ModuleNamespaceObject* create(JSContext* cx, HandleModuleObject module); ModuleObject& module(); - ArrayObject& exports(); + JSObject& exports(); IndirectBindingMap& bindings(); bool addBinding(JSContext* cx, HandleAtom exportedName, HandleModuleObject targetModule, @@ -245,7 +245,7 @@ class ModuleObject : public NativeObject ArrayObject& indirectExportEntries() const; ArrayObject& starExportEntries() const; IndirectBindingMap& importBindings(); - ArrayObject* namespaceExports(); + JSObject* namespaceExports(); IndirectBindingMap* namespaceBindings(); void createEnvironment(); @@ -257,7 +257,7 @@ class ModuleObject : public NativeObject static bool evaluate(JSContext* cx, HandleModuleObject self, MutableHandleValue rval); static ModuleNamespaceObject* createNamespace(JSContext* cx, HandleModuleObject self, - HandleArrayObject exports); + HandleObject exports); private: static void trace(JSTracer* trc, JSObject* obj); diff --git a/js/src/jit-test/tests/modules/bug-1247934.js b/js/src/jit-test/tests/modules/bug-1247934.js new file mode 100644 index 000000000000..82746ac61a8e --- /dev/null +++ b/js/src/jit-test/tests/modules/bug-1247934.js @@ -0,0 +1,11 @@ +// |jit-test| --unboxed-arrays + +let moduleRepo = {}; +setModuleResolveHook(function(module, specifier) { + return moduleRepo[specifier]; +}); +setJitCompilerOption("ion.warmup.trigger", 50); +s = ""; +for (i = 0; i < 1024; i++) s += "export let e" + i + "\n"; +moduleRepo['a'] = parseModule(s); +parseModule("import * as ns from 'a'").declarationInstantiation(); diff --git a/js/src/vm/SelfHosting.cpp b/js/src/vm/SelfHosting.cpp index f5eaa4b6beaf..e1c66f93dc9c 100644 --- a/js/src/vm/SelfHosting.cpp +++ b/js/src/vm/SelfHosting.cpp @@ -1634,7 +1634,7 @@ intrinsic_NewModuleNamespace(JSContext* cx, unsigned argc, Value* vp) CallArgs args = CallArgsFromVp(argc, vp); MOZ_ASSERT(args.length() == 2); RootedModuleObject module(cx, &args[0].toObject().as()); - RootedArrayObject exports(cx, &args[1].toObject().as()); + RootedObject exports(cx, &args[1].toObject()); RootedObject namespace_(cx, ModuleObject::createNamespace(cx, module, exports)); if (!namespace_) return false;