// 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 --opt

/* Test deopt behaviors when the prototype has elements */

// includes

(function() {
  const iarr = [0,1,2];
  const darr = [0.0, 2.0, 3.3];

  function includes(arr, val) {
    return arr.includes(val);
  }

  %PrepareFunctionForOptimization(includes);
  assertTrue(includes(iarr, 0)); assertTrue(includes(darr, 0));
  assertTrue(includes(iarr, 2)); assertTrue(includes(darr, 2));

  // JSCallReducer for includes not reduce because it only works with single map
  %OptimizeFunctionOnNextCall(includes);

  assertTrue(includes(iarr, 0));
  assertTrue(includes(darr, 0));
})();

(function() {
  const iarr = [0,1,2];

  function includes(arr, val) {
    return arr.includes(val);
  }

  %PrepareFunctionForOptimization(includes);
  assertTrue(includes(iarr, 0));
  assertTrue(includes(iarr, 2));

  %OptimizeFunctionOnNextCall(includes);

  assertTrue(includes(iarr, 0));

  const darr = [0.0, 2.0, 3.3];
  // deopt because of map change
  assertTrue(includes(darr, 0));
})();

(function() {
  const iarr = [,3];

  function includes(arr, val) {
    return arr.includes(val);
  }

  iarr.__proto__ = [2];

  // get feedback
  %PrepareFunctionForOptimization(includes);
  assertFalse(includes(iarr, 0));
  assertTrue(includes(iarr, 2));

  %OptimizeFunctionOnNextCall(includes);

  assertFalse(includes(iarr, 0));

  assertTrue(includes(iarr, 2));
})();

(function() {
  const iarr = [,3];

  function includes(arr, val) {
    return arr.includes(val);
  }

  %PrepareFunctionForOptimization(includes);
  assertFalse(includes(iarr, 2));
  assertTrue(includes(iarr, 3));

  %OptimizeFunctionOnNextCall(includes);
  assertFalse(includes(iarr, 2));

  // deopt because of map change
  iarr.__proto__ = [2];
  assertTrue(includes(iarr, 2));
})();

// This pollutes the Array prototype, so we should not run more tests
// in the same environment after this.
(function () {
  var array = [,];

  function includes(val) {
    return array.includes(val);
  }

  %PrepareFunctionForOptimization(includes);
  includes(6); includes(6);

  %OptimizeFunctionOnNextCall(includes);
  assertFalse(includes(6));

  array.__proto__.push(6);
  // deopt because of no_elements_protector
  assertTrue(includes(6));
})();
