aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/eval.hh
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2023-01-18 01:19:07 +0100
committerRobert Hensing <robert@roberthensing.nl>2023-01-18 01:34:07 +0100
commit9b33ef3879a764bed4cc2404a08344c3a697a646 (patch)
treed6921123c18a9077d2f897999e3a1445d1738502 /src/libexpr/eval.hh
parent98f57f44bbeca3b555bd732771eac4c07d54576b (diff)
Revert "Merge pull request #6204 from layus/coerce-string"
This reverts commit a75b7ba30f1e4f8b15e810fd18e63ee9552e0815, reversing changes made to 9af16c5f742300e831a2cc400e43df1e22f87f31.
Diffstat (limited to 'src/libexpr/eval.hh')
-rw-r--r--src/libexpr/eval.hh177
1 files changed, 95 insertions, 82 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 46b8cbaa5..df6ac431d 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -86,43 +86,6 @@ struct DebugTrace {
void debugError(Error * e, Env & env, Expr & expr);
-class ErrorBuilder
-{
- private:
- EvalState & state;
- ErrorInfo info;
-
- ErrorBuilder(EvalState & s, ErrorInfo && i): state(s), info(i) { }
-
- public:
- template<typename... Args>
- [[nodiscard, gnu::noinline]]
- static ErrorBuilder * create(EvalState & s, const Args & ... args)
- {
- return new ErrorBuilder(s, ErrorInfo { .msg = hintfmt(args...) });
- }
-
- [[nodiscard, gnu::noinline]]
- ErrorBuilder & atPos(PosIdx pos);
-
- [[nodiscard, gnu::noinline]]
- ErrorBuilder & withTrace(PosIdx pos, const std::string_view text);
-
- [[nodiscard, gnu::noinline]]
- ErrorBuilder & withFrameTrace(PosIdx pos, const std::string_view text);
-
- [[nodiscard, gnu::noinline]]
- ErrorBuilder & withSuggestions(Suggestions & s);
-
- [[nodiscard, gnu::noinline]]
- ErrorBuilder & withFrame(const Env & e, const Expr & ex);
-
- template<class ErrorType>
- [[gnu::noinline, gnu::noreturn]]
- void debugThrow();
-};
-
-
class EvalState : public std::enable_shared_from_this<EvalState>
{
public:
@@ -182,35 +145,29 @@ public:
template<class E>
[[gnu::noinline, gnu::noreturn]]
- void debugThrowLastTrace(E && error)
+ void debugThrow(E && error, const Env & env, const Expr & expr)
{
- debugThrow(error, nullptr, nullptr);
+ if (debugRepl)
+ runDebugRepl(&error, env, expr);
+
+ throw std::move(error);
}
template<class E>
[[gnu::noinline, gnu::noreturn]]
- void debugThrow(E && error, const Env * env, const Expr * expr)
+ void debugThrowLastTrace(E && e)
{
- if (debugRepl && ((env && expr) || !debugTraces.empty())) {
- if (!env || !expr) {
- const DebugTrace & last = debugTraces.front();
- env = &last.env;
- expr = &last.expr;
- }
- runDebugRepl(&error, *env, *expr);
+ // Call this in the situation where Expr and Env are inaccessible.
+ // The debugger will start in the last context that's in the
+ // DebugTrace stack.
+ if (debugRepl && !debugTraces.empty()) {
+ const DebugTrace & last = debugTraces.front();
+ runDebugRepl(&e, last.env, last.expr);
}
- throw std::move(error);
+ throw std::move(e);
}
- ErrorBuilder * errorBuilder;
-
- template<typename... Args>
- [[nodiscard, gnu::noinline]]
- ErrorBuilder & error(const Args & ... args) {
- errorBuilder = ErrorBuilder::create(*this, args...);
- return *errorBuilder;
- }
private:
SrcToStore srcToStore;
@@ -325,8 +282,8 @@ public:
/* Evaluation the expression, then verify that it has the expected
type. */
inline bool evalBool(Env & env, Expr * e);
- inline bool evalBool(Env & env, Expr * e, const PosIdx pos, std::string_view errorCtx);
- inline void evalAttrs(Env & env, Expr * e, Value & v, const PosIdx pos, std::string_view errorCtx);
+ inline bool evalBool(Env & env, Expr * e, const PosIdx pos);
+ inline void evalAttrs(Env & env, Expr * e, Value & v);
/* If `v' is a thunk, enter it and overwrite `v' with the result
of the evaluation of the thunk. If `v' is a delayed function
@@ -342,25 +299,89 @@ public:
void forceValueDeep(Value & v);
/* Force `v', and then verify that it has the expected type. */
- NixInt forceInt(Value & v, const PosIdx pos, std::string_view errorCtx);
- NixFloat forceFloat(Value & v, const PosIdx pos, std::string_view errorCtx);
- bool forceBool(Value & v, const PosIdx pos, std::string_view errorCtx);
+ NixInt forceInt(Value & v, const PosIdx pos);
+ NixFloat forceFloat(Value & v, const PosIdx pos);
+ bool forceBool(Value & v, const PosIdx pos);
- void forceAttrs(Value & v, const PosIdx pos, std::string_view errorCtx);
+ void forceAttrs(Value & v, const PosIdx pos);
template <typename Callable>
- inline void forceAttrs(Value & v, Callable getPos, std::string_view errorCtx);
+ inline void forceAttrs(Value & v, Callable getPos);
+
+ inline void forceList(Value & v, const PosIdx pos);
+ void forceFunction(Value & v, const PosIdx pos); // either lambda or primop
+ std::string_view forceString(Value & v, const PosIdx pos = noPos);
+ std::string_view forceString(Value & v, PathSet & context, const PosIdx pos = noPos);
+ std::string_view forceStringNoCtx(Value & v, const PosIdx pos = noPos);
+
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const PosIdx pos, const char * s);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const PosIdx pos, const char * s,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const char * s, const std::string & s2);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const PosIdx pos, const char * s, const std::string & s2);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const char * s, const std::string & s2,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const PosIdx pos, const char * s, const std::string & s2,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const char * s, const std::string & s2, const std::string & s3,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const PosIdx pos, const char * s, const std::string & s2, const std::string & s3,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const PosIdx pos, const char * s, const std::string & s2, const std::string & s3);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const char * s, const std::string & s2, const std::string & s3);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const PosIdx pos, const Suggestions & suggestions, const char * s, const std::string & s2,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwEvalError(const PosIdx p1, const char * s, const Symbol sym, const PosIdx p2,
+ Env & env, Expr & expr);
- inline void forceList(Value & v, const PosIdx pos, std::string_view errorCtx);
- void forceFunction(Value & v, const PosIdx pos, std::string_view errorCtx); // either lambda or primop
- std::string_view forceString(Value & v, const PosIdx pos, std::string_view errorCtx);
- std::string_view forceString(Value & v, PathSet & context, const PosIdx pos, std::string_view errorCtx);
- std::string_view forceStringNoCtx(Value & v, const PosIdx pos, std::string_view errorCtx);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwTypeError(const PosIdx pos, const char * s, const Value & v);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwTypeError(const PosIdx pos, const char * s, const Value & v,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwTypeError(const PosIdx pos, const char * s);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwTypeError(const PosIdx pos, const char * s,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwTypeError(const PosIdx pos, const char * s, const ExprLambda & fun, const Symbol s2,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwTypeError(const PosIdx pos, const Suggestions & suggestions, const char * s, const ExprLambda & fun, const Symbol s2,
+ Env & env, Expr & expr);
+ [[gnu::noinline, gnu::noreturn]]
+ void throwTypeError(const char * s, const Value & v,
+ Env & env, Expr & expr);
+
+ [[gnu::noinline, gnu::noreturn]]
+ void throwAssertionError(const PosIdx pos, const char * s, const std::string & s1,
+ Env & env, Expr & expr);
+
+ [[gnu::noinline, gnu::noreturn]]
+ void throwUndefinedVarError(const PosIdx pos, const char * s, const std::string & s1,
+ Env & env, Expr & expr);
+
+ [[gnu::noinline, gnu::noreturn]]
+ void throwMissingArgumentError(const PosIdx pos, const char * s, const std::string & s1,
+ Env & env, Expr & expr);
[[gnu::noinline]]
void addErrorTrace(Error & e, const char * s, const std::string & s2) const;
[[gnu::noinline]]
- void addErrorTrace(Error & e, const PosIdx pos, const char * s, const std::string & s2, bool frame = false) const;
+ void addErrorTrace(Error & e, const PosIdx pos, const char * s, const std::string & s2) const;
public:
/* Return true iff the value `v' denotes a derivation (i.e. a
@@ -376,18 +397,17 @@ public:
referenced paths are copied to the Nix store as a side effect. */
BackedStringView coerceToString(const PosIdx pos, Value & v, PathSet & context,
bool coerceMore = false, bool copyToStore = true,
- bool canonicalizePath = true,
- std::string_view errorCtx = "");
+ bool canonicalizePath = true);
StorePath copyPathToStore(PathSet & context, const Path & path);
/* Path coercion. Converts strings, paths and derivations to a
path. The result is guaranteed to be a canonicalised, absolute
path. Nothing is copied to the store. */
- Path coerceToPath(const PosIdx pos, Value & v, PathSet & context, std::string_view errorCtx);
+ Path coerceToPath(const PosIdx pos, Value & v, PathSet & context);
/* Like coerceToPath, but the result must be a store path. */
- StorePath coerceToStorePath(const PosIdx pos, Value & v, PathSet & context, std::string_view errorCtx);
+ StorePath coerceToStorePath(const PosIdx pos, Value & v, PathSet & context);
public:
@@ -447,7 +467,7 @@ public:
/* Do a deep equality test between two values. That is, list
elements and attributes are compared recursively. */
- bool eqValues(Value & v1, Value & v2, const PosIdx pos, std::string_view errorCtx);
+ bool eqValues(Value & v1, Value & v2);
bool isFunctor(Value & fun);
@@ -482,7 +502,7 @@ public:
void mkThunk_(Value & v, Expr * expr);
void mkPos(Value & v, PosIdx pos);
- void concatLists(Value & v, size_t nrLists, Value * * lists, const PosIdx pos, std::string_view errorCtx);
+ void concatLists(Value & v, size_t nrLists, Value * * lists, const PosIdx pos);
/* Print statistics. */
void printStats();
@@ -645,13 +665,6 @@ extern EvalSettings evalSettings;
static const std::string corepkgsPrefix{"/__corepkgs__/"};
-template<class ErrorType>
-void ErrorBuilder::debugThrow()
-{
- // NOTE: We always use the -LastTrace version as we push the new trace in withFrame()
- state.debugThrowLastTrace(ErrorType(info));
-}
-
}
#include "eval-inline.hh"