1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --allow-natives-syntax
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Note in general that "arguments.foo" and "var o = arguments; o.foo"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// are treated differently by full-codegen, and so both cases need to be
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// tested.
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDirectArgumentsIteratorProperty() {
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(arguments.hasOwnProperty(Symbol.iterator));
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(arguments.propertyIsEnumerable(Symbol.iterator));
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var descriptor = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator);
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(descriptor.writable);
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(descriptor.enumerable);
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(descriptor.configurable);
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(descriptor.value, [][Symbol.iterator]);
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(arguments[Symbol.iterator], [][Symbol.iterator]);
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDirectArgumentsIteratorProperty();
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestIndirectArgumentsIteratorProperty() {
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var o = arguments;
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(o.hasOwnProperty(Symbol.iterator));
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(o.propertyIsEnumerable(Symbol.iterator));
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(o[Symbol.iterator], [][Symbol.iterator]);
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestIndirectArgumentsIteratorProperty();
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction assertIteratorResult(value, done, result) {
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals({value: value, done: done}, result);
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDirectValues1(a, b, c) {
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = arguments[Symbol.iterator]();
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(a, false, iterator.next());
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(b, false, iterator.next());
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(c, false, iterator.next());
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDirectValues1(1, 2, 3);
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestIndirectValues1(a, b, c) {
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var args = arguments;
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = args[Symbol.iterator]();
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(a, false, iterator.next());
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(b, false, iterator.next());
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(c, false, iterator.next());
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestIndirectValues1(1, 2, 3);
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDirectValues2(a, b, c) {
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = arguments[Symbol.iterator]();
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(a, false, iterator.next());
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(b, false, iterator.next());
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(c, false, iterator.next());
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments[3] = 4;
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments.length = 4;
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDirectValues2(1, 2, 3);
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestIndirectValues2(a, b, c) {
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var args = arguments;
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = args[Symbol.iterator]();
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(a, false, iterator.next());
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(b, false, iterator.next());
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(c, false, iterator.next());
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments[3] = 4;
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments.length = 4;
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestIndirectValues2(1, 2, 3);
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDirectValues3(a, b, c) {
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = arguments[Symbol.iterator]();
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(a, false, iterator.next());
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(b, false, iterator.next());
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments.length = 2;
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDirectValues3(1, 2, 3);
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestIndirectValues3(a, b, c) {
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var args = arguments;
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = args[Symbol.iterator]();
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(a, false, iterator.next());
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(b, false, iterator.next());
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments.length = 2;
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestIndirectValues3(1, 2, 3);
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDirectValues4(a, b, c) {
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = arguments[Symbol.iterator]();
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(a, false, iterator.next());
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(b, false, iterator.next());
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(c, false, iterator.next());
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments.length = 4;
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, false, iterator.next());
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDirectValues4(1, 2, 3);
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestIndirectValues4(a, b, c) {
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var args = arguments;
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = args[Symbol.iterator]();
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(a, false, iterator.next());
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(b, false, iterator.next());
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(c, false, iterator.next());
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments.length = 4;
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, false, iterator.next());
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertIteratorResult(undefined, true, iterator.next());
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestIndirectValues4(1, 2, 3);
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestForOf() {
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var i = 0;
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var value of arguments) {
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(arguments[i++], value);
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(arguments.length, i);
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestForOf(1, 2, 3, 4, 5);
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestAssignmentToIterator() {
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var i = 0;
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  arguments[Symbol.iterator] = [].entries;
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var entry of arguments) {
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals([i, arguments[i]], entry);
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    i++;
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(arguments.length, i);
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestAssignmentToIterator(1, 2, 3, 4, 5);
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArgumentsMutation() {
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var i = 0;
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var x of arguments) {
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(arguments[i], x);
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    arguments[i+1] *= 2;
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    i++;
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(arguments.length, i);
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArgumentsMutation(1, 2, 3, 4, 5);
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSloppyArgumentsAliasing(a0, a1, a2, a3, a4) {
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var i = 0;
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var x of arguments) {
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(arguments[i], x);
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    a0 = a1; a1 = a2; a3 = a4;
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    i++;
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(arguments.length, i);
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSloppyArgumentsAliasing(1, 2, 3, 4, 5);
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestStrictArgumentsAliasing(a0, a1, a2, a3, a4) {
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "use strict";
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var i = 0;
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var x of arguments) {
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    a0 = a1; a1 = a2; a3 = a4;
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(arguments[i], x);
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    i++;
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(arguments.length, i);
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestStrictArgumentsAliasing(1, 2, 3, 4, 5);
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArgumentsAsProto() {
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "use strict";
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var o = {__proto__:arguments};
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame([][Symbol.iterator], o[Symbol.iterator]);
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make o dict-mode.
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %OptimizeObjectForAddingMultipleProperties(o, 0);
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(o.hasOwnProperty(Symbol.iterator));
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame([][Symbol.iterator], o[Symbol.iterator]);
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  o[Symbol.iterator] = 10;
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(o.hasOwnProperty(Symbol.iterator));
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(10, o[Symbol.iterator]);
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame([][Symbol.iterator], arguments[Symbol.iterator]);
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Frozen o.
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  o = Object.freeze({__proto__:arguments});
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame([][Symbol.iterator], o[Symbol.iterator]);
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(o.hasOwnProperty(Symbol.iterator));
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame([][Symbol.iterator], o[Symbol.iterator]);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This should throw, but currently it doesn't, because
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // ExecutableAccessorInfo callbacks don't see the current strict mode.
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // See note in accessors.cc:SetPropertyOnInstanceIfInherited.
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  o[Symbol.iterator] = 10;
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(o.hasOwnProperty(Symbol.iterator));
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals([][Symbol.iterator], o[Symbol.iterator]);
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame([][Symbol.iterator], arguments[Symbol.iterator]);
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArgumentsAsProto();
231