| // 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. |
| // Test correct source positions in stack trace with optimized functions. |
| import "package:expect/expect.dart"; |
| |
| // (1) Test normal exception. |
| foo(x) => bar(x); |
| |
| bar(x) { |
| if (x == null) throw 42; // throw at position 11:18 |
| return x + 1; |
| } |
| |
| test1() { |
| // First unoptimized. |
| try { |
| foo(null); |
| Expect.fail("Unreachable"); |
| } catch (e, stacktrace) { |
| String s = stacktrace.toString(); |
| print(s); |
| Expect.isFalse(s.contains("-1:-1"), "A"); |
| RegExp regex = |
| new RegExp("optimized_stacktrace_line_test(_none|_01)*\.dart:11"); |
| Expect.isTrue(regex.hasMatch(s), "B"); |
| } |
| |
| // Optimized. |
| for (var i = 0; i < 10000; i++) foo(42); |
| try { |
| foo(null); |
| Expect.fail("Unreachable"); |
| } catch (e, stacktrace) { |
| String s = stacktrace.toString(); |
| print(s); |
| Expect.isFalse(s.contains("-1:-1"), "C"); |
| RegExp regex = |
| new RegExp("optimized_stacktrace_line_test(_none|_01)*\.dart:11"); |
| Expect.isTrue(regex.hasMatch(s), "D"); |
| } |
| } |
| |
| // (2) Test checked mode exceptions. |
| maximus(x) => moritz(x); |
| |
| moritz(x) { |
| if (x == 333) return (42 as bool) ? 0 : 1; |
| if (x == 777) { |
| bool b = x; |
| return b; |
| } |
| |
| return x + 1; |
| } |
| |
| test2() { |
| for (var i = 0; i < 100000; i++) maximus(42); |
| try { |
| maximus(333); |
| } catch (e, stacktrace) { |
| String s = stacktrace.toString(); |
| print(s); |
| Expect.isTrue(s.contains("maximus"), "E"); |
| Expect.isTrue(s.contains("moritz"), "F"); |
| Expect.isFalse(s.contains("-1:-1"), "G"); |
| } |
| |
| try { |
| maximus(777); |
| } catch (e, stacktrace) { |
| String s = stacktrace.toString(); |
| print(s); |
| Expect.isTrue(s.contains("maximus"), "H"); |
| Expect.isTrue(s.contains("moritz"), "I"); |
| Expect.isFalse(s.contains("-1:-1"), "J"); |
| } |
| } |
| |
| main() { |
| test1(); |
| test2(); |
| } |