// Copyright (c) 2013, 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

import "package:expect/expect.dart";

maythrow(x) {
  if (x == null) throw 42;
  return 99;
}


f1(x) {
  var result = 123;
  try {
    result = maythrow(x);
    if (result > 100) throw 42;
  } catch(e) {
    Expect.equals(result, 123);
    Expect.equals(42, e);
    result = 0;
  }
  return result;
}


class A {
  maythrow(x) {
    if (x == null) throw 42;
    return 99;
  }
}


f2(x) {
  var result = 123;
  var a = new A();
  try {
    result++;
    result = a.maythrow(x);
  } catch(e) {
    Expect.equals(124, result);
    result = x;
  }
  return result;
}


f3(x, y) {
  var result = 123;
  var a = new A();
  try {
    result++;
    result = a.maythrow(x);
  } catch(e) {
    result = y + 1; // Deopt on overflow
  }
  return result;
}


f4(x) {
  try {
    maythrow(x);
  } catch(e) {
    check_f4(e, "abc");
  }
}

check_f4(e, s) {
  if (e != 42) throw "ERROR";
  if (s != "abc") throw "ERROR";
}


f5(x) {
  try {
    maythrow(x);
  } catch(e) {
    check_f5(e, "abc");
  }

  try {
    maythrow(x);
  } catch(e) {
    check_f5(e, "abc");
  }
}

check_f5(e, s) {
  if (e != 42) throw "ERROR";
  if (s != "abc") throw "ERROR";
}


f6(x, y) {
  var a = x;
  var b = y;
  var c = 123;
  check_f6(42, null, 1, 123, null, 1);
  try {
    maythrow(x);
  } catch(e) {
    check_f6(e, a, b, c, x, y);
  }
}

check_f6(e, a, b, c, x, y) {
  if (e != 42) throw "ERROR";
  if (a != null) throw "ERROR";
  if (b != 1) throw "ERROR";
  if (c != 123) throw "ERROR";
  if (x != null) throw "ERROR";
  if (y != 1) throw "ERROR";
}


bool f7(String str) {
  double d = double.parse(str);
  var t = d;
  try {
    var a = d.toInt();
    return false;
  } on UnsupportedError catch (e) {
    Expect.equals(true, identical(t, d));
    return true;
  }
}


f8(x, [a = 3, b = 4]) {
  var c = 123;
  var y = a;
  try {
    maythrow(x);
  } catch(e, s) {
    check_f8(e, s, a, b, c, x, y);
  }
}

check_f8(e, s, a, b, c, x, y) {
  if (e != 42) throw "ERROR";
  if (s is! StackTrace) throw "ERROR";
  if (a != 3)  { print(a); throw "ERROR"; }
  if (b != 4) throw "ERROR";
  if (c != 123) throw "ERROR";
  if (x != null) throw "ERROR";
  if (y != a) throw "ERROR";
}


f9(x, [a = 3, b = 4]) {
  var c = 123;
  var y = a;
  try {
    if (x < a) maythrow(null);
    maythrow(x);
  } catch(e, s) {
    check_f9(e, s, a, b, c, x, y);
  }
}


check_f9(e, s, a, b, c, x, y) {
  if (e != 42) throw "ERROR";
  if (s is! StackTrace) throw "ERROR";
  if (a != 3)  { print(a); throw "ERROR"; }
  if (b != 4) throw "ERROR";
  if (c != 123) throw "ERROR";
  if (x != null) throw "ERROR";
  if (y != a) throw "ERROR";
}


f10(x, y) {
  var result = 123;
  try {
    result = maythrow(x);
  } catch(e) {
    Expect.equals(123, result);
    Expect.equals(0.5, y / 2.0);
    result = 0;
  }
  return result;
}


f11(x) {
  var result = 123;
  var tmp = x;
  try {
    result = maythrow(x);
    if (result > 100) throw 42;
  } catch(e, s) {
    Expect.equals(123, result);
    Expect.equals(true, identical(tmp, x));
    Expect.equals(true, s is StackTrace);
    result = 0;
  }
  return result;
}


f12([x = null]) {
  try {
    maythrow(x);
  } catch(e) {
    check_f12(e, x);
  }
}

check_f12(e, x) {
  if (e != 42) throw "ERROR";
  if (x != null) throw "ERROR";
}


f13(x) {
  var result = 123;
  try {
    try {
      result = maythrow(x);
      if (result > 100) throw 42;
    } catch(e) {
      Expect.equals(123, result);
      result = 0;
    }
    maythrow(x);
  } catch(e) {
    result++;
  }
  return result;
}


main() {
  for (var i = 0; i < 20; i++) f1("abc");
  Expect.equals(99, f1("abc"));
  Expect.equals(0, f1(null));

  for (var i = 0; i < 20; i++) f2("abc");
  Expect.equals(99, f2("abc"));
  Expect.equals(null, f2(null));

  f3("123", 0);
  for (var i = 0; i < 20; i++) f3(null, 0);
  Expect.equals(99, f3("123", 0));
  Expect.equals(0x40000000, f3(null, 0x3fffffff));

  f4(null);
  for (var i = 0; i < 20; i++) f4(123);
  f4(null);

  f5(null);
  for (var i = 0; i < 20; i++) f5(123);
  f5(null);

  f6(null, 1);
  for (var i = 0; i < 20; i++) f6(123, 1);
  f6(null, 1);

  f7("1.2");
  f7("Infinity");
  f7("-Infinity");
  for (var i = 0; i < 20; i++) f7("1.2");
  Expect.equals(false, f7("1.2"));
  Expect.equals(true, f7("Infinity"));
  Expect.equals(true, f7("-Infinity"));
  Expect.equals(false, f7("123456789012345"));  // Deopt.
  for (var i = 0; i < 20; i++) f7("123456789012345");
  Expect.equals(true, f7("Infinity"));
  Expect.equals(true, f7("-Infinity"));

  for (var i = 0; i < 20; i++) f8(null);
  f8(null);

  f9(5);
  f9(5.0);
  for (var i = 0; i < 20; i++) f9(3);
  f9(3);

  var y = 1.0;
  Expect.equals(0, f10(null, y));
  for (var i = 0; i < 20; i++) f10("abc", y);
  Expect.equals(99, f10("abc", y));
  Expect.equals(0, f10(null, y));

  for (var i = 0; i < 20; i++) f11("abc");
  Expect.equals(99, f11("abc"));
  Expect.equals(0, f11(null));

  for (var i = 0; i < 20; i++) f12(null);
  f12(null);

  f13(null);
  for (var i = 0; i < 20; i++) f13("abc");
  Expect.equals(99, f13("abc"));
  Expect.equals(1, f13(null));
}
