Index: pkg/stack_trace/lib/src/frame.dart |
diff --git a/pkg/stack_trace/lib/src/frame.dart b/pkg/stack_trace/lib/src/frame.dart |
index b1db23042128acef68aad571b4cb854c6e1e4eb8..4f5b16c2e01c50358fb7ff4af1f0799f8c3ebae5 100644 |
--- a/pkg/stack_trace/lib/src/frame.dart |
+++ b/pkg/stack_trace/lib/src/frame.dart |
@@ -30,15 +30,26 @@ final _v8UrlLocation = new RegExp(r'^(.*):(\d+):(\d+)$'); |
final _v8EvalLocation = new RegExp( |
r'^eval at (?:\S.*?) \((.*)\)(?:, .*?:\d+:\d+)?$'); |
-// foo$bar$0@http://pub.dartlang.org/stuff.dart.js:560:28 |
-// http://pub.dartlang.org/stuff.dart.js:560:28 |
-final _safariFrame = new RegExp(r"^(?:([0-9A-Za-z_$]*)@)?(.*):(\d*):(\d*)$"); |
- |
// .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560 |
// .VW.call$0("arg")@http://pub.dartlang.org/stuff.dart.js:560 |
// .VW.call$0/name<@http://pub.dartlang.org/stuff.dart.js:560 |
-final _firefoxFrame = new RegExp( |
- r'^([^@(/]*)(?:\(.*\))?((?:/[^/]*)*)(?:\(.*\))?@(.*):(\d+)$'); |
+// .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560:36 |
+// http://pub.dartlang.org/stuff.dart.js:560 |
+final _firefoxSafariFrame = new RegExp( |
+ r'^' |
+ r'(?:' // Member description. Not present in some Safari frames. |
+ r'([^@(/]*)' // The actual name of the member. |
+ r'(?:\(.*\))?' // Arguments to the member, sometimes captured by Firefox. |
+ r'((?:/[^/]*)*)' // Extra characters indicating a nested closure. |
+ r'(?:\(.*\))?' // Arguments to the closure. |
+ r'@' |
+ r')?' |
+ r'(.*?)' // The frame's URL. |
+ r':' |
+ r'(\d*)' // The line number. Empty in Safari if it's unknown. |
+ r'(?::(\d*))?' // The column number. Not present in older browsers and |
+ // empty in Safari if it's unknown. |
+ r'$'); |
// foo/bar.dart 10:11 in Foo._bar |
// http://dartlang.org/foo/bar.dart in Foo._bar |
@@ -187,45 +198,45 @@ class Frame { |
/// Parses a string representation of a Firefox stack frame. |
factory Frame.parseFirefox(String frame) { |
- var match = _firefoxFrame.firstMatch(frame); |
+ var match = _firefoxSafariFrame.firstMatch(frame); |
if (match == null) { |
throw new FormatException( |
- "Couldn't parse Firefox stack trace line '$frame'."); |
+ "Couldn't parse Firefox/Safari stack trace line '$frame'."); |
} |
// Normally this is a URI, but in a jsshell trace it can be a path. |
var uri = _uriOrPathToUri(match[3]); |
- var member = match[1]; |
- member += new List.filled('/'.allMatches(match[2]).length, ".<fn>").join(); |
- if (member == '') member = '<fn>'; |
- |
- // Some Firefox members have initial dots. We remove them for consistency |
- // with other platforms. |
- member = member.replaceFirst(_initialDot, ''); |
- return new Frame(uri, int.parse(match[4]), null, member); |
+ |
+ var member; |
+ if (match[1] != null) { |
+ member = match[1]; |
+ member += |
+ new List.filled('/'.allMatches(match[2]).length, ".<fn>").join(); |
+ if (member == '') member = '<fn>'; |
+ |
+ // Some Firefox members have initial dots. We remove them for consistency |
+ // with other platforms. |
+ member = member.replaceFirst(_initialDot, ''); |
+ } else { |
+ member = '<fn>'; |
+ } |
+ |
+ var line = match[4] == '' ? null : int.parse(match[4]); |
+ var column = match[5] == null || match[5] == '' ? |
+ null : int.parse(match[5]); |
+ return new Frame(uri, line, column, member); |
} |
/// Parses a string representation of a Safari 6.0 stack frame. |
- /// |
- /// Safari 6.0 frames look just like Firefox frames. Prior to Safari 6.0, |
- /// stack traces can't be retrieved. |
+ @Deprecated("Use Frame.parseSafari instead.") |
factory Frame.parseSafari6_0(String frame) => new Frame.parseFirefox(frame); |
/// Parses a string representation of a Safari 6.1+ stack frame. |
- factory Frame.parseSafari6_1(String frame) { |
- var match = _safariFrame.firstMatch(frame); |
- if (match == null) { |
- throw new FormatException( |
- "Couldn't parse Safari stack trace line '$frame'."); |
- } |
+ @Deprecated("Use Frame.parseSafari instead.") |
+ factory Frame.parseSafari6_1(String frame) => new Frame.parseFirefox(frame); |
- var uri = Uri.parse(match[2]); |
- var member = match[1]; |
- if (member == null) member = '<fn>'; |
- var line = match[3] == '' ? null : int.parse(match[3]); |
- var column = match[4] == '' ? null : int.parse(match[4]); |
- return new Frame(uri, line, column, member); |
- } |
+ /// Parses a string representation of a Safari stack frame. |
+ factory Frame.parseSafari(String frame) => new Frame.parseFirefox(frame); |
/// Parses this package's string representation of a stack frame. |
factory Frame.parseFriendly(String frame) { |