OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 | |
6 // Note in general that "arguments.foo" and "var o = arguments; o.foo" | |
7 // are treated differently by full-codegen, and so both cases need to be | |
8 // tested. | |
9 | |
10 function TestDirectArgumentsIteratorProperty() { | |
11 assertTrue(arguments.hasOwnProperty(Symbol.iterator)); | |
arv (Not doing code reviews)
2014/08/12 16:31:53
Can you change this to?
var descr = Object.getOwn
| |
12 assertFalse(arguments.propertyIsEnumerable(Symbol.iterator)); | |
13 assertEquals(arguments[Symbol.iterator], [].values); | |
14 } | |
15 TestDirectArgumentsIteratorProperty(); | |
16 | |
17 | |
18 function TestIndirectArgumentsIteratorProperty() { | |
19 var o = arguments; | |
20 assertTrue(o.hasOwnProperty(Symbol.iterator)); | |
21 assertFalse(o.propertyIsEnumerable(Symbol.iterator)); | |
22 assertEquals(o[Symbol.iterator], [].values); | |
23 } | |
24 TestIndirectArgumentsIteratorProperty(); | |
25 | |
26 | |
27 function assertIteratorResult(value, done, result) { | |
28 assertEquals({value: value, done: done}, result); | |
29 } | |
30 | |
31 | |
32 function TestDirectValues1(a, b, c) { | |
33 var iterator = arguments[Symbol.iterator](); | |
34 assertIteratorResult(a, false, iterator.next()); | |
35 assertIteratorResult(b, false, iterator.next()); | |
36 assertIteratorResult(c, false, iterator.next()); | |
37 assertIteratorResult(undefined, true, iterator.next()); | |
38 } | |
39 TestDirectValues1(1, 2, 3); | |
40 | |
41 | |
42 function TestIndirectValues1(a, b, c) { | |
43 var args = arguments; | |
44 var iterator = args[Symbol.iterator](); | |
45 assertIteratorResult(a, false, iterator.next()); | |
46 assertIteratorResult(b, false, iterator.next()); | |
47 assertIteratorResult(c, false, iterator.next()); | |
48 assertIteratorResult(undefined, true, iterator.next()); | |
49 } | |
50 TestIndirectValues1(1, 2, 3); | |
51 | |
52 | |
53 function TestDirectValues2(a, b, c) { | |
54 var iterator = arguments[Symbol.iterator](); | |
55 assertIteratorResult(a, false, iterator.next()); | |
56 assertIteratorResult(b, false, iterator.next()); | |
57 assertIteratorResult(c, false, iterator.next()); | |
58 assertIteratorResult(undefined, true, iterator.next()); | |
59 | |
60 arguments[3] = 4; | |
61 arguments.length = 4; | |
62 assertIteratorResult(undefined, true, iterator.next()); | |
63 } | |
64 TestDirectValues2(1, 2, 3); | |
65 | |
66 | |
67 function TestIndirectValues2(a, b, c) { | |
68 var args = arguments; | |
69 var iterator = args[Symbol.iterator](); | |
70 assertIteratorResult(a, false, iterator.next()); | |
71 assertIteratorResult(b, false, iterator.next()); | |
72 assertIteratorResult(c, false, iterator.next()); | |
73 assertIteratorResult(undefined, true, iterator.next()); | |
74 | |
75 arguments[3] = 4; | |
76 arguments.length = 4; | |
77 assertIteratorResult(undefined, true, iterator.next()); | |
78 } | |
79 TestIndirectValues2(1, 2, 3); | |
80 | |
81 | |
82 function TestDirectValues3(a, b, c) { | |
83 var iterator = arguments[Symbol.iterator](); | |
84 assertIteratorResult(a, false, iterator.next()); | |
85 assertIteratorResult(b, false, iterator.next()); | |
86 | |
87 arguments.length = 2; | |
88 assertIteratorResult(undefined, true, iterator.next()); | |
89 } | |
90 TestDirectValues3(1, 2, 3); | |
91 | |
92 | |
93 function TestIndirectValues3(a, b, c) { | |
94 var args = arguments; | |
95 var iterator = args[Symbol.iterator](); | |
96 assertIteratorResult(a, false, iterator.next()); | |
97 assertIteratorResult(b, false, iterator.next()); | |
98 | |
99 arguments.length = 2; | |
100 assertIteratorResult(undefined, true, iterator.next()); | |
101 } | |
102 TestIndirectValues3(1, 2, 3); | |
103 | |
104 | |
105 function TestDirectValues4(a, b, c) { | |
106 var iterator = arguments[Symbol.iterator](); | |
107 assertIteratorResult(a, false, iterator.next()); | |
108 assertIteratorResult(b, false, iterator.next()); | |
109 assertIteratorResult(c, false, iterator.next()); | |
110 | |
111 arguments.length = 4; | |
112 assertIteratorResult(undefined, false, iterator.next()); | |
113 assertIteratorResult(undefined, true, iterator.next()); | |
114 } | |
115 TestDirectValues4(1, 2, 3); | |
116 | |
117 | |
118 function TestIndirectValues4(a, b, c) { | |
119 var args = arguments; | |
120 var iterator = args[Symbol.iterator](); | |
121 assertIteratorResult(a, false, iterator.next()); | |
122 assertIteratorResult(b, false, iterator.next()); | |
123 assertIteratorResult(c, false, iterator.next()); | |
124 | |
125 arguments.length = 4; | |
126 assertIteratorResult(undefined, false, iterator.next()); | |
127 assertIteratorResult(undefined, true, iterator.next()); | |
128 } | |
129 TestIndirectValues4(1, 2, 3); | |
130 | |
131 | |
132 function TestForOf() { | |
133 var i = 0; | |
134 for (var value of arguments) { | |
135 assertEquals(arguments[i++], value); | |
136 } | |
137 | |
138 assertEquals(arguments.length, i); | |
139 } | |
140 TestForOf(1, 2, 3, 4, 5); | |
141 | |
142 | |
143 function TestAssignmentToIterator() { | |
144 var i = 0; | |
145 arguments[Symbol.iterator] = [].entries; | |
146 for (var entry of arguments) { | |
147 assertEquals([i, arguments[i]], entry); | |
148 i++; | |
149 } | |
150 | |
151 assertEquals(arguments.length, i); | |
152 } | |
153 TestAssignmentToIterator(1, 2, 3, 4, 5); | |
154 | |
155 | |
156 function TestArgumentsMutation() { | |
157 var i = 0; | |
158 for (var x of arguments) { | |
159 assertEquals(arguments[i], x); | |
160 arguments[i+1] *= 2; | |
161 i++; | |
162 } | |
163 | |
164 assertEquals(arguments.length, i); | |
165 } | |
166 TestArgumentsMutation(1, 2, 3, 4, 5); | |
167 | |
168 | |
169 function TestSloppyArgumentsAliasing(a0, a1, a2, a3, a4) { | |
170 var i = 0; | |
171 for (var x of arguments) { | |
172 assertEquals(arguments[i], x); | |
173 a0 = a1; a1 = a2; a3 = a4; | |
174 i++; | |
175 } | |
176 | |
177 assertEquals(arguments.length, i); | |
178 } | |
179 TestSloppyArgumentsAliasing(1, 2, 3, 4, 5); | |
180 | |
181 | |
182 function TestStrictArgumentsAliasing(a0, a1, a2, a3, a4) { | |
183 "use strict"; | |
184 var i = 0; | |
185 for (var x of arguments) { | |
186 a0 = a1; a1 = a2; a3 = a4; | |
187 assertEquals(arguments[i], x); | |
188 i++; | |
189 } | |
190 | |
191 assertEquals(arguments.length, i); | |
192 } | |
193 TestStrictArgumentsAliasing(1, 2, 3, 4, 5); | |
OLD | NEW |