Bug 1247934 - Handle receiving unboxed exports array from self hosted module code r=shu

This commit is contained in:
Jon Coppeard 2016-02-17 15:48:15 +00:00
Родитель 59ba7153be
Коммит 2e94e291fd
4 изменённых файлов: 30 добавлений и 16 удалений

Просмотреть файл

@ -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;