diff --git a/js/src/builtin/Iterator.js b/js/src/builtin/Iterator.js index e25b761561f0..2771f0654179 100644 --- a/js/src/builtin/Iterator.js +++ b/js/src/builtin/Iterator.js @@ -30,10 +30,6 @@ function LegacyIteratorThrow(exn) { } } -function LegacyIterator(iter) { - callFunction(std_WeakMap_set, LegacyIteratorWrapperMap, this, iter); -} - function LegacyGeneratorIterator(iter) { callFunction(std_WeakMap_set, LegacyIteratorWrapperMap, this, iter); } @@ -55,9 +51,6 @@ function InitLegacyIterators() { props[std_iterator].configurable = true; props[std_iterator].writable = true; - var LegacyIteratorProto = std_Object_create(GetIteratorPrototype(), props); - MakeConstructible(LegacyIterator, LegacyIteratorProto); - props.throw = std_Object_create(null); props.throw.value = LegacyIteratorThrow; props.throw.enumerable = false; @@ -70,17 +63,11 @@ function InitLegacyIterators() { LegacyIteratorsInitialized.initialized = true; } -function NewLegacyIterator(iter, wrapper) { +function LegacyGeneratorIteratorShim() { + var iter = ToObject(this); + if (!LegacyIteratorsInitialized.initialized) InitLegacyIterators(); - return new wrapper(iter); -} - -function LegacyIteratorShim() { - return NewLegacyIterator(ToObject(this), LegacyIterator); -} - -function LegacyGeneratorIteratorShim() { - return NewLegacyIterator(ToObject(this), LegacyGeneratorIterator); + return new LegacyGeneratorIterator(iter); } diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp index d58f6fdca663..bd08eeeae1b3 100644 --- a/js/src/builtin/TestingFunctions.cpp +++ b/js/src/builtin/TestingFunctions.cpp @@ -4443,7 +4443,7 @@ IsLegacyIterator(JSContext* cx, unsigned argc, Value* vp) if (args.length() < 1) args.rval().setBoolean(false); else - args.rval().setBoolean(IsLegacyIterator(args[0])); + args.rval().setBoolean(IsPropertyIterator(args[0])); return true; } diff --git a/js/src/jit-test/lib/range.js b/js/src/jit-test/lib/range.js deleted file mode 100644 index e37c6351e9a4..000000000000 --- a/js/src/jit-test/lib/range.js +++ /dev/null @@ -1,22 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Library file for tests to load. - -function Range(start, stop) { - this.i = start; - this.stop = stop; -} -Range.prototype = { - __iterator__: function() { return this; }, - next: function() { - if (this.i >= this.stop) - throw StopIteration; - return this.i++; - } -}; - -function range(start, stop) { - return new Range(start, stop); -} diff --git a/js/src/jit-test/tests/basic/testShiftLeft.js b/js/src/jit-test/tests/basic/testShiftLeft.js index 4cc78f5eaaa2..341b59aa5237 100644 --- a/js/src/jit-test/tests/basic/testShiftLeft.js +++ b/js/src/jit-test/tests/basic/testShiftLeft.js @@ -4,8 +4,6 @@ * important on ARM as an explicit mask is required at the native instruction * level. */ -load(libdir + 'range.js'); - function testShiftLeft() { var r = []; diff --git a/js/src/jit-test/tests/basic/testShiftRightArithmetic.js b/js/src/jit-test/tests/basic/testShiftRightArithmetic.js index 7268dc0bad39..6ecdcc4a90aa 100644 --- a/js/src/jit-test/tests/basic/testShiftRightArithmetic.js +++ b/js/src/jit-test/tests/basic/testShiftRightArithmetic.js @@ -2,8 +2,6 @@ * especially important on ARM as an explicit mask is required at the native * instruction level. */ -load(libdir + 'range.js'); - /* Test different combinations of literals/variables. */ var s = 4; var t = 100; diff --git a/js/src/jit-test/tests/basic/testShiftRightLogical.js b/js/src/jit-test/tests/basic/testShiftRightLogical.js index de2dda6f226c..72bc56d54e1c 100644 --- a/js/src/jit-test/tests/basic/testShiftRightLogical.js +++ b/js/src/jit-test/tests/basic/testShiftRightLogical.js @@ -2,8 +2,6 @@ * especially important on ARM as an explicit mask is required at the native * instruction level. */ -load(libdir + 'range.js'); - function testShiftRightLogical() { var r = []; diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index a12af1513232..58ce054f6dcf 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -1005,11 +1005,11 @@ IsObjectInContextCompartment(JSObject* obj, const JSContext* cx); /* * NB: keep these in sync with the copy in builtin/SelfHostingDefines.h. - * The first three are omitted because they shouldn't be used in new code. + * The first two are omitted because they shouldn't be used in new code. */ #define JSITER_ENUMERATE 0x1 /* for-in compatible hidden default iterator */ #define JSITER_FOREACH 0x2 /* get obj[key] for each property */ -#define JSITER_KEYVALUE 0x4 /* obsolete destructuring for-in wants [key, value] */ +/* 0x4 is no longer used */ #define JSITER_OWNONLY 0x8 /* iterate over obj's own properties only */ #define JSITER_HIDDEN 0x10 /* also enumerate non-enumerable properties */ #define JSITER_SYMBOLS 0x20 /* also include symbol property keys */ diff --git a/js/src/jsiter.cpp b/js/src/jsiter.cpp index 58a810d63d22..c857284e4bd1 100644 --- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -73,12 +73,6 @@ NativeIterator::trace(JSTracer* trc) typedef HashSet> IdSet; -static inline bool -NewKeyValuePair(JSContext* cx, jsid id, const Value& val, MutableHandleValue rval) -{ - return NewValuePair(cx, IdToValue(id), val, rval); -} - template static inline bool Enumerate(JSContext* cx, HandleObject pobj, jsid id, @@ -542,7 +536,7 @@ js::GetPropertyKeys(JSContext* cx, HandleObject obj, unsigned flags, AutoIdVecto props); } -static bool legacy_iterator_next(JSContext* cx, unsigned argc, Value* vp); +static bool property_iterator_next(JSContext* cx, unsigned argc, Value* vp); static inline PropertyIteratorObject* NewPropertyIteratorObject(JSContext* cx, unsigned flags) @@ -583,7 +577,7 @@ NewPropertyIteratorObject(JSContext* cx, unsigned flags) // next method on the prototype doesn't break cross-global for .. in. // We don't have to do this for JSITER_ENUMERATE because that object always // takes an optimized path. - RootedFunction next(cx, NewNativeFunction(cx, legacy_iterator_next, 0, + RootedFunction next(cx, NewNativeFunction(cx, property_iterator_next, 0, HandlePropertyName(cx->names().next))); if (!next) return nullptr; @@ -1048,22 +1042,19 @@ NativeIteratorNext(JSContext* cx, NativeIterator* ni, MutableHandleValue rval, b if (!GetProperty(cx, obj, obj, id, rval)) return false; - // JS 1.7 only: for each (let [k, v] in obj) - if (ni->flags & JSITER_KEYVALUE) - return NewKeyValuePair(cx, id, rval, rval); return true; } bool -js::IsLegacyIterator(HandleValue v) +js::IsPropertyIterator(HandleValue v) { - return v.isObject() && v.toObject().hasClass(&PropertyIteratorObject::class_); + return v.isObject() && v.toObject().is(); } MOZ_ALWAYS_INLINE bool -legacy_iterator_next_impl(JSContext* cx, const CallArgs& args) +property_iterator_next_impl(JSContext* cx, const CallArgs& args) { - MOZ_ASSERT(IsLegacyIterator(args.thisv())); + MOZ_ASSERT(IsPropertyIterator(args.thisv())); RootedObject thisObj(cx, &args.thisv().toObject()); @@ -1084,10 +1075,10 @@ legacy_iterator_next_impl(JSContext* cx, const CallArgs& args) } static bool -legacy_iterator_next(JSContext* cx, unsigned argc, Value* vp) +property_iterator_next(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); - return CallNonGenericMethod(cx, args); + return CallNonGenericMethod(cx, args); } size_t @@ -1198,9 +1189,6 @@ js::NewStringIteratorObject(JSContext* cx, NewObjectKind newKind) JSObject* js::ValueToIterator(JSContext* cx, unsigned flags, HandleValue vp) { - /* JSITER_KEYVALUE must always come with JSITER_FOREACH */ - MOZ_ASSERT_IF(flags & JSITER_KEYVALUE, flags & JSITER_FOREACH); - RootedObject obj(cx); if (vp.isObject()) { /* Common case. */ diff --git a/js/src/jsiter.h b/js/src/jsiter.h index 427a7b429c82..943794378989 100644 --- a/js/src/jsiter.h +++ b/js/src/jsiter.h @@ -218,7 +218,7 @@ extern JSObject* CreateIterResultObject(JSContext* cx, HandleValue value, bool done); bool -IsLegacyIterator(HandleValue v); +IsPropertyIterator(HandleValue v); extern JSObject* InitStopIterationClass(JSContext* cx, HandleObject obj); diff --git a/js/src/tests/ecma_5/Object/15.2.3.14-01.js b/js/src/tests/ecma_5/Object/15.2.3.14-01.js index 81ab3fe38a5a..1a92bf324999 100644 --- a/js/src/tests/ecma_5/Object/15.2.3.14-01.js +++ b/js/src/tests/ecma_5/Object/15.2.3.14-01.js @@ -36,7 +36,7 @@ keys = Object.keys(o), assertEq(arraysEqual(keys, ["a", "b"]), true, "" + keys); -o = { __iterator__: function() { return Iterator({a: 2, b: 3}); } }; +o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } }; keys = Object.keys(o); assertEq(arraysEqual(keys, ["__iterator__"]), true, "" + keys); diff --git a/js/src/tests/ecma_6/Proxy/proxy-proto-lazy-props.js b/js/src/tests/ecma_6/Proxy/proxy-proto-lazy-props.js index fba89eecd500..c82c0f935bed 100644 --- a/js/src/tests/ecma_6/Proxy/proxy-proto-lazy-props.js +++ b/js/src/tests/ecma_6/Proxy/proxy-proto-lazy-props.js @@ -7,9 +7,7 @@ function makeProxyPrototype(target) { return []; }, get(t, pk, r) { - // Handle the non-standard __iterator__ hook. - if (pk !== "__iterator__") - throw new Error("Unexpected [[Get]]: " + String(pk)); + throw new Error("Unexpected [[Get]]: " + String(pk)); } }, { get(t, pk, r) { diff --git a/js/src/tests/ecma_7/Object/entries.js b/js/src/tests/ecma_7/Object/entries.js index ee339ae236dc..342cfa1a1413 100644 --- a/js/src/tests/ecma_7/Object/entries.js +++ b/js/src/tests/ecma_7/Object/entries.js @@ -16,7 +16,7 @@ if ("entries" in Object) { entries = Object.entries(o), assertDeepEq(entries, [["a", 17], ["b", 2]]); - o = { __iterator__: function() { return Iterator({a: 2, b: 3}); } }; + o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } }; entries = Object.entries(o); assertDeepEq(entries, [["__iterator__", o.__iterator__]]); diff --git a/js/src/tests/ecma_7/Object/values.js b/js/src/tests/ecma_7/Object/values.js index 78543c875a0c..7f2a7464efcd 100644 --- a/js/src/tests/ecma_7/Object/values.js +++ b/js/src/tests/ecma_7/Object/values.js @@ -16,7 +16,7 @@ if ("values" in Object) { values = Object.values(o), assertDeepEq(values, [17, 2]); - o = { __iterator__: function() { return Iterator({a: 2, b: 3}); } }; + o = { __iterator__: function() { throw new Error("non-standard __iterator__ called?"); } }; values = Object.values(o); assertDeepEq(values, [o.__iterator__]);