зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1247934 - Handle receiving unboxed exports array from self hosted module code r=shu
This commit is contained in:
Родитель
59ba7153be
Коммит
2e94e291fd
|
@ -300,10 +300,10 @@ ModuleNamespaceObject::module()
|
|||
return GetProxyPrivate(this).toObject().as<ModuleObject>();
|
||||
}
|
||||
|
||||
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<ModuleNamespaceObject*> ns(cx, &proxy->as<ModuleNamespaceObject>());
|
||||
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<ValueVector> 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<IndirectBindingMap*>(getReservedSlot(ImportBindingsSlot).toPrivate());
|
||||
}
|
||||
|
||||
ArrayObject*
|
||||
JSObject*
|
||||
ModuleObject::namespaceExports()
|
||||
{
|
||||
Value value = getReservedSlot(NamespaceExportsSlot);
|
||||
if (value.isUndefined())
|
||||
return nullptr;
|
||||
|
||||
return &value.toObject().as<ArrayObject>();
|
||||
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<ArrayObject>() || exports->is<UnboxedArrayObject>());
|
||||
|
||||
RootedModuleNamespaceObject ns(cx, ModuleNamespaceObject::create(cx, self));
|
||||
if (!ns)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
|
@ -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<ModuleObject>());
|
||||
RootedArrayObject exports(cx, &args[1].toObject().as<ArrayObject>());
|
||||
RootedObject exports(cx, &args[1].toObject());
|
||||
RootedObject namespace_(cx, ModuleObject::createNamespace(cx, module, exports));
|
||||
if (!namespace_)
|
||||
return false;
|
||||
|
|
Загрузка…
Ссылка в новой задаче