Properly parse friendly stack traces without columns.
Review URL: https://codereview.chromium.org//28783006
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/stack_trace@28892 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkgs/stack_trace/lib/src/frame.dart b/pkgs/stack_trace/lib/src/frame.dart
index b6b5962..0b4f577 100644
--- a/pkgs/stack_trace/lib/src/frame.dart
+++ b/pkgs/stack_trace/lib/src/frame.dart
@@ -23,7 +23,7 @@
// .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+)$');
+ r'^([^@(/]*)(?:\(.*\))?((?:/[^/]*)*)(?:\(.*\))?@(.*):(\d+)$');
// foo/bar.dart 10:11 in Foo._bar
// http://dartlang.org/foo/bar.dart in Foo._bar
@@ -160,11 +160,9 @@
var uri = Uri.parse(match[3]);
var member = match[1];
- if (member == "") {
- member = "<fn>";
- } else if (match[2] != null) {
- member = "$member.<fn>";
- }
+ 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, '');
diff --git a/pkgs/stack_trace/lib/src/trace.dart b/pkgs/stack_trace/lib/src/trace.dart
index bf14ee2..95d41ad 100644
--- a/pkgs/stack_trace/lib/src/trace.dart
+++ b/pkgs/stack_trace/lib/src/trace.dart
@@ -36,7 +36,7 @@
final _firefoxTrace = new RegExp(r"^([.0-9A-Za-z_$/<]|\(.*\))*@");
/// A RegExp to match this package's stack traces.
-final _friendlyTrace = new RegExp(r"^[^\s]+( \d+:\d+)?\s+[^\s]+($|\n)");
+final _friendlyTrace = new RegExp(r"^[^\s]+( \d+(:\d+)?)?\s+[^\s]+($|\n)");
/// A stack trace, comprised of a list of stack frames.
class Trace implements StackTrace {
diff --git a/pkgs/stack_trace/test/frame_test.dart b/pkgs/stack_trace/test/frame_test.dart
index 75b92a4..ab7c401 100644
--- a/pkgs/stack_trace/test/frame_test.dart
+++ b/pkgs/stack_trace/test/frame_test.dart
@@ -202,6 +202,18 @@
expect(frame.member, equals("foo.<fn>"));
});
+ test('parses a deeply-nested anonymous stack frame with parameters '
+ 'correctly', () {
+ var frame = new Frame.parseFirefox(
+ '.convertDartClosureToJS/\$function</<@'
+ 'http://pub.dartlang.org/stuff.dart.js:560');
+ expect(frame.uri,
+ equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+ expect(frame.line, equals(560));
+ expect(frame.column, isNull);
+ expect(frame.member, equals("convertDartClosureToJS.<fn>.<fn>"));
+ });
+
test('throws a FormatException for malformed frames', () {
expect(() => new Frame.parseFirefox(''), throwsFormatException);
expect(() => new Frame.parseFirefox('.foo'), throwsFormatException);