| // Copyright 2016 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 |
| |
| function enumerate(o) { |
| var keys = []; |
| for (var key in o) keys.push(key); |
| return keys; |
| } |
| |
| (function testSlowSloppyArgumentsElements() { |
| function slowSloppyArguments(a, b, c) { |
| %HeapObjectVerify(arguments); |
| arguments[10000] = "last"; |
| arguments[4000] = "first"; |
| arguments[6000] = "second"; |
| arguments[5999] = "x"; |
| arguments[3999] = "y"; |
| %HeapObjectVerify(arguments); |
| return arguments; |
| } |
| assertEquals(["0", "1", "2", "3999", "4000", "5999", "6000", "10000"], |
| Object.keys(slowSloppyArguments(1, 2, 3))); |
| |
| assertEquals(["0", "1", "2", "3999", "4000", "5999", "6000", "10000"], |
| enumerate(slowSloppyArguments(1,2,3))); |
| })(); |
| |
| (function testSlowSloppyArgumentsElementsNotEnumerable() { |
| function slowSloppyArguments(a, b, c) { |
| Object.defineProperty(arguments, 10000, { |
| enumerable: false, configurable: false, value: "NOPE" |
| }); |
| %HeapObjectVerify(arguments); |
| arguments[4000] = "first"; |
| arguments[6000] = "second"; |
| arguments[5999] = "x"; |
| arguments[3999] = "y"; |
| %HeapObjectVerify(arguments); |
| return arguments; |
| } |
| |
| assertEquals(["0", "1", "2", "3999", "4000", "5999", "6000"], |
| Object.keys(slowSloppyArguments(1, 2, 3))); |
| |
| assertEquals(["0", "1", "2", "3999", "4000", "5999", "6000"], |
| enumerate(slowSloppyArguments(1,2,3))); |
| })(); |
| |
| |
| (function testFastSloppyArgumentsElements() { |
| function fastSloppyArguments(a, b, c) { |
| arguments[5] = 1; |
| arguments[7] = 0; |
| arguments[3] = 2; |
| %HeapObjectVerify(arguments); |
| return arguments; |
| } |
| assertEquals(["0", "1", "2", "3", "5", "7"], |
| Object.keys(fastSloppyArguments(1, 2, 3))); |
| |
| assertEquals( |
| ["0", "1", "2", "3", "5", "7"], enumerate(fastSloppyArguments(1, 2, 3))); |
| |
| function fastSloppyArguments2(a, b, c) { |
| delete arguments[0]; |
| %DebugPrint(arguments); |
| %HeapObjectVerify(arguments); |
| arguments[0] = "test"; |
| %DebugPrint(arguments); |
| %HeapObjectVerify(arguments); |
| return arguments; |
| } |
| |
| assertEquals(["0", "1", "2"], Object.keys(fastSloppyArguments2(1, 2, 3))); |
| assertEquals(["0", "1", "2"], enumerate(fastSloppyArguments2(1, 2, 3))); |
| })(); |
| |
| (function testFastSloppyArgumentsElementsNotEnumerable() { |
| function fastSloppyArguments(a, b, c) { |
| Object.defineProperty(arguments, 5, { |
| enumerable: false, configurable: false, value: "NOPE" |
| }); |
| %HeapObjectVerify(arguments); |
| arguments[7] = 0; |
| arguments[3] = 2; |
| %HeapObjectVerify(arguments); |
| return arguments; |
| } |
| assertEquals( |
| ["0", "1", "2", "3", "7"], Object.keys(fastSloppyArguments(1, 2, 3))); |
| |
| assertEquals( |
| ["0", "1", "2", "3", "7"], enumerate(fastSloppyArguments(1,2,3))); |
| |
| function fastSloppyArguments2(a, b, c) { |
| delete arguments[0]; |
| %HeapObjectVerify(arguments); |
| Object.defineProperty(arguments, 1, { |
| enumerable: false, configurable: false, value: "NOPE" |
| }); |
| arguments[0] = "test"; |
| %HeapObjectVerify(arguments); |
| return arguments; |
| } |
| |
| assertEquals(["0", "2"], Object.keys(fastSloppyArguments2(1, 2, 3))); |
| assertEquals(["0", "2"], enumerate(fastSloppyArguments2(1, 2, 3))); |
| })(); |