Chromium Code Reviews| Index: pkg/stack_trace/lib/src/trace.dart |
| diff --git a/pkg/stack_trace/lib/src/trace.dart b/pkg/stack_trace/lib/src/trace.dart |
| index c540d78c67ba9c1cbc66dc3c8871c2f032443cff..936fb9237546be3948b9d8d0131bea5036abb28d 100644 |
| --- a/pkg/stack_trace/lib/src/trace.dart |
| +++ b/pkg/stack_trace/lib/src/trace.dart |
| @@ -29,25 +29,28 @@ final _v8Trace = new RegExp(r"\n ?at "); |
| /// though it is possible for the message to match this as well. |
| final _v8TraceLine = new RegExp(r" ?at "); |
| -/// A RegExp to match Safari's stack traces. |
| +/// A RegExp to match Firefox and Safari's stack traces. |
| /// |
| -/// Prior to version 6, Safari's stack traces were uncapturable. In v6 they were |
| -/// almost identical to Firefox traces, and so are handled by the Firefox code. |
| -/// In v6.1+, they have their own format that's similar to Firefox but distinct |
| -/// enough to warrant handling separately. |
| -/// |
| -/// Most notably, Safari traces occasionally don't include the initial method |
| -/// name followed by "@", and they always have both the line and column number |
| -/// (or just a trailing colon if no column number is available). |
| -final _safariTrace = new RegExp(r"^([0-9A-Za-z_$]*@)?.*:\d*:\d*$", |
| - multiLine: true); |
| - |
| -/// A RegExp to match Firefox's stack traces. |
| +/// Firefox and Safari have very similar stack trace formats, so we use the same |
| +/// logic for parsing them. |
| /// |
| /// Firefox's trace frames start with the name of the function in which the |
| /// error occurred, possibly including its parameters inside `()`. For example, |
| /// `.VW.call$0("arg")@http://pub.dartlang.org/stuff.dart.js:560`. |
| -final _firefoxTrace = new RegExp(r"^([.0-9A-Za-z_$/<]|\(.*\))*@"); |
| +/// |
| +/// Safari traces occasionally don't include the initial method name followed by |
| +/// "@", and they always have both the line and column number (or just a |
| +/// trailing colon if no column number is available). They can also contain |
| +/// empty lines or lines consisting only of `[native code]`. |
| +final _firefoxSafariTrace = new RegExp( |
| + r"^" |
| + r"(" // Member description. Not present in some Safari frames. |
| + r"([.0-9A-Za-z_$/<]|\(.*\))*" // Member name and arguments. |
| + r"@" |
| + r")?" |
| + r"[^\s]*" // Frame URL. |
| + r":\d*" // Line or column number. Some older frames only have a line number. |
| + r"$", multiLine: true); |
| /// A RegExp to match this package's stack traces. |
| final _friendlyTrace = new RegExp(r"^[^\s]+( \d+(:\d+)?)?[ \t]+[^\s]+$", |
| @@ -109,15 +112,12 @@ class Trace implements StackTrace { |
| /// [trace] should be formatted in the same way as a Dart VM or browser stack |
| /// trace. |
| factory Trace.parse(String trace) { |
| - try { |
| + // try { |
|
Bob Nystrom
2014/09/18 19:12:03
?
nweiz
2014/09/18 19:54:04
Oops, left over from debugging. Removed.
|
| if (trace.isEmpty) return new Trace(<Frame>[]); |
| if (trace.contains(_v8Trace)) return new Trace.parseV8(trace); |
| - // Safari 6.1+ traces could be misinterpreted as Firefox traces, so we |
| - // check for them first. |
| - if (trace.contains(_safariTrace)) return new Trace.parseSafari6_1(trace); |
| - // Safari 6.0 traces are a superset of Firefox traces, so we parse those |
| - // two together. |
| - if (trace.contains(_firefoxTrace)) return new Trace.parseSafari6_0(trace); |
| + if (trace.contains(_firefoxSafariTrace)) { |
| + return new Trace.parseFirefox(trace); |
| + } |
| if (trace.contains(_friendlyTrace)) { |
| return new Trace.parseFriendly(trace); |
| } |
| @@ -126,9 +126,9 @@ class Trace implements StackTrace { |
| // IE and Safari, where the stack trace is just an empty string (issue |
| // 11257). |
| return new Trace.parseVM(trace); |
| - } on FormatException catch (error) { |
| - throw new FormatException('${error.message}\nStack trace:\n$trace'); |
| - } |
| + // } on FormatException catch (error) { |
| + // throw new FormatException('${error.message}\nStack trace:\n$trace'); |
| + // } |
| } |
| /// Parses a string representation of a Dart VM stack trace. |
| @@ -157,29 +157,20 @@ class Trace implements StackTrace { |
| /// Parses a string representation of a Firefox stack trace. |
| Trace.parseFirefox(String trace) |
| : this(trace.trim().split("\n") |
| + .where((line) => line.isNotEmpty && line != '[native code]') |
| .map((line) => new Frame.parseFirefox(line))); |
| /// Parses a string representation of a Safari stack trace. |
| - /// |
| - /// This will automatically decide between [parseSafari6_0] and |
| - /// [parseSafari6_1] based on the contents of [trace]. |
| - factory Trace.parseSafari(String trace) { |
| - if (trace.contains(_safariTrace)) return new Trace.parseSafari6_1(trace); |
| - return new Trace.parseSafari6_0(trace); |
| - } |
| + Trace.parseSafari(String trace) |
| + : this.parseFirefox(trace); |
| /// Parses a string representation of a Safari 6.1+ stack trace. |
| + @Deprecated("Use Trace.parseSafari instead.") |
| Trace.parseSafari6_1(String trace) |
| - : this(trace.trim().split("\n") |
| - .where((line) => line.isNotEmpty) |
| - .map((line) => new Frame.parseSafari6_1(line))); |
| + : this.parseSafari(trace); |
| /// Parses a string representation of a Safari 6.0 stack trace. |
| - /// |
| - /// Safari 6.0 stack traces look just like Firefox traces, except that they |
| - /// sometimes (e.g. in isolates) have a "[native code]" frame. We just ignore |
| - /// this frame to make the stack format more consistent between browsers. |
| - /// Prior to Safari 6.0, stack traces can't be retrieved. |
| + @Deprecated("Use Trace.parseSafari instead.") |
| Trace.parseSafari6_0(String trace) |
| : this(trace.trim().split("\n") |
| .where((line) => line != '[native code]') |