Index: packages/stack_trace/lib/src/lazy_chain.dart |
diff --git a/packages/stack_trace/lib/src/lazy_chain.dart b/packages/stack_trace/lib/src/lazy_chain.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..55b98974a5404a1a7fdf45495a4b19ea01534486 |
--- /dev/null |
+++ b/packages/stack_trace/lib/src/lazy_chain.dart |
@@ -0,0 +1,33 @@ |
+// Copyright (c) 2017, 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 'chain.dart'; |
+import 'frame.dart'; |
+import 'lazy_trace.dart'; |
+import 'trace.dart'; |
+ |
+/// A thunk for lazily constructing a [Chain]. |
+typedef Chain ChainThunk(); |
+ |
+/// A wrapper around a [ChainThunk]. This works around issue 9579 by avoiding |
+/// the conversion of native [StackTrace]s to strings until it's absolutely |
+/// necessary. |
+class LazyChain implements Chain { |
+ final ChainThunk _thunk; |
+ Chain _inner; |
+ |
+ LazyChain(this._thunk); |
+ |
+ Chain get _chain { |
+ if (_inner == null) _inner = _thunk(); |
+ return _inner; |
+ } |
+ |
+ List<Trace> get traces => _chain.traces; |
+ Chain get terse => _chain.terse; |
+ Chain foldFrames(bool predicate(Frame frame), {bool terse: false}) => |
+ new LazyChain(() => _chain.foldFrames(predicate, terse: terse)); |
+ Trace toTrace() => new LazyTrace(() => _chain.toTrace()); |
+ String toString() => _chain.toString(); |
+} |