From 01b2776ef47fb2c96727106c7ede5e4aa51bf407 Mon Sep 17 00:00:00 2001 From: Jason Orendorff Date: Thu, 19 Jul 2012 17:03:20 -0500 Subject: [PATCH] Bug 771027 - for-of semantics: convert the result of obj.iterator() to an object. r=bhackett. --- .../tests/collections/constructor-errors.js | 23 +++++++++++++++++++ js/src/jit-test/tests/for-of/non-iterable.js | 7 +++++- js/src/jsiter.cpp | 3 +++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 js/src/jit-test/tests/collections/constructor-errors.js diff --git a/js/src/jit-test/tests/collections/constructor-errors.js b/js/src/jit-test/tests/collections/constructor-errors.js new file mode 100644 index 00000000000..a5b9d35b824 --- /dev/null +++ b/js/src/jit-test/tests/collections/constructor-errors.js @@ -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); +} \ No newline at end of file diff --git a/js/src/jit-test/tests/for-of/non-iterable.js b/js/src/jit-test/tests/for-of/non-iterable.js index f62ad4a43a4..319e622ef1e 100644 --- a/js/src/jit-test/tests/for-of/non-iterable.js +++ b/js/src/jit-test/tests/for-of/non-iterable.js @@ -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]; diff --git a/js/src/jsiter.cpp b/js/src/jsiter.cpp index 25cc5292ddc..ee5d02123e9 100644 --- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -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; }