Bug 1225392 part 2. WebIDL autogenerated iterators should chain up to %IteratorPrototype%. r=qdot

This commit is contained in:
Boris Zbarsky 2015-11-18 18:26:07 -05:00
parent c0a3244687
commit 7c672a451f
3 changed files with 47 additions and 0 deletions

View File

@ -3285,6 +3285,13 @@ GetErrorPrototype(JSContext* aCx, JS::Handle<JSObject*> aForObj)
return JS_GetErrorPrototype(aCx);
}
inline
JSObject*
GetIteratorPrototype(JSContext* aCx, JS::Handle<JSObject*> aForObj)
{
return JS_GetIteratorPrototype(aCx);
}
// Resolve an id on the given global object that wants to be included in
// Exposed=System webidl annotations. False return value means exception
// thrown.

View File

@ -580,6 +580,8 @@ def InterfacePrototypeObjectProtoGetter(descriptor):
protoGetter = "JS_GetArrayPrototype"
elif descriptor.interface.getExtendedAttribute("ExceptionClass"):
protoGetter = "GetErrorPrototype"
elif descriptor.interface.isIteratorInterface():
protoGetter = "GetIteratorPrototype"
else:
protoGetter = "JS_GetObjectPrototype"
protoHandleGetter = None
@ -2259,6 +2261,22 @@ class MethodDefiner(PropertyDefiner):
"condition": MemberCondition(None, None)
})
# Output an @@iterator for generated iterator interfaces. This should
# not be necessary, but
# https://bugzilla.mozilla.org/show_bug.cgi?id=1091945 means that
# %IteratorPrototype%[@@iterator] is a broken puppy.
if (not static and
not unforgeable and
descriptor.interface.isIteratorInterface()):
self.regular.append({
"name": "@@iterator",
"methodInfo": False,
"selfHostedName": "IteratorIdentity",
"length": 0,
"flags": "0",
"condition": MemberCondition(None, None)
})
# Generate the maplike/setlike iterator, if one wasn't already
# generated by a method. If we already have an @@iterator symbol, fail.
if descriptor.interface.maplikeOrSetlikeOrIterable:

View File

@ -50,6 +50,9 @@
info("IterableSingle: Testing simple iterable creation and functionality");
itr = new TestInterfaceIterableSingle();
testExistence("IterableSingle: ", itr, base_properties);
var keys = [...itr.keys()];
var values = [...itr.values()];
var entries = [...itr.entries()];
var key_itr = itr.keys();
var value_itr = itr.values();
var entries_itr = itr.entries();
@ -58,9 +61,17 @@
var value = value_itr.next();
var entry = entries_itr.next();
is(key.value, i, "IterableSingle: Key iterator value should be " + i);
is(key.value, keys[i],
"IterableSingle: Key iterator value should match destructuring " + i);
is(value.value, key.value, "IterableSingle: Value iterator value should be " + key.value);
is(value.value, values[i],
"IterableSingle: Value iterator value should match destructuring " + i);
is(entry.value[0], i, "IterableSingle: Entry iterator value 0 should be " + i);
is(entry.value[1], i, "IterableSingle: Entry iterator value 1 should be " + i);
is(entry.value[0], entries[i][0],
"IterableSingle: Entry iterator value 0 should match destructuring " + i);
is(entry.value[1], entries[i][1],
"IterableSingle: Entry iterator value 1 should match destructuring " + i);
}
var key = key_itr.next();
var value = value_itr.next();
@ -80,6 +91,9 @@
itr = new TestInterfaceIterableDouble();
testExistence("IterableDouble: ", itr, base_properties);
var elements = [["a", "b"], ["c", "d"], ["e", "f"]]
var keys = [...itr.keys()];
var values = [...itr.values()];
var entries = [...itr.entries()];
var key_itr = itr.keys();
var value_itr = itr.values();
var entries_itr = itr.entries();
@ -88,9 +102,17 @@
var value = value_itr.next();
var entry = entries_itr.next();
is(key.value, elements[i][0], "IterableDouble: Key iterator value should be " + elements[i][0]);
is(key.value, keys[i],
"IterableDouble: Key iterator value should match destructuring " + i);
is(value.value, elements[i][1], "IterableDouble: Value iterator value should be " + elements[i][1]);
is(value.value, values[i],
"IterableDouble: Value iterator value should match destructuring " + i);
is(entry.value[0], elements[i][0], "IterableDouble: Entry iterator value 0 should be " + elements[i][0]);
is(entry.value[1], elements[i][1], "IterableDouble: Entry iterator value 1 should be " + elements[i][1]);
is(entry.value[0], entries[i][0],
"IterableDouble: Entry iterator value 0 should match destructuring " + i);
is(entry.value[1], entries[i][1],
"IterableDouble: Entry iterator value 1 should match destructuring " + i);
}
var key = key_itr.next();
var value = value_itr.next();