From 68dd6f6338e63d0465041d662e778369c02c2ce6 Mon Sep 17 00:00:00 2001 From: "lrn@google.com" Date: Mon, 13 Apr 2015 09:17:13 +0000 Subject: [PATCH] Add StackTrace.fromString constructor. 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 --- sdk/lib/core/stacktrace.dart | 21 ++++++++++ sdk/lib/isolate/isolate.dart | 9 +--- tests/corelib/stacktrace_fromstring_test.dart | 41 +++++++++++++++++++ .../custom_await_stack_trace_test.dart | 6 +-- 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 tests/corelib/stacktrace_fromstring_test.dart diff --git a/sdk/lib/core/stacktrace.dart b/sdk/lib/core/stacktrace.dart index ef8cc4dbb4ad..c8540dc47bb8 100644 --- a/sdk/lib/core/stacktrace.dart +++ b/sdk/lib/core/stacktrace.dart @@ -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. * @@ -25,3 +41,8 @@ abstract class StackTrace { String toString(); } +class _StringStackTrace implements StackTrace { + final String _stackTrace; + _StringStackTrace(this._stackTrace); + String toString() => _stackTrace; +} diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart index 35d2a8b15c90..b91ec267a06c 100644 --- a/sdk/lib/isolate/isolate.dart +++ b/sdk/lib/isolate/isolate.dart @@ -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. @@ -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; -} diff --git a/tests/corelib/stacktrace_fromstring_test.dart b/tests/corelib/stacktrace_fromstring_test.dart new file mode 100644 index 000000000000..eb4d6b0a8579 --- /dev/null +++ b/tests/corelib/stacktrace_fromstring_test.dart @@ -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(); + }); +} diff --git a/tests/language/custom_await_stack_trace_test.dart b/tests/language/custom_await_stack_trace_test.dart index cff91814046c..dfcb429bee38 100644 --- a/tests/language/custom_await_stack_trace_test.dart +++ b/tests/language/custom_await_stack_trace_test.dart @@ -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; }