| // Copyright 2018 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 JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be an Array literal. |
| (function() { |
| function foo() { |
| return Array.isArray([]); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo()); |
| assertTrue(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo()); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be a Proxy for an Array literal. |
| (function() { |
| function foo() { |
| return Array.isArray(new Proxy([], {})); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo()); |
| assertTrue(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo()); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be an Object literal. |
| (function() { |
| function foo() { |
| return Array.isArray({}); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo()); |
| assertFalse(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo()); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be a Proxy for an Object literal. |
| (function() { |
| function foo() { |
| return Array.isArray(new Proxy({}, {})); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo()); |
| assertFalse(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo()); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that |
| // TurboFan doesn't know anything about the input value. |
| (function() { |
| function foo(x) { |
| return Array.isArray(x); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertFalse(foo({})); |
| assertFalse(foo(new Proxy({}, {}))); |
| assertTrue(foo([])); |
| assertTrue(foo(new Proxy([], {}))); |
| assertThrows(() => { |
| const {proxy, revoke} = Proxy.revocable([], {}); |
| revoke(); |
| foo(proxy); |
| }, TypeError); |
| %OptimizeFunctionOnNextCall(foo); |
| assertFalse(foo({})); |
| assertFalse(foo(new Proxy({}, {}))); |
| assertTrue(foo([])); |
| assertTrue(foo(new Proxy([], {}))); |
| assertThrows(() => { |
| const {proxy, revoke} = Proxy.revocable([], {}); |
| revoke(); |
| foo(proxy); |
| }, TypeError); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that |
| // we pass a revoked proxy and catch the exception locally. |
| (function() { |
| function foo(x) { |
| const {proxy, revoke} = Proxy.revocable(x, {}); |
| revoke(); |
| try { |
| return Array.isArray(proxy); |
| } catch (e) { |
| return e; |
| } |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo([]), TypeError); |
| assertInstanceof(foo({}), TypeError); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo([]), TypeError); |
| assertInstanceof(foo({}), TypeError); |
| })(); |
| |
| // Packed |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be a non-extensible Array literal. |
| (function() { |
| function foo() { |
| return Array.isArray(Object.preventExtensions([])); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo()); |
| assertTrue(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo()); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be a sealed Array literal. |
| (function() { |
| function foo() { |
| return Array.isArray(Object.seal([])); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo()); |
| assertTrue(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo()); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be a frozen Array literal. |
| (function() { |
| function foo() { |
| return Array.isArray(Object.freeze([])); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo()); |
| assertTrue(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo()); |
| })(); |
| |
| // Holey |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be a non-extensible Array literal. |
| (function() { |
| function foo() { |
| return Array.isArray(Object.preventExtensions([,])); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo()); |
| assertTrue(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo()); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be a sealed Array literal. |
| (function() { |
| function foo() { |
| return Array.isArray(Object.seal([,])); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo()); |
| assertTrue(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo()); |
| })(); |
| |
| // Test JSObjectIsArray in JSTypedLowering for the case that the |
| // input value is known to be a frozen Array literal. |
| (function() { |
| function foo() { |
| return Array.isArray(Object.freeze([,])); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertTrue(foo()); |
| assertTrue(foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertTrue(foo()); |
| })(); |