// (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. // Avoid dart2js optimizations that alter the JavaScript stack trace. (1) // dart2js inlines methods in the generated JavaScript which leads to missing // frames in the stack trace. (2) Minification obfuscates names. Both issues can // be addressed offline by post-processing the stack trace using the source map // file. // // dart2jsOptions=--disable-inlining --no-minify import "package:expect/expect.dart"; import 'non_web_helper.dart' if (dart.library.js_interop) 'web_helper.dart'; @pragma("vm:entry-point") // Prevent obfuscation. void func1() { throw new Exception("Test full stacktrace"); } @pragma("vm:entry-point") // Prevent obfuscation. void func2() { func1(); } @pragma("vm:entry-point") // Prevent obfuscation. void func3() { try { func2(); } on Object catch (e, s) { var fullTrace = s.toString(); Expect.isTrue(fullTrace.contains("func1")); Expect.isTrue(fullTrace.contains("func2")); Expect.isTrue(fullTrace.contains("func3")); Expect.isTrue(fullTrace.contains("func4")); Expect.isTrue(fullTrace.contains("func5")); Expect.isTrue(fullTrace.contains("func6")); Expect.isTrue(fullTrace.contains("func7")); Expect.isTrue(fullTrace.contains("main")); rethrow; // This is a rethrow. } } @pragma("vm:entry-point") // Prevent obfuscation. int func4() { func3(); return 1; } @pragma("vm:entry-point") // Prevent obfuscation. int func5() { try { func4(); } on Object catch (e, s) { var fullTrace = s.toString(); Expect.isTrue(fullTrace.contains("func1")); Expect.isTrue(fullTrace.contains("func2")); Expect.isTrue(fullTrace.contains("func3")); Expect.isTrue(fullTrace.contains("func4")); Expect.isTrue(fullTrace.contains("func5")); Expect.isTrue(fullTrace.contains("func6")); Expect.isTrue(fullTrace.contains("func7")); Expect.isTrue(fullTrace.contains("main")); } return 1; } @pragma("vm:entry-point") // Prevent obfuscation. int func6() { func5(); return 1; } @pragma("vm:entry-point") // Prevent obfuscation. int func7() { func6(); return 1; } main() { configureStackFrameLimit(); var i = func7(); Expect.equals(1, i); }