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

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));
}
