| // 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 subclass default constructor with no parameters. |
| (function() { |
| const A = class A extends Array { }; |
| |
| function foo() { return new A; } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(0, foo().length); |
| assertInstanceof(foo(), A); |
| assertEquals(0, foo().length); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(0, foo().length); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass default constructor with small constant length. |
| (function() { |
| const A = class A extends Array { }; |
| const L = 4; |
| |
| function foo() { return new A(L); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass default constructor with large constant length. |
| (function() { |
| const A = class A extends Array { }; |
| const L = 1024 * 1024; |
| |
| function foo() { return new A(L); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass default constructor with known boolean. |
| (function() { |
| const A = class A extends Array { }; |
| |
| function foo() { return new A(true); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals(true, foo()[0]); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals(true, foo()[0]); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals(true, foo()[0]); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass default constructor with known string. |
| (function() { |
| const A = class A extends Array { }; |
| |
| function foo() { return new A(""); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals("", foo()[0]); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals("", foo()[0]); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals("", foo()[0]); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass default constructor with known object. |
| (function() { |
| const A = class A extends Array { }; |
| const O = {foo: "foo"}; |
| |
| function foo() { return new A(O); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertSame(O, foo()[0]); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertSame(O, foo()[0]); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertSame(O, foo()[0]); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze);})(); |
| |
| // Test Array subclass default constructor with known small integers. |
| (function() { |
| const A = class A extends Array { }; |
| |
| function foo() { return new A(1, 2, 3); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(3, foo().length); |
| assertEquals(1, foo()[0]); |
| assertEquals(2, foo()[1]); |
| assertEquals(3, foo()[2]); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(3, foo().length); |
| assertEquals(1, foo()[0]); |
| assertEquals(2, foo()[1]); |
| assertEquals(3, foo()[2]); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass default constructor with known numbers. |
| (function() { |
| const A = class A extends Array { }; |
| |
| function foo() { return new A(1.1, 2.2, 3.3); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(3, foo().length); |
| assertEquals(1.1, foo()[0]); |
| assertEquals(2.2, foo()[1]); |
| assertEquals(3.3, foo()[2]); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(3, foo().length); |
| assertEquals(1.1, foo()[0]); |
| assertEquals(2.2, foo()[1]); |
| assertEquals(3.3, foo()[2]); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass default constructor with known strings. |
| (function() { |
| const A = class A extends Array { }; |
| |
| function foo() { return new A("a", "b", "c", "d"); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(4, foo().length); |
| assertEquals("a", foo()[0]); |
| assertEquals("b", foo()[1]); |
| assertEquals("c", foo()[2]); |
| assertEquals("d", foo()[3]); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(4, foo().length); |
| assertEquals("a", foo()[0]); |
| assertEquals("b", foo()[1]); |
| assertEquals("c", foo()[2]); |
| assertEquals("d", foo()[3]); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass constructor with no parameters. |
| (function() { |
| const A = class A extends Array { |
| constructor() { |
| super(); |
| this.bar = 1; |
| } |
| }; |
| |
| function foo() { return new A; } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(0, foo().length); |
| assertEquals(1, foo().bar); |
| assertInstanceof(foo(), A); |
| assertEquals(0, foo().length); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(0, foo().length); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze);})(); |
| |
| // Test Array subclass constructor with small constant length. |
| (function() { |
| const A = class A extends Array { |
| constructor(n) { |
| super(n); |
| this.bar = 1; |
| } |
| }; |
| const L = 4; |
| |
| function foo() { return new A(L); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| assertEquals(1, foo().bar); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass constructor with large constant length. |
| (function() { |
| const A = class A extends Array { |
| constructor(n) { |
| super(n); |
| this.bar = 1; |
| } |
| }; |
| const L = 1024 * 1024; |
| |
| function foo() { return new A(L); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| assertEquals(1, foo().bar); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(L, foo().length); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass constructor with known boolean. |
| (function() { |
| const A = class A extends Array { |
| constructor(n) { |
| super(n); |
| this.bar = 1; |
| } |
| }; |
| |
| function foo() { return new A(true); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals(true, foo()[0]); |
| assertEquals(1, foo().bar); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals(true, foo()[0]); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals(true, foo()[0]); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass constructor with known string. |
| (function() { |
| const A = class A extends Array { |
| constructor(n) { |
| super(n); |
| this.bar = 1; |
| } |
| }; |
| |
| function foo() { return new A(""); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals("", foo()[0]); |
| assertEquals(1, foo().bar); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals("", foo()[0]); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertEquals("", foo()[0]); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass constructor with known object. |
| (function() { |
| const A = class A extends Array { |
| constructor(n) { |
| super(n); |
| this.bar = 1; |
| } |
| }; |
| const O = {foo: "foo"}; |
| |
| function foo() { return new A(O); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertSame(O, foo()[0]); |
| assertEquals(1, foo().bar); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertSame(O, foo()[0]); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(1, foo().length); |
| assertSame(O, foo()[0]); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass constructor with known small integers. |
| (function() { |
| const A = class A extends Array { |
| constructor(x, y, z) { |
| super(x, y, z); |
| this.bar = 1; |
| } |
| }; |
| |
| function foo() { return new A(1, 2, 3); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(3, foo().length); |
| assertEquals(1, foo()[0]); |
| assertEquals(2, foo()[1]); |
| assertEquals(3, foo()[2]); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(3, foo().length); |
| assertEquals(1, foo()[0]); |
| assertEquals(2, foo()[1]); |
| assertEquals(3, foo()[2]); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass constructor with known numbers. |
| (function() { |
| const A = class A extends Array { |
| constructor(x, y, z) { |
| super(x, y, z); |
| this.bar = 1; |
| } |
| }; |
| |
| function foo() { return new A(1.1, 2.2, 3.3); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(3, foo().length); |
| assertEquals(1.1, foo()[0]); |
| assertEquals(2.2, foo()[1]); |
| assertEquals(3.3, foo()[2]); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(3, foo().length); |
| assertEquals(1.1, foo()[0]); |
| assertEquals(2.2, foo()[1]); |
| assertEquals(3.3, foo()[2]); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |
| |
| // Test Array subclass constructor with known strings. |
| (function() { |
| const A = class A extends Array { |
| constructor(a, b, c, d) { |
| super(a, b, c, d); |
| this.bar = 1; |
| } |
| }; |
| |
| function foo() { return new A("a", "b", "c", "d"); } |
| |
| function test(foo) { |
| %PrepareFunctionForOptimization(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(4, foo().length); |
| assertEquals("a", foo()[0]); |
| assertEquals("b", foo()[1]); |
| assertEquals("c", foo()[2]); |
| assertEquals("d", foo()[3]); |
| assertEquals(1, foo().bar); |
| %OptimizeFunctionOnNextCall(foo); |
| assertInstanceof(foo(), A); |
| assertEquals(4, foo().length); |
| assertEquals("a", foo()[0]); |
| assertEquals("b", foo()[1]); |
| assertEquals("c", foo()[2]); |
| assertEquals("d", foo()[3]); |
| assertEquals(1, foo().bar); |
| } |
| test(foo); |
| |
| // Non-extensible |
| function fooPreventExtensions() { return Object.preventExtensions(foo()); } |
| test(fooPreventExtensions); |
| |
| // Sealed |
| function fooSeal() { return Object.seal(foo()); } |
| test(fooSeal); |
| |
| // Frozen |
| function fooFreeze() { return Object.freeze(foo()); } |
| test(fooFreeze); |
| })(); |