OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library trace; | 5 library trace; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 import 'dart:math' as math; | 8 import 'dart:math' as math; |
9 | 9 |
10 import 'chain.dart'; | 10 import 'chain.dart'; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 var trace = new Trace.from(nativeTrace); | 85 var trace = new Trace.from(nativeTrace); |
86 return new LazyTrace(() => new Trace(trace.frames.skip(level + 1))); | 86 return new LazyTrace(() => new Trace(trace.frames.skip(level + 1))); |
87 } | 87 } |
88 } | 88 } |
89 | 89 |
90 /// Returns a new stack trace containing the same data as [trace]. | 90 /// Returns a new stack trace containing the same data as [trace]. |
91 /// | 91 /// |
92 /// If [trace] is a native [StackTrace], its data will be parsed out; if it's | 92 /// If [trace] is a native [StackTrace], its data will be parsed out; if it's |
93 /// a [Trace], it will be returned as-is. | 93 /// a [Trace], it will be returned as-is. |
94 factory Trace.from(StackTrace trace) { | 94 factory Trace.from(StackTrace trace) { |
| 95 // Normally explicitly validating null arguments is bad Dart style, but here |
| 96 // the natural failure will only occur when the LazyTrace is materialized, |
| 97 // and we want to provide an error that's more local to the actual problem. |
| 98 if (trace == null) { |
| 99 throw new ArgumentError("Cannot create a Trace from null."); |
| 100 } |
| 101 |
95 if (trace is Trace) return trace; | 102 if (trace is Trace) return trace; |
96 if (trace is Chain) return trace.toTrace(); | 103 if (trace is Chain) return trace.toTrace(); |
97 return new LazyTrace(() => new Trace.parse(trace.toString())); | 104 return new LazyTrace(() => new Trace.parse(trace.toString())); |
98 } | 105 } |
99 | 106 |
100 /// Parses a string representation of a stack trace. | 107 /// Parses a string representation of a stack trace. |
101 /// | 108 /// |
102 /// [trace] should be formatted in the same way as a Dart VM or browser stack | 109 /// [trace] should be formatted in the same way as a Dart VM or browser stack |
103 /// trace. | 110 /// trace. |
104 factory Trace.parse(String trace) { | 111 factory Trace.parse(String trace) { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 // Figure out the longest path so we know how much to pad. | 248 // Figure out the longest path so we know how much to pad. |
242 var longest = frames.map((frame) => frame.location.length) | 249 var longest = frames.map((frame) => frame.location.length) |
243 .fold(0, math.max); | 250 .fold(0, math.max); |
244 | 251 |
245 // Print out the stack trace nicely formatted. | 252 // Print out the stack trace nicely formatted. |
246 return frames.map((frame) { | 253 return frames.map((frame) { |
247 return '${padRight(frame.location, longest)} ${frame.member}\n'; | 254 return '${padRight(frame.location, longest)} ${frame.member}\n'; |
248 }).join(); | 255 }).join(); |
249 } | 256 } |
250 } | 257 } |
OLD | NEW |