Skip to content

Commit

Permalink
Add StackTrace.fromString constructor.
Browse files Browse the repository at this point in the history
Remove _RemoteStackTrace from dart:isolate and use the new version instead.

R=sgjesse@google.com

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

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@45088 260f80e4-7a28-3924-810f-c04153c831b5
  • Loading branch information
lrhn committed Apr 13, 2015
1 parent d0d07a5 commit 68dd6f6
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 10 deletions.
21 changes: 21 additions & 0 deletions sdk/lib/core/stacktrace.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,22 @@ part of dart.core;
* them programmatically.
*/
abstract class StackTrace {
StackTrace(); // In case existing classes extend StackTrace.

/**
* Create a `StackTrace` object from [stackTraceString].
*
* The created stack trace will have a `toString` method returning
* `stackTraceString`.
*
* The `stackTraceString` can be a string returned by some other
* stack trace, or it can be any string at all.
* If the string doesn't look like a stack trace, code that interprets
* stack traces is likely to fail, so fake stack traces should be used
* with care.
*/
factory StackTrace.fromString(String stackTraceString) = _StringStackTrace;

/**
* Returns a [String] representation of the stack trace.
*
Expand All @@ -25,3 +41,8 @@ abstract class StackTrace {
String toString();
}

class _StringStackTrace implements StackTrace {
final String _stackTrace;
_StringStackTrace(this._stackTrace);
String toString() => _stackTrace;
}
9 changes: 2 additions & 7 deletions sdk/lib/isolate/isolate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,7 @@ class Isolate {
* created by calling `toString` on the error.
* The second element is a `String` representation of an accompanying
* stack trace, or `null` if no stack trace was provided.
* To convert this back to a [StackTrace] object, use [StackTrace.fromString].
*
* Listening using the same port more than once does nothing. It will only
* get each error once.
Expand Down Expand Up @@ -607,12 +608,6 @@ class RemoteError implements Error {
final StackTrace stackTrace;
RemoteError(String description, String stackDescription)
: _description = description,
stackTrace = new _RemoteStackTrace(stackDescription);
stackTrace = new StackTrace.fromString(stackDescription);
String toString() => _description;
}

class _RemoteStackTrace implements StackTrace {
String _trace;
_RemoteStackTrace(this._trace);
String toString() => _trace;
}
41 changes: 41 additions & 0 deletions tests/corelib/stacktrace_fromstring_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import "dart:async";

void main() {
StackTrace stack;
try { throw 0; } catch (e, s) { stack = s; }
var string = "$stack";
StackTrace stringTrace = new StackTrace.fromString(string);
Expect.isTrue(stringTrace is StackTrace);
Expect.equals(stack.toString(), stringTrace.toString());

string = "some random string, nothing like a StackTrace";
stringTrace = new StackTrace.fromString(string);
Expect.isTrue(stringTrace is StackTrace);
Expect.equals(string, stringTrace.toString());

// Use stacktrace asynchronously.
asyncStart();
var c = new Completer();
c.completeError(0, stringTrace);
c.future.then((v) {
throw "Unexpected value: $v";
}, onError: (e, s) {
Expect.equals(string, s.toString());
}).then((_) {
var c = new StreamController();
c.stream.listen((v) {
throw "Unexpected value: $v";
}, onError: (e, s) {
Expect.equals(string, s.toString());
asyncEnd();
});
c.addError(0, stringTrace);
c.close();
});
}
6 changes: 3 additions & 3 deletions tests/language/custom_await_stack_trace_test.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import "dart:async";
import "package:expect/expect.dart";

class Blah extends StackTrace {
class Blah implements StackTrace {
Blah(this._trace);

toString() {
return "Blah " + _trace.toString();
}

var _trace;
}

Expand Down

0 comments on commit 68dd6f6

Please sign in to comment.