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

// @dart = 2.9

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