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