| // 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 ChainThunk = Chain Function(); |
| |
| /// 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; |
| late final Chain _chain = _thunk(); |
| |
| LazyChain(this._thunk); |
| |
| @override |
| List<Trace> get traces => _chain.traces; |
| @override |
| Chain get terse => _chain.terse; |
| @override |
| Chain foldFrames(bool Function(Frame) predicate, {bool terse = false}) => |
| LazyChain(() => _chain.foldFrames(predicate, terse: terse)); |
| @override |
| Trace toTrace() => LazyTrace(_chain.toTrace); |
| @override |
| String toString() => _chain.toString(); |
| } |