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..2690ece17a2fac811a86413328eb2fd3fd7a1b58 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]+$", |
@@ -112,12 +115,9 @@ class Trace implements StackTrace { |
try { |
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); |
} |
@@ -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]') |