Support "..." VM frames in pkg/stack_trace.

Also include the original stack trace when a parse error occurs.

R=rnystrom@google.com

Review URL: https://codereview.chromium.org//23133004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/stack_trace@26132 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkgs/stack_trace/lib/src/frame.dart b/pkgs/stack_trace/lib/src/frame.dart
index 5a0582c..3db4ab5 100644
--- a/pkgs/stack_trace/lib/src/frame.dart
+++ b/pkgs/stack_trace/lib/src/frame.dart
@@ -97,6 +97,12 @@
 
   /// Parses a string representation of a Dart VM stack frame.
   factory Frame.parseVM(String frame) {
+    // The VM sometimes folds multiple stack frames together and replaces them
+    // with "...".
+    if (frame == '...') {
+      return new Frame(new Uri(), null, null, '...');
+    }
+
     var match = _vmFrame.firstMatch(frame);
     if (match == null) {
       throw new FormatException("Couldn't parse VM stack trace line '$frame'.");
diff --git a/pkgs/stack_trace/lib/src/trace.dart b/pkgs/stack_trace/lib/src/trace.dart
index 6b7da75..863d64e 100644
--- a/pkgs/stack_trace/lib/src/trace.dart
+++ b/pkgs/stack_trace/lib/src/trace.dart
@@ -72,14 +72,19 @@
   /// [trace] should be formatted in the same way as a Dart VM or browser stack
   /// trace.
   factory Trace.parse(String trace) {
-    if (trace.isEmpty) return new Trace(<Frame>[]);
-    if (trace.startsWith("Error\n")) return new Trace.parseV8(trace);
-    if (trace.contains(_firefoxTrace)) return new Trace.parseFirefox(trace);
-    if (trace.contains(_friendlyTrace)) return new Trace.parseFriendly(trace);
+    try {
+      if (trace.isEmpty) return new Trace(<Frame>[]);
+      if (trace.startsWith("Error\n")) return new Trace.parseV8(trace);
+      if (trace.contains(_firefoxTrace)) return new Trace.parseFirefox(trace);
+      if (trace.contains(_friendlyTrace)) return new Trace.parseFriendly(trace);
 
-    // Default to parsing the stack trace as a VM trace. This is also hit on IE
-    // and Safari, where the stack trace is just an empty string (issue 11257).
-    return new Trace.parseVM(trace);
+      // Default to parsing the stack trace as a VM trace. This is also hit on
+      // 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');
+    }
   }
 
   /// Parses a string representation of a Dart VM stack trace.
diff --git a/pkgs/stack_trace/test/frame_test.dart b/pkgs/stack_trace/test/frame_test.dart
index 75302a7..0be717d 100644
--- a/pkgs/stack_trace/test/frame_test.dart
+++ b/pkgs/stack_trace/test/frame_test.dart
@@ -29,6 +29,15 @@
           equals('<fn>.<fn>.bar'));
     });
 
+    test('parses a folded frame correctly', () {
+      var frame = new Frame.parseVM('...');
+
+      expect(frame.member, equals('...'));
+      expect(frame.uri, equals(new Uri()));
+      expect(frame.line, isNull);
+      expect(frame.column, isNull);
+    });
+
     test('throws a FormatException for malformed frames', () {
       expect(() => new Frame.parseVM(''), throwsFormatException);
       expect(() => new Frame.parseVM('#1'), throwsFormatException);