diff options
Diffstat (limited to 'src/libexpr/eval-error.hh')
-rw-r--r-- | src/libexpr/eval-error.hh | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/src/libexpr/eval-error.hh b/src/libexpr/eval-error.hh index 1faf76781..e9076f28b 100644 --- a/src/libexpr/eval-error.hh +++ b/src/libexpr/eval-error.hh @@ -57,6 +57,11 @@ public: } }; +/** + * `EvalErrorBuilder`s may only be constructed by `EvalState`. The `debugThrow` + * method must be the final method in any such `EvalErrorBuilder` usage, and it + * handles deleting the object. + */ template<class T> class EvalErrorBuilder final { @@ -91,29 +96,10 @@ public: [[nodiscard, gnu::noinline]] EvalErrorBuilder<T> & addTrace(PosIdx pos, std::string_view formatString, const Args &... formatArgs); + /** + * Delete the `EvalErrorBuilder` and throw the underlying exception. + */ [[gnu::noinline, gnu::noreturn]] void debugThrow(); }; -/** - * The size needed to allocate any `EvalErrorBuilder<T>`. - * - * The list of classes here needs to be kept in sync with the list of `template - * class` declarations in `eval-error.cc`. - * - * This is used by `EvalState` to preallocate a buffer of sufficient size for - * any `EvalErrorBuilder<T>` to avoid allocating while evaluating Nix code. - */ -constexpr size_t EVAL_ERROR_BUILDER_SIZE = std::max({ - sizeof(EvalErrorBuilder<EvalError>), - sizeof(EvalErrorBuilder<AssertionError>), - sizeof(EvalErrorBuilder<ThrownError>), - sizeof(EvalErrorBuilder<Abort>), - sizeof(EvalErrorBuilder<TypeError>), - sizeof(EvalErrorBuilder<UndefinedVarError>), - sizeof(EvalErrorBuilder<MissingArgumentError>), - sizeof(EvalErrorBuilder<InfiniteRecursionError>), - sizeof(EvalErrorBuilder<CachedEvalError>), - sizeof(EvalErrorBuilder<InvalidPathError>), -}); - } |