// 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 various optimizations and deoptimizations of optimizing compiler..
// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation

import "package:expect/expect.dart";

addThem(a, b) {
  return a + b;
}

isItInt(a) {
  return a is int;
}

doNeg(a) {
  return -a;
}

doNeg2(a) {
  return -a;
}

doNot(a) {
  return !a;
}

doBitNot(a) {
  return ~a;
}

doStore1(a, v) {
  a[1] = v;
}

doStore2(a, v) {
  a[2] = v;
}

class StringPlus {
  const StringPlus(String this._val);
  operator +(right) => new StringPlus("${_val}${right}");
  toString() => _val;

  final String _val;
}

main() {
  for (int i = 0; i < 20; i++) {
    Expect.stringEquals("HI 5", addThem(const StringPlus("HI "), 5).toString());
    Expect.equals(true, isItInt(5));
  }
  Expect.equals(8, addThem(3, 5));
  for (int i = 0; i < 20; i++) {
    Expect.stringEquals("HI 5", addThem(const StringPlus("HI "), 5).toString());
    Expect.equals(8, addThem(3, 5));
  }
  for (int i = -10; i < 10; i++) {
    var r = doNeg(i);
    var p = doNeg(r);
    Expect.equals(i, p);
  }
  var maxSmi = (1 << 30) - 1;
  Expect.equals(maxSmi, doNeg(doNeg(maxSmi)));
  // Deoptimize because of overflow.
  var minInt = -(1 << 30);
  Expect.equals(minInt, doNeg(doNeg(minInt)));

  for (int i = 0; i < 20; i++) {
    Expect.equals(false, doNot(true));
    Expect.equals(true, doNot(doNot(true)));
  }
  for (int i = 0; i < 20; i++) {
    Expect.equals(-57, doBitNot(56));
    Expect.equals(55, doBitNot(-56));
  }

  for (int i = 0; i < 20; i++) {
    Expect.equals(-2.2, doNeg2(2.2));
  }
  // Deoptimize.
  Expect.equals(-5, doNeg2(5));

  var fixed = new List<dynamic>.filled(10, null);
  var growable = [1, 2, 3, 4, 5];

  for (int i = 0; i < 20; i++) {
    doStore1(fixed, 7);
    Expect.equals(7, fixed[1]);
    doStore2(growable, 12);
    Expect.equals(12, growable[2]);
  }

  // Deoptimize.
  doStore1(growable, 8);
  Expect.equals(8, growable[1]);
  doStore2(fixed, 101);
  Expect.equals(101, fixed[2]);
}
