// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation

import "package:expect/expect.dart";

// Check correct deoptimization of instance field increment.


main() {
  var a = new A();
  var aa = new A();
  for (int i = 0; i < 20; i++) {
    a.Incr();
    myIncr(aa);
    conditionalIncr(false, a);
  }
  Expect.equals(20, a.f);
  Expect.equals(20, aa.f);
  a.f = 1.0;
  // Deoptimize ++ part of instance increment.
  a.Incr();
  Expect.equals(2.0, a.f);
  var b = new B();
  // Deoptimize getfield part of instance increment.
  myIncr(b);
  Expect.equals(1.0, b.f);
  // Deoptimize since no type feedback was collected.
  var old = a.f;
  conditionalIncr(true, a);
  Expect.equals(old + 1, a.f);
}

myIncr(var a) {
  a.f++;
}

conditionalIncr(var f, var a) {
  if (f) {
    a.f++;
  }
}

class A {
  A() : f = 0;
  Incr() {
    f++;
  }
  var f;
}

class B {
  B() : f = 0;
  var f;
}

