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

function TestSetWithModifiedIterator(ctor) {
  const k1 = {};
  const k2 = {};
  const entries = [k1, k2];
  const arrayIteratorProto = Object.getPrototypeOf(entries[Symbol.iterator]());
  const originalNext = arrayIteratorProto.next;
  let callCount = 0;
  arrayIteratorProto.next = function() {
    callCount++;
    return originalNext.call(this);
  };

  const set = new ctor(entries);
  assertEquals(3, callCount); // +1 for iterator done

  if('size' in set) assertEquals(2, set.size);
  assertTrue(set.has(k1));
  assertTrue(set.has(k2));

  arrayIteratorProto.next = originalNext;
}
%PrepareFunctionForOptimization(TestSetWithModifiedIterator);
TestSetWithModifiedIterator(Set);
TestSetWithModifiedIterator(Set);
TestSetWithModifiedIterator(Set);
%OptimizeFunctionOnNextCall(TestSetWithModifiedIterator);
TestSetWithModifiedIterator(Set);
assertOptimized(TestSetWithModifiedIterator);
%DeoptimizeFunction(TestSetWithModifiedIterator);

%PrepareFunctionForOptimization(TestSetWithModifiedIterator);
TestSetWithModifiedIterator(WeakSet);
TestSetWithModifiedIterator(WeakSet);
TestSetWithModifiedIterator(WeakSet);
%OptimizeFunctionOnNextCall(TestSetWithModifiedIterator);
TestSetWithModifiedIterator(WeakSet);
assertOptimized(TestSetWithModifiedIterator);
%DeoptimizeFunction(TestSetWithModifiedIterator);


function TestMapWithModifiedIterator(ctor) {
  const k1 = {};
  const k2 = {};
  const entries = [[k1, 1], [k2, 2]];
  const arrayIteratorProto = Object.getPrototypeOf(entries[Symbol.iterator]());
  const originalNext = arrayIteratorProto.next;
  let callCount = 0;
  arrayIteratorProto.next = function() {
    callCount++;
    return originalNext.call(this);
  };

  const set = new ctor(entries);
  assertEquals(3, callCount); // +1 for iterator done

  if('size' in set) assertEquals(2, set.size);
  assertEquals(1, set.get(k1));
  assertEquals(2, set.get(k2));

  arrayIteratorProto.next = originalNext;
}
%PrepareFunctionForOptimization(TestMapWithModifiedIterator);
TestMapWithModifiedIterator(Map);
TestMapWithModifiedIterator(Map);
TestMapWithModifiedIterator(Map);
%OptimizeFunctionOnNextCall(TestMapWithModifiedIterator);
TestMapWithModifiedIterator(Map);
assertOptimized(TestMapWithModifiedIterator);
%DeoptimizeFunction(TestMapWithModifiedIterator);

%PrepareFunctionForOptimization(TestMapWithModifiedIterator);
TestMapWithModifiedIterator(WeakMap);
TestMapWithModifiedIterator(WeakMap);
TestMapWithModifiedIterator(WeakMap);
%OptimizeFunctionOnNextCall(TestMapWithModifiedIterator);
TestMapWithModifiedIterator(WeakMap);
assertOptimized(TestMapWithModifiedIterator);
%DeoptimizeFunction(TestMapWithModifiedIterator);
