| // 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(); | |
| } |