|  | // 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. | 
|  |  | 
|  | // @dart = 2.9 | 
|  |  | 
|  | // 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 15: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:15"); | 
|  | 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:15"); | 
|  | 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(); | 
|  | } |