| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Flags: --allow-natives-syntax | 5 // Flags: --allow-natives-syntax |
| 6 | 6 |
| 7 | 7 |
| 8 // Note in general that "arguments.foo" and "var o = arguments; o.foo" | 8 // Note in general that "arguments.foo" and "var o = arguments; o.foo" |
| 9 // are treated differently by full-codegen, and so both cases need to be | 9 // are treated differently by full-codegen, and so both cases need to be |
| 10 // tested. | 10 // tested. |
| 11 | 11 |
| 12 function TestDirectArgumentsIteratorProperty() { | 12 function TestDirectArgumentsIteratorProperty() { |
| 13 assertTrue(arguments.hasOwnProperty(Symbol.iterator)); | 13 assertTrue(arguments.hasOwnProperty(Symbol.iterator)); |
| 14 assertFalse(arguments.propertyIsEnumerable(Symbol.iterator)); | 14 assertFalse(arguments.propertyIsEnumerable(Symbol.iterator)); |
| 15 var descriptor = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator); | 15 var descriptor = Object.getOwnPropertyDescriptor(arguments, Symbol.iterator); |
| 16 assertTrue(descriptor.writable); | 16 assertTrue(descriptor.writable); |
| 17 assertFalse(descriptor.enumerable); | 17 assertFalse(descriptor.enumerable); |
| 18 assertTrue(descriptor.configurable); | 18 assertTrue(descriptor.configurable); |
| 19 assertEquals(descriptor.value, [].values); | 19 assertEquals(descriptor.value, [][Symbol.iterator]); |
| 20 assertEquals(arguments[Symbol.iterator], [].values); | 20 assertEquals(arguments[Symbol.iterator], [][Symbol.iterator]); |
| 21 } | 21 } |
| 22 TestDirectArgumentsIteratorProperty(); | 22 TestDirectArgumentsIteratorProperty(); |
| 23 | 23 |
| 24 | 24 |
| 25 function TestIndirectArgumentsIteratorProperty() { | 25 function TestIndirectArgumentsIteratorProperty() { |
| 26 var o = arguments; | 26 var o = arguments; |
| 27 assertTrue(o.hasOwnProperty(Symbol.iterator)); | 27 assertTrue(o.hasOwnProperty(Symbol.iterator)); |
| 28 assertFalse(o.propertyIsEnumerable(Symbol.iterator)); | 28 assertFalse(o.propertyIsEnumerable(Symbol.iterator)); |
| 29 assertEquals(o[Symbol.iterator], [].values); | 29 assertEquals(o[Symbol.iterator], [][Symbol.iterator]); |
| 30 } | 30 } |
| 31 TestIndirectArgumentsIteratorProperty(); | 31 TestIndirectArgumentsIteratorProperty(); |
| 32 | 32 |
| 33 | 33 |
| 34 function assertIteratorResult(value, done, result) { | 34 function assertIteratorResult(value, done, result) { |
| 35 assertEquals({value: value, done: done}, result); | 35 assertEquals({value: value, done: done}, result); |
| 36 } | 36 } |
| 37 | 37 |
| 38 | 38 |
| 39 function TestDirectValues1(a, b, c) { | 39 function TestDirectValues1(a, b, c) { |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 | 197 |
| 198 assertEquals(arguments.length, i); | 198 assertEquals(arguments.length, i); |
| 199 } | 199 } |
| 200 TestStrictArgumentsAliasing(1, 2, 3, 4, 5); | 200 TestStrictArgumentsAliasing(1, 2, 3, 4, 5); |
| 201 | 201 |
| 202 | 202 |
| 203 function TestArgumentsAsProto() { | 203 function TestArgumentsAsProto() { |
| 204 "use strict"; | 204 "use strict"; |
| 205 | 205 |
| 206 var o = {__proto__:arguments}; | 206 var o = {__proto__:arguments}; |
| 207 assertSame([].values, o[Symbol.iterator]); | 207 assertSame([][Symbol.iterator], o[Symbol.iterator]); |
| 208 // Make o dict-mode. | 208 // Make o dict-mode. |
| 209 %OptimizeObjectForAddingMultipleProperties(o, 0); | 209 %OptimizeObjectForAddingMultipleProperties(o, 0); |
| 210 assertFalse(o.hasOwnProperty(Symbol.iterator)); | 210 assertFalse(o.hasOwnProperty(Symbol.iterator)); |
| 211 assertSame([].values, o[Symbol.iterator]); | 211 assertSame([][Symbol.iterator], o[Symbol.iterator]); |
| 212 o[Symbol.iterator] = 10; | 212 o[Symbol.iterator] = 10; |
| 213 assertTrue(o.hasOwnProperty(Symbol.iterator)); | 213 assertTrue(o.hasOwnProperty(Symbol.iterator)); |
| 214 assertEquals(10, o[Symbol.iterator]); | 214 assertEquals(10, o[Symbol.iterator]); |
| 215 assertSame([].values, arguments[Symbol.iterator]); | 215 assertSame([][Symbol.iterator], arguments[Symbol.iterator]); |
| 216 | 216 |
| 217 // Frozen o. | 217 // Frozen o. |
| 218 o = Object.freeze({__proto__:arguments}); | 218 o = Object.freeze({__proto__:arguments}); |
| 219 assertSame([].values, o[Symbol.iterator]); | 219 assertSame([][Symbol.iterator], o[Symbol.iterator]); |
| 220 assertFalse(o.hasOwnProperty(Symbol.iterator)); | 220 assertFalse(o.hasOwnProperty(Symbol.iterator)); |
| 221 assertSame([].values, o[Symbol.iterator]); | 221 assertSame([][Symbol.iterator], o[Symbol.iterator]); |
| 222 // This should throw, but currently it doesn't, because | 222 // This should throw, but currently it doesn't, because |
| 223 // ExecutableAccessorInfo callbacks don't see the current strict mode. | 223 // ExecutableAccessorInfo callbacks don't see the current strict mode. |
| 224 // See note in accessors.cc:SetPropertyOnInstanceIfInherited. | 224 // See note in accessors.cc:SetPropertyOnInstanceIfInherited. |
| 225 o[Symbol.iterator] = 10; | 225 o[Symbol.iterator] = 10; |
| 226 assertFalse(o.hasOwnProperty(Symbol.iterator)); | 226 assertFalse(o.hasOwnProperty(Symbol.iterator)); |
| 227 assertEquals([].values, o[Symbol.iterator]); | 227 assertEquals([][Symbol.iterator], o[Symbol.iterator]); |
| 228 assertSame([].values, arguments[Symbol.iterator]); | 228 assertSame([][Symbol.iterator], arguments[Symbol.iterator]); |
| 229 } | 229 } |
| 230 TestArgumentsAsProto(); | 230 TestArgumentsAsProto(); |
| OLD | NEW |