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

// 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 {
  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;
    }
  }

  int func2(var i) {
    var result = 0;
    for (var k = 0; k <= 10; k++) {
      result += func3(i + k);
    }
    return result;
  }

  int func3(var i) {
    var result = 0;
    for (var l = 0; l <= 1; l++) {
      result += func4(i + l);
    }
    return result;
  }

  int func4(var i) {
    var result = 0;
    for (var j = 0; j <= 10; j++) {
      result += func5(i + j);
    }
    return result;
  }

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