Bug 771027 - for-of semantics: convert the result of obj.iterator() to an object. r=bhackett.

This commit is contained in:
Jason Orendorff 2012-07-19 17:03:20 -05:00
parent 51bff16787
commit 01b2776ef4
3 changed files with 32 additions and 1 deletions

View File

@ -0,0 +1,23 @@
// The Set constructor throws TypeError when passed a non-iterable argument.
load(libdir + "asserts.js");
function argsobj() { return arguments; }
var misc = [
{}, {x: 1}, Math, isNaN,
Object.create(null),
argsobj(0, 1, 2),
null,
true, 0, 3.1416,
new Boolean(true), new Number(0),
{iterator: function () { return undefined; }},
{iterator: function () { return null; }},
{iterator: function () { return true; }},
{iterator: function () { return 17; }},
];
for (var v of misc) {
assertThrowsInstanceOf(function () { Set(v); }, TypeError);
assertThrowsInstanceOf(function () { Map(v); }, TypeError);
}

View File

@ -10,7 +10,12 @@ var misc = [
argsobj(0, 1, 2),
null, undefined,
true, 0, 3.1416,
new Boolean(true), new Number(0)];
new Boolean(true), new Number(0),
{iterator: function () { return undefined; }},
{iterator: function () { return null; }},
{iterator: function () { return true; }},
{iterator: function () { return 17; }},
];
for (var i = 0; i < misc.length; i++) {
let v = misc[i];

View File

@ -610,6 +610,9 @@ GetIterator(JSContext *cx, HandleObject obj, unsigned flags, Value *vp)
if (!Invoke(cx, ObjectOrNullValue(obj), method, 0, NULL, vp))
return false;
if (!ToObject(cx, vp))
return false;
return true;
}