// 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 modifyArrayIterator() {
  'use strict';

  class Point {
    constructor(x, y) {
      this.x = x;
      this.y = y;
    }
  }

  class RestPoint extends Point {
    constructor(...args) {
      super(...args);
    }
  }

  function testRestPoint(x, y) {
    return new RestPoint(x, y);
  }
  testRestPoint(1, 2);
  testRestPoint(1, 2);
  %OptimizeFunctionOnNextCall(testRestPoint);
  var r = testRestPoint(1, 2);

  assertInstanceof(r, RestPoint);
  assertInstanceof(r, Point);
  assertEquals(1, r.x);
  assertEquals(2, r.y);

  Object.defineProperty(Array.prototype, Symbol.iterator, {
    value: function*
        () {
          yield 3;
          yield 4;
        },
    configurable: true
  });

  var r2 = testRestPoint(1, 2);

  assertInstanceof(r2, RestPoint);
  assertInstanceof(r2, Point);
  assertEquals(3, r2.x);
  assertEquals(4, r2.y);
})();
