// 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. // 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.concat(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 >= 1030) throw "show me inlined functions"; return i; } } main() { var x = new Test(); var result = x.func1(100000); Expect.isTrue(result.contains("show me inlined functions")); Expect.isTrue(result.contains("Test.func1")); Expect.isTrue(result.contains("Test.func2")); Expect.isTrue(result.contains("Test.func3")); Expect.isTrue(result.contains("Test.func4")); Expect.isTrue(result.contains("Test.func")); for (var i = 0; i <= 200; i++) { result = x.func1(i); } Expect.isTrue(result.contains("show me inlined functions")); Expect.isTrue(result.contains("Test.func1")); Expect.isTrue(result.contains("Test.func2")); Expect.isTrue(result.contains("Test.func3")); Expect.isTrue(result.contains("Test.func4")); Expect.isTrue(result.contains("Test.func5")); }