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

// Check correct deoptimization of instance field increment.


main() {
  var a = new A();
  var aa = new A();
  for (int i = 0; i < 2000; i++) {
    a.Incr();
    myIncr(aa);
    conditionalIncr(false, a);
  }
  Expect.equals(2000, a.f);
  Expect.equals(2000, 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;
}

