aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval-error.cc2
-rw-r--r--src/libexpr/eval-error.hh30
2 files changed, 9 insertions, 23 deletions
diff --git a/src/libexpr/eval-error.cc b/src/libexpr/eval-error.cc
index b9411cbf4..250c59a19 100644
--- a/src/libexpr/eval-error.cc
+++ b/src/libexpr/eval-error.cc
@@ -91,7 +91,7 @@ void EvalErrorBuilder<T>::debugThrow()
// `EvalState` is the only class that can construct an `EvalErrorBuilder`,
// and it does so in dynamic storage. This is the final method called on
- // any such instancve and must delete itself before throwing the underlying
+ // any such instance and must delete itself before throwing the underlying
// error.
auto error = std::move(this->error);
delete this;
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>),
-});
-
}