| // 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 Reflect.construct with wrong number of arguments. |
| (function() { |
| "use strict"; |
| function A() {} |
| function foo() { return Reflect.construct(A); } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertThrows(foo); |
| assertThrows(foo); |
| %OptimizeFunctionOnNextCall(foo); |
| assertThrows(foo); |
| })(); |
| (function() { |
| "use strict"; |
| function A(x) { this.x = x; } |
| function foo() { return Reflect.construct(A, arguments); } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo(1).x); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo(1).x); |
| })(); |
| (function() { |
| "use strict"; |
| function A(x) { this.x = x; } |
| function foo() { return Reflect.construct(A, arguments, A, A); } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo(1).x); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo(1).x); |
| })(); |
| |
| // Test Reflect.construct within try/catch. |
| (function() { |
| "use strict"; |
| function foo(bar) { |
| try { |
| return Reflect.construct(bar, arguments, bar); |
| } catch (e) { |
| return 1; |
| } |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertEquals(1, foo()); |
| assertEquals(1, foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertEquals(1, foo()); |
| })(); |
| (function() { |
| "use strict"; |
| function foo(bar) { |
| try { |
| return Reflect.construct(bar, bar, bar); |
| } catch (e) { |
| return 1; |
| } |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertEquals(1, foo()); |
| assertEquals(1, foo()); |
| %OptimizeFunctionOnNextCall(foo); |
| assertEquals(1, foo()); |
| })(); |
| |
| // Test proper order of constructor check(s) and array-like iteration. |
| (function() { |
| var dummy_length_counter = 0; |
| var dummy = { get length() { ++dummy_length_counter; return 0; } }; |
| |
| function foo() { |
| return Reflect.construct(undefined, dummy, undefined); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertThrows(foo, TypeError); |
| assertThrows(foo, TypeError); |
| %OptimizeFunctionOnNextCall(foo); |
| assertThrows(foo, TypeError); |
| assertEquals(0, dummy_length_counter); |
| })(); |
| (function() { |
| var dummy_length_counter = 0; |
| var dummy = { get length() { ++dummy_length_counter; return 0; } }; |
| |
| function foo() { |
| return Reflect.construct(undefined, dummy); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertThrows(foo, TypeError); |
| assertThrows(foo, TypeError); |
| %OptimizeFunctionOnNextCall(foo); |
| assertThrows(foo, TypeError); |
| assertEquals(0, dummy_length_counter); |
| })(); |
| (function() { |
| var dummy_length_counter = 0; |
| var dummy = { get length() { ++dummy_length_counter; return 0; } }; |
| |
| function foo() { |
| return Reflect.construct(null, dummy, null); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertThrows(foo, TypeError); |
| assertThrows(foo, TypeError); |
| %OptimizeFunctionOnNextCall(foo); |
| assertThrows(foo, TypeError); |
| assertEquals(0, dummy_length_counter); |
| })();(function() { |
| var dummy_length_counter = 0; |
| var dummy = { get length() { ++dummy_length_counter; return 0; } }; |
| |
| function foo() { |
| return Reflect.construct(null, dummy); |
| } |
| |
| %PrepareFunctionForOptimization(foo); |
| assertThrows(foo, TypeError); |
| assertThrows(foo, TypeError); |
| %OptimizeFunctionOnNextCall(foo); |
| assertThrows(foo, TypeError); |
| assertEquals(0, dummy_length_counter); |
| })(); |