// Copyright 2016 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 TestDeoptInNamedSuperGetter() {
  class C { m() { return 23 } }
  class D extends C { f() { return super.boom() } }

  var should_deoptimize_caller = false;
  Object.defineProperty(C.prototype, "boom", { get: function() {
    if (should_deoptimize_caller) %DeoptimizeFunction(D.prototype.f);
    return this.m
  }})

  assertEquals(23, new D().f());
  assertEquals(23, new D().f());
  %OptimizeFunctionOnNextCall(D.prototype.f);
  assertEquals(23, new D().f());
  should_deoptimize_caller = true;
  assertEquals(23, new D().f());
})();

(function TestDeoptInKeyedSuperGetter() {
  class C { m() { return 23 } }
  class D extends C { f(name) { return super[name]() } }

  var should_deoptimize_caller = false;
  Object.defineProperty(C.prototype, "boom", { get: function() {
    if (should_deoptimize_caller) %DeoptimizeFunction(D.prototype.f);
    return this.m
  }})

  assertEquals(23, new D().f("boom"));
  assertEquals(23, new D().f("boom"));
  %OptimizeFunctionOnNextCall(D.prototype.f);
  assertEquals(23, new D().f("boom"));
  should_deoptimize_caller = true;
  assertEquals(23, new D().f("boom"));
})();
