Bug 1326453 - Part 1: Remove @@iterator method from module namespace objects per ES2017

This commit is contained in:
janekptacijarabaci 2018-04-14 08:49:15 +02:00 • committed by Roy Tam
commit 99f20bdc22
4 changed files with 1 additions and 63 deletions

View file

@ -318,11 +318,3 @@ function ModuleEvaluation()
return EvaluateModule(module);
}
_SetCanonicalName(ModuleEvaluation, "ModuleEvaluation");
function ModuleNamespaceEnumerate()
{
if (!IsObject(this) || !IsModuleNamespace(this))
return callFunction(CallModuleMethodIfWrapped, this, "ModuleNamespaceEnumerate");
return CreateListIterator(ModuleNamespaceExports(this));
}

View file

@ -289,14 +289,6 @@ ModuleNamespaceObject::create(JSContext* cx, HandleModuleObject module)
if (!object)
return nullptr;
RootedId funName(cx, INTERNED_STRING_TO_JSID(cx, cx->names().Symbol_iterator_fun));
RootedFunction enumerateFun(cx);
enumerateFun = JS::GetSelfHostedFunction(cx, "ModuleNamespaceEnumerate", funName, 0);
if (!enumerateFun)
return nullptr;
SetProxyExtra(object, ProxyHandler::EnumerateFunctionSlot, ObjectValue(*enumerateFun));
return &object->as<ModuleNamespaceObject>();
}
@ -341,11 +333,6 @@ ModuleNamespaceObject::ProxyHandler::ProxyHandler()
: BaseProxyHandler(&family, true)
{}
JS::Value ModuleNamespaceObject::ProxyHandler::getEnumerateFunction(HandleObject proxy) const
{
return GetProxyExtra(proxy, EnumerateFunctionSlot);
}
bool
ModuleNamespaceObject::ProxyHandler::getPrototype(JSContext* cx, HandleObject proxy,
MutableHandleObject protop) const
@ -402,15 +389,6 @@ ModuleNamespaceObject::ProxyHandler::getOwnPropertyDescriptor(JSContext* cx, Han
Rooted<ModuleNamespaceObject*> ns(cx, &proxy->as<ModuleNamespaceObject>());
if (JSID_IS_SYMBOL(id)) {
Rooted<JS::Symbol*> symbol(cx, JSID_TO_SYMBOL(id));
if (symbol == cx->wellKnownSymbols().iterator) {
RootedValue enumerateFun(cx, getEnumerateFunction(proxy));
desc.object().set(proxy);
desc.setConfigurable(false);
desc.setEnumerable(false);
desc.setValue(enumerateFun);
return true;
}
if (symbol == cx->wellKnownSymbols().toStringTag) {
RootedValue value(cx, StringValue(cx->names().Module));
desc.object().set(proxy);
@ -458,8 +436,7 @@ ModuleNamespaceObject::ProxyHandler::has(JSContext* cx, HandleObject proxy, Hand
Rooted<ModuleNamespaceObject*> ns(cx, &proxy->as<ModuleNamespaceObject>());
if (JSID_IS_SYMBOL(id)) {
Rooted<JS::Symbol*> symbol(cx, JSID_TO_SYMBOL(id));
return symbol == cx->wellKnownSymbols().iterator ||
symbol == cx->wellKnownSymbols().toStringTag;
return symbol == cx->wellKnownSymbols().toStringTag;
}
*bp = ns->bindings().has(id);
@ -473,11 +450,6 @@ ModuleNamespaceObject::ProxyHandler::get(JSContext* cx, HandleObject proxy, Hand
Rooted<ModuleNamespaceObject*> ns(cx, &proxy->as<ModuleNamespaceObject>());
if (JSID_IS_SYMBOL(id)) {
Rooted<JS::Symbol*> symbol(cx, JSID_TO_SYMBOL(id));
if (symbol == cx->wellKnownSymbols().iterator) {
vp.set(getEnumerateFunction(proxy));
return true;
}
if (symbol == cx->wellKnownSymbols().toStringTag) {
vp.setString(cx->names().Module);
return true;

View file

@ -142,15 +142,8 @@ class ModuleNamespaceObject : public ProxyObject
private:
struct ProxyHandler : public BaseProxyHandler
{
enum
{
EnumerateFunctionSlot = 0
};
ProxyHandler();
JS::Value getEnumerateFunction(HandleObject proxy) const;
bool getOwnPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id,
MutableHandle<PropertyDescriptor> desc) const override;
bool defineProperty(JSContext* cx, HandleObject proxy, HandleId id,

View file

@ -64,25 +64,6 @@ assertEq(typeof desc.get, "undefined");
assertEq(typeof desc.set, "undefined");
assertEq(Object.prototype.toString.call(ns), "[object Module]");
// Test @@iterator method.
let iteratorFun = ns[Symbol.iterator];
assertEq(iteratorFun.name, "[Symbol.iterator]");
let iterator = ns[Symbol.iterator]();
assertEq(iterator[Symbol.iterator](), iterator);
assertIteratorNext(iterator, "a");
assertIteratorNext(iterator, "b");
assertIteratorDone(iterator);
// The iterator's next method can only be called on the object it was originally
// associated with.
iterator = ns[Symbol.iterator]();
let iterator2 = ns[Symbol.iterator]();
assertThrowsInstanceOf(() => iterator.next.call({}), TypeError);
assertThrowsInstanceOf(() => iterator.next.call(iterator2), TypeError);
assertEq(iterator.next.call(iterator).value, "a");
assertEq(iterator2.next.call(iterator2).value, "a");
// Test cyclic namespace import and access in module evaluation.
let c = moduleRepo['c'] =
parseModule("export let c = 1; import * as ns from 'd'; let d = ns.d;");