| // Copyright 2017 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 | |
| // Test Array call with known Boolean. | |
| (() => { | |
| function foo(x) { return Array(!!x); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([true], foo(true)); | |
| assertEquals([false], foo(false)); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([true], foo(true)); | |
| assertEquals([false], foo(false)); | |
| })(); | |
| // Test Array construct with known Boolean. | |
| (() => { | |
| function foo(x) { return new Array(!!x); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([true], foo(true)); | |
| assertEquals([false], foo(false)); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([true], foo(true)); | |
| assertEquals([false], foo(false)); | |
| })(); | |
| // Test Array call with known String. | |
| (() => { | |
| function foo(x) { return Array("" + x); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals(["a"], foo("a")); | |
| assertEquals(["b"], foo("b")); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals(["a"], foo("a")); | |
| assertEquals(["b"], foo("b")); | |
| })(); | |
| // Test Array construct with known String. | |
| (() => { | |
| function foo(x) { return new Array("" + x); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals(["a"], foo("a")); | |
| assertEquals(["b"], foo("b")); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals(["a"], foo("a")); | |
| assertEquals(["b"], foo("b")); | |
| })(); | |
| // Test Array call with known fixed small integer. | |
| (() => { | |
| function foo() { return Array(2); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals(2, foo().length); | |
| assertEquals(2, foo().length); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals(2, foo().length); | |
| })(); | |
| // Test Array construct with known fixed small integer. | |
| (() => { | |
| function foo() { return new Array(2); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals(2, foo().length); | |
| assertEquals(2, foo().length); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals(2, foo().length); | |
| })(); | |
| // Test Array call with multiple parameters. | |
| (() => { | |
| function foo(x, y, z) { return Array(x, y, z); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([1, 2, 3], foo(1, 2, 3)); | |
| assertEquals([1, 2, 3], foo(1, 2, 3)); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([1, 2, 3], foo(1, 2, 3)); | |
| })(); | |
| // Test Array construct with multiple parameters. | |
| (() => { | |
| function foo(x, y, z) { return new Array(x, y, z); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([1, 2, 3], foo(1, 2, 3)); | |
| assertEquals([1, 2, 3], foo(1, 2, 3)); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([1, 2, 3], foo(1, 2, 3)); | |
| })(); | |
| // Test Array construct inside try-catch block. | |
| (() => { | |
| function foo(x) { try { return new Array(x) } catch (e) { return e } } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([], foo(0)); | |
| assertEquals([], foo(0)); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([], foo(0)); | |
| assertInstanceof(foo(-1), RangeError); | |
| })(); | |
| // Packed | |
| // Test non-extensible Array call with multiple parameters. | |
| (() => { | |
| function foo(x, y, z, t) { return Object.preventExtensions(new Array(x, y, z, t)); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertFalse(Object.isExtensible(foo(1,2,3, 'a'))); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertFalse(Object.isExtensible(foo(1,2,3, 'a'))); | |
| })(); | |
| // Test sealed Array call with multiple parameters. | |
| (() => { | |
| function foo(x, y, z, t) { return Object.seal(new Array(x, y, z, t)); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertTrue(Object.isSealed(foo(1,2,3, 'a'))); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertTrue(Object.isSealed(foo(1,2,3, 'a'))); | |
| })(); | |
| // Test frozen Array call with multiple parameters. | |
| (() => { | |
| function foo(x, y, z, t) { return Object.freeze(new Array(x, y, z, t)); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertTrue(Object.isFrozen(foo(1,2,3, 'a'))); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertTrue(Object.isFrozen(foo(1,2,3, 'a'))); | |
| })(); | |
| // Holey | |
| // Test non-extensible Array call with multiple parameters. | |
| (() => { | |
| function foo(x, y, z, t) { return Object.preventExtensions([, x, y, z, t]); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertFalse(Object.isExtensible(foo(1,2,3, 'a'))); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertFalse(Object.isExtensible(foo(1,2,3, 'a'))); | |
| })(); | |
| // Test sealed Array call with multiple parameters. | |
| (() => { | |
| function foo(x, y, z, t) { return Object.seal([, x, y, z, t]); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertTrue(Object.isSealed(foo(1,2,3, 'a'))); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertTrue(Object.isSealed(foo(1,2,3, 'a'))); | |
| })(); | |
| // Test frozen Array call with multiple parameters. | |
| (() => { | |
| function foo(x, y, z, t) { return Object.freeze([, x, y, z, t]); } | |
| %PrepareFunctionForOptimization(foo); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertTrue(Object.isFrozen(foo(1,2,3, 'a'))); | |
| %OptimizeFunctionOnNextCall(foo); | |
| assertEquals([, 1, 2, 3, 'a'], foo(1, 2, 3, 'a')); | |
| assertTrue(Object.isFrozen(foo(1,2,3, 'a'))); | |
| })(); |