// 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.
// Test deoptimization caused by running code that did not collect type
// feedback before.

testStoreIndexed() {
  test(a, i, v, flag) {
    if (flag) {
      // No type feedback in first pass
      return a[i] = v; 
    } else {
      return a[i] = i;
    }
  }

  var a = new List(10);
  for (var i = 0; i < 2000; i++) {
    var r = test(a, 3, 888, false);
    Expect.equals(3, r);
    Expect.equals(3, a[3]);
  }
  // Deopt.
  var r = test(a, 3, 888, true);
  Expect.equals(888, r);
  Expect.equals(888, a[3]);
}

testIncrLocal() {
  test(a, flag) {
    if (flag) {
      a++;
      return a;
    } else {
      return -1;
    }
  }

  for (var i = 0; i < 2000; i++) {
    var r = test(10, false);
    Expect.equals(-1, r);
  }
  // Deopt.
  var r = test(10, true);
  Expect.equals(11, r);
}


main() {
  for (var i = 0; i < 2000; i++) {}
  testStoreIndexed();
  testIncrLocal();
}
