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

// indexOf

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

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

  %PrepareFunctionForOptimization(indexOf);
  assertEquals(0, indexOf(iarr, 0));
  assertEquals(0, indexOf(darr, 0));
  assertEquals(2, indexOf(iarr, 2));
  assertEquals(1, indexOf(darr, 2));

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

  assertEquals(0, indexOf(iarr, 0));
  assertEquals(0, indexOf(darr, 0));
})();

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

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

  %PrepareFunctionForOptimization(indexOf);
  assertEquals(0, indexOf(iarr, 0));
  assertEquals(2, indexOf(iarr, 2));

  %OptimizeFunctionOnNextCall(indexOf);

  assertEquals(0, indexOf(iarr, 0));

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

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

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

  %PrepareFunctionForOptimization(indexOf);
  iarr.__proto__ = [2];
  assertEquals(-1, indexOf(iarr, 0));
  assertEquals(0, indexOf(iarr, 2));

  %OptimizeFunctionOnNextCall(indexOf);

  assertEquals(-1, indexOf(iarr, 0));

  assertEquals(0, indexOf(iarr, 2));
})();

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

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

  %PrepareFunctionForOptimization(indexOf);
  assertEquals(-1, indexOf(iarr, 2));
  assertEquals(1, indexOf(iarr, 3));

  %OptimizeFunctionOnNextCall(indexOf);
  assertEquals(-1, indexOf(iarr, 2));

  // deopt because of map change
  iarr.__proto__ = [2];
  assertEquals(0, indexOf(iarr, 2));
})();

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

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

  %PrepareFunctionForOptimization(indexOf);
  indexOf(6); indexOf(6);

  %OptimizeFunctionOnNextCall(indexOf);
  assertEquals(indexOf(6), -1);

  array.__proto__.push(6);
  // deopt because of no_elements_protector
  assertEquals(indexOf(6), 0);
})();
