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

// @dart = 2.9

// VMOptions=--optimization_counter_threshold=10 --no-background-compilation

// This test tries to verify that we produce the correct stack trace when
// throwing exceptions even when functions are inlined.
// The test invokes a bunch of functions and then does a throw. There is a
// catch at the outer function which uses the stack trace produced to return
// a string. The test then verifies that the stack trace contains each
// method in the invocation chain. The test is run during warmup to ensure
// unoptimized code produces the correct result and is then run
// in a loop to ensure optimization kicks in and some inlining is done.
// Note: it appears that functions which have a throw are not inlined (func4)
//       and functions that have try/catch in them are not optimized (func1).
//       func2 is not inlined as func1 has not been optimized.

class Test {
  @pragma("vm:entry-point")
  String func1(var k) {
    try {
      for (var i = 0; i <= 50; i++) {
        func2(i * k);
      }
      return "";
    } catch (e, stacktrace) {
      var result = e + "\n" + stacktrace.toString();
      return result;
    }
  }

  @pragma("vm:entry-point")
  int func2(var i) {
    var result = 0;
    for (var k = 0; k <= 10; k++) {
      result += func3(i + k);
    }
    return result;
  }

  @pragma("vm:entry-point")
  int func3(var i) {
    var result = 0;
    for (var l = 0; l <= 1; l++) {
      result += func4(i + l);
    }
    return result;
  }

  @pragma("vm:entry-point")
  int func4(var i) {
    var result = 0;
    for (var j = 0; j <= 10; j++) {
      result += func5(i + j);
    }
    return result;
  }

  @pragma("vm:entry-point")
  int func5(var i) {
    if (i >= 520) throw "show me inlined functions";
    return i;
  }
}

expectHasSubstring(String string, String substring) {
  if (!string.contains(substring)) {
    var sb = new StringBuffer();
    sb.writeln("Expect string:");
    sb.writeln(string);
    sb.writeln("To have substring:");
    sb.writeln(substring);
    throw new Exception(sb.toString());
  }
}

main() {
  var x = new Test();
  var result = x.func1(100000);
  expectHasSubstring(result, "show me inlined functions");
  expectHasSubstring(result, "Test.func1");
  expectHasSubstring(result, "Test.func2");
  expectHasSubstring(result, "Test.func3");
  expectHasSubstring(result, "Test.func4");
  expectHasSubstring(result, "Test.func5");
  for (var i = 0; i <= 10; i++) {
    result = x.func1(i);
  }
  expectHasSubstring(result, "show me inlined functions");
  expectHasSubstring(result, "Test.func1");
  expectHasSubstring(result, "Test.func2");
  expectHasSubstring(result, "Test.func3");
  expectHasSubstring(result, "Test.func4");
  expectHasSubstring(result, "Test.func5");
}
