v8/test/mjsunit/es6/arguments-iterator.js
cbruni 2f1df49a6c Fixing Sloppy Symbol.iterator setter
In certiain cases the ArgumentsIteratorSetter would trigger an invalid
state in the LookupIterator when being overridden. This is now solved
by bypassing the SetDataProperty and directly using
DefinePropertyOrElementIgnoringAttributes since we know exactly which
property we're going to install

LOG=N
BUG=chromium:521484

Review URL: https://codereview.chromium.org/1332873002

Cr-Commit-Position: refs/heads/master@{#30705}
2015-09-14 07:22:35 +00:00

243 lines
6.8 KiB
JavaScript

// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax
// Note in general that "arguments.foo" and "var o = arguments; o.foo"
// are treated differently by full-codegen, and so both cases need to be
// tested.
function TestDirectArgumentsIteratorProperty() {
assertTrue(arguments.hasOwnProperty(Symbol.iterator));
assertFalse(arguments.propertyIsEnumerable(Symbol.iterator));
var descriptor = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator);
assertTrue(descriptor.writable);
assertFalse(descriptor.enumerable);
assertTrue(descriptor.configurable);
assertEquals(descriptor.value, [][Symbol.iterator]);
assertEquals(arguments[Symbol.iterator], [][Symbol.iterator]);
}
TestDirectArgumentsIteratorProperty();
function TestIndirectArgumentsIteratorProperty() {
var o = arguments;
assertTrue(o.hasOwnProperty(Symbol.iterator));
assertFalse(o.propertyIsEnumerable(Symbol.iterator));
assertEquals(o[Symbol.iterator], [][Symbol.iterator]);
}
TestIndirectArgumentsIteratorProperty();
function assertIteratorResult(value, done, result) {
assertEquals({value: value, done: done}, result);
}
function TestDirectValues1(a, b, c) {
var iterator = arguments[Symbol.iterator]();
assertIteratorResult(a, false, iterator.next());
assertIteratorResult(b, false, iterator.next());
assertIteratorResult(c, false, iterator.next());
assertIteratorResult(undefined, true, iterator.next());
}
TestDirectValues1(1, 2, 3);
function TestIndirectValues1(a, b, c) {
var args = arguments;
var iterator = args[Symbol.iterator]();
assertIteratorResult(a, false, iterator.next());
assertIteratorResult(b, false, iterator.next());
assertIteratorResult(c, false, iterator.next());
assertIteratorResult(undefined, true, iterator.next());
}
TestIndirectValues1(1, 2, 3);
function TestDirectValues2(a, b, c) {
var iterator = arguments[Symbol.iterator]();
assertIteratorResult(a, false, iterator.next());
assertIteratorResult(b, false, iterator.next());
assertIteratorResult(c, false, iterator.next());
assertIteratorResult(undefined, true, iterator.next());
arguments[3] = 4;
arguments.length = 4;
assertIteratorResult(undefined, true, iterator.next());
}
TestDirectValues2(1, 2, 3);
function TestIndirectValues2(a, b, c) {
var args = arguments;
var iterator = args[Symbol.iterator]();
assertIteratorResult(a, false, iterator.next());
assertIteratorResult(b, false, iterator.next());
assertIteratorResult(c, false, iterator.next());
assertIteratorResult(undefined, true, iterator.next());
arguments[3] = 4;
arguments.length = 4;
assertIteratorResult(undefined, true, iterator.next());
}
TestIndirectValues2(1, 2, 3);
function TestDirectValues3(a, b, c) {
var iterator = arguments[Symbol.iterator]();
assertIteratorResult(a, false, iterator.next());
assertIteratorResult(b, false, iterator.next());
arguments.length = 2;
assertIteratorResult(undefined, true, iterator.next());
}
TestDirectValues3(1, 2, 3);
function TestIndirectValues3(a, b, c) {
var args = arguments;
var iterator = args[Symbol.iterator]();
assertIteratorResult(a, false, iterator.next());
assertIteratorResult(b, false, iterator.next());
arguments.length = 2;
assertIteratorResult(undefined, true, iterator.next());
}
TestIndirectValues3(1, 2, 3);
function TestDirectValues4(a, b, c) {
var iterator = arguments[Symbol.iterator]();
assertIteratorResult(a, false, iterator.next());
assertIteratorResult(b, false, iterator.next());
assertIteratorResult(c, false, iterator.next());
arguments.length = 4;
assertIteratorResult(undefined, false, iterator.next());
assertIteratorResult(undefined, true, iterator.next());
}
TestDirectValues4(1, 2, 3);
function TestIndirectValues4(a, b, c) {
var args = arguments;
var iterator = args[Symbol.iterator]();
assertIteratorResult(a, false, iterator.next());
assertIteratorResult(b, false, iterator.next());
assertIteratorResult(c, false, iterator.next());
arguments.length = 4;
assertIteratorResult(undefined, false, iterator.next());
assertIteratorResult(undefined, true, iterator.next());
}
TestIndirectValues4(1, 2, 3);
function TestForOf() {
var i = 0;
for (var value of arguments) {
assertEquals(arguments[i++], value);
}
assertEquals(arguments.length, i);
}
TestForOf(1, 2, 3, 4, 5);
function TestAssignmentToIterator() {
var i = 0;
arguments[Symbol.iterator] = [].entries;
for (var entry of arguments) {
assertEquals([i, arguments[i]], entry);
i++;
}
assertEquals(arguments.length, i);
}
TestAssignmentToIterator(1, 2, 3, 4, 5);
// Regression test for crbug.com/521484.
function TestAssignmentToIterator2() {
var i = 0;
arguments.__defineGetter__('callee', function(){});
arguments.__defineGetter__('length', function(){ return 1 });
arguments[Symbol.iterator] = [].entries;
for (var entry of arguments) {
assertEquals([i, arguments[i]], entry);
i++;
}
assertEquals(arguments.length, i);
}
TestAssignmentToIterator2(1, 2, 3, 4, 5);
function TestArgumentsMutation() {
var i = 0;
for (var x of arguments) {
assertEquals(arguments[i], x);
arguments[i+1] *= 2;
i++;
}
assertEquals(arguments.length, i);
}
TestArgumentsMutation(1, 2, 3, 4, 5);
function TestSloppyArgumentsAliasing(a0, a1, a2, a3, a4) {
var i = 0;
for (var x of arguments) {
assertEquals(arguments[i], x);
a0 = a1; a1 = a2; a3 = a4;
i++;
}
assertEquals(arguments.length, i);
}
TestSloppyArgumentsAliasing(1, 2, 3, 4, 5);
function TestStrictArgumentsAliasing(a0, a1, a2, a3, a4) {
"use strict";
var i = 0;
for (var x of arguments) {
a0 = a1; a1 = a2; a3 = a4;
assertEquals(arguments[i], x);
i++;
}
assertEquals(arguments.length, i);
}
TestStrictArgumentsAliasing(1, 2, 3, 4, 5);
function TestArgumentsAsProto() {
"use strict";
var o = {__proto__:arguments};
assertSame([][Symbol.iterator], o[Symbol.iterator]);
// Make o dict-mode.
%OptimizeObjectForAddingMultipleProperties(o, 0);
assertFalse(o.hasOwnProperty(Symbol.iterator));
assertSame([][Symbol.iterator], o[Symbol.iterator]);
o[Symbol.iterator] = 10;
assertTrue(o.hasOwnProperty(Symbol.iterator));
assertEquals(10, o[Symbol.iterator]);
assertSame([][Symbol.iterator], arguments[Symbol.iterator]);
// Frozen o.
o = Object.freeze({__proto__:arguments});
assertSame([][Symbol.iterator], o[Symbol.iterator]);
assertFalse(o.hasOwnProperty(Symbol.iterator));
assertSame([][Symbol.iterator], o[Symbol.iterator]);
assertThrows(function () { o[Symbol.iterator] = 10 });
assertFalse(o.hasOwnProperty(Symbol.iterator));
assertEquals([][Symbol.iterator], o[Symbol.iterator]);
assertSame([][Symbol.iterator], arguments[Symbol.iterator]);
}
TestArgumentsAsProto();