| // 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'))); |
| })(); |