| // 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 |
| |
| (function() { |
| 'use strict'; |
| |
| class Point { |
| constructor(x, y) { |
| this.x = x; |
| this.y = y; |
| } |
| } |
| |
| function testBaselineAndOpt(func) { |
| %PrepareFunctionForOptimization(func); |
| func(1, 2); |
| func(1, 2); |
| %OptimizeFunctionOnNextCall(func); |
| return func(1, 2); |
| } |
| |
| class RestPoint extends Point { |
| constructor(...args) { |
| super(...args); |
| } |
| } |
| var r = testBaselineAndOpt(function(x, y) { |
| return new RestPoint(x, y); |
| }); |
| assertInstanceof(r, RestPoint); |
| assertInstanceof(r, Point); |
| assertEquals(r.x, 1); |
| assertEquals(r.y, 2); |
| |
| class RestExtraPoint extends Point { |
| constructor(...args) { |
| super(-1, 0, ...args); |
| } |
| } |
| r = testBaselineAndOpt(function(x, y) { |
| return new RestExtraPoint(x, y); |
| }); |
| assertInstanceof(r, RestExtraPoint); |
| assertInstanceof(r, Point); |
| assertEquals(r.x, -1); |
| assertEquals(r.y, 0); |
| |
| class ArgumentsPoint extends Point { |
| constructor() { |
| super(...arguments); |
| } |
| } |
| r = testBaselineAndOpt(function(x, y) { |
| return new ArgumentsPoint(x, y); |
| }); |
| assertInstanceof(r, ArgumentsPoint); |
| assertInstanceof(r, Point); |
| assertEquals(r.x, 1); |
| assertEquals(r.y, 2); |
| |
| class ArgumentsExtraPoint extends Point { |
| constructor() { |
| super(1, 2, ...arguments); |
| } |
| } |
| r = testBaselineAndOpt(function(x, y) { |
| return new ArgumentsExtraPoint(x, y); |
| }); |
| assertInstanceof(r, ArgumentsExtraPoint); |
| assertInstanceof(r, Point); |
| assertEquals(r.x, 1); |
| assertEquals(r.y, 2); |
| |
| class LiteralPoint extends Point { |
| constructor() { |
| super(...[3, 4]); |
| } |
| } |
| r = testBaselineAndOpt(function(x, y) { |
| return new LiteralPoint(x, y); |
| }); |
| assertInstanceof(r, LiteralPoint); |
| assertInstanceof(r, Point); |
| assertEquals(r.x, 3); |
| assertEquals(r.y, 4); |
| })(); |