text: // 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
  
  var m = new Map();
  
  function C() { }
  
  // Make sure slack tracking kicks in and shrinks the default size to prevent
  // any further in-object properties.
  %CompleteInobjectSlackTracking(new C());
  
  function f(o) {
    o.x = true;
  }
  
  // Warm up {f}.
  f(new C());
  f(new C());
  
  
  var o = new C();
  %HeapObjectVerify(o);
  
  // We need at least 2 elements in the Map.
  m.set({}, 3);
  // This creates hash code on o.
  m.set(o, 1);
  
  // Add an out-of-object property.
  o.x = true;
  %HeapObjectVerify(o);
  // Delete the property (so we have no out-of-object properties).
  delete o.x;
  %HeapObjectVerify(o);
  
  
  // Ensure that growing the properties backing store in optimized code preserves
  // the hash.
  %OptimizeFunctionOnNextCall(f);
  f(o);
  
  %HeapObjectVerify(o);
  assertEquals(1, m.get(o));
  
  // Grow the Map and ensure the object is still found.
  for (let i = 0; i < 1000; i++) {
    let object = {};
    m.set(object, object);
    assertEquals(1, m.get(o));
  }
  