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

// Test OSR in different places of a try-catch.

import "package:expect/expect.dart";

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

f1() {
  var s = 0, t = "abc";
  for (var i = 0; i < 21; ++i) {
    s += i;
  }
  try {
    maythrow(null);
  } catch (e) {
    Expect.equals("abc", t);
    Expect.equals(42, e);
    s++;
  }
  return s;
}

f2([x = 1]) {
  var s = 0, t = "abc";
  try {
    try {
      for (var i = 0; i < 20; ++i) {
        if (i == 18) maythrow(null);
        s += x;
      }
    } catch (e) {
      Expect.equals(1, x);
      Expect.equals("abc", t);
      Expect.equals(42, e);
      s++;
    }
  } catch (e) { }
  return s;
}

f3() {
  var s = 0, t = "abc";
  try {
    maythrow(null);
  } catch (e) {
    Expect.equals("abc", t);
    for (var i = 0; i < 21; ++i) {
      s += i;
    }
    Expect.equals("abc", t);
    Expect.equals(42, e);
    return s;
  }
}

f4() {
  var s = 0, t = "abc";
  try {
    for (var i = 0; i < 21; ++i) {
      if (i == 18) maythrow(null);
      s += i;
    }
  } catch (e) {
    Expect.equals("abc", t);
    Expect.equals(42, e);
    s++;
  }
  return s;
}

f5() {
  var s, t = "abc";
  try {
    maythrow(null);
  } catch (e) {
    Expect.equals("abc", t);
    Expect.equals(42, e);
    s = 0;
  }
  for (var i = 0; i < 21; ++i) {
    s += i;
  }
  Expect.equals("abc", t);
  return s;
}

main() {
  Expect.equals(211, f1());
  Expect.equals(19, f2());
  Expect.equals(210, f3());
  Expect.equals(9 * 17 + 1, f4());
  Expect.equals(210, f5());
}
