simplify parse error reporting

since nix doesn't use the bison `error` terminal anywhere any invocation
of yyerror will immediately cause a failure. since we're *already*
leaking tons of memory whatever little bit bison allocates internally
doesn't much matter any more, and we'll be replacing the parser soon anyway.

coincidentally this now also matches the error behavior of URIs when
they are disabled or ~/ paths in pure eval mode, duplicate attr
detection etc.

(cherry picked from commit e8d9de967f)
Change-Id: I560c50d11dceddc2d7cf9ed2c6c631a309ce574e
This commit is contained in:
eldritch horrors 2024-03-08 05:17:36 +01:00
parent 2cea973e29
commit ba16d99124

View file

@ -18,6 +18,7 @@
#include <variant> #include <variant>
#include "finally.hh"
#include "util.hh" #include "util.hh"
#include "nixexpr.hh" #include "nixexpr.hh"
@ -59,7 +60,6 @@ namespace nix {
Expr * result; Expr * result;
SourcePath basePath; SourcePath basePath;
PosTable::Origin origin; PosTable::Origin origin;
std::optional<ErrorInfo> error;
}; };
} }
@ -314,10 +314,10 @@ static inline PosIdx makeCurPos(const YYLTYPE & loc, ParseData * data)
void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * error) void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * error)
{ {
data->error = { throw ParseError({
.msg = hintfmt(error), .msg = hintfmt(error),
.errPos = data->state.positions[makeCurPos(*loc, data)] .errPos = data->state.positions[makeCurPos(*loc, data)]
}; });
} }
@ -685,11 +685,10 @@ Expr * EvalState::parse(
}; };
yylex_init(&scanner); yylex_init(&scanner);
yy_scan_buffer(text, length, scanner); Finally _destroy([&] { yylex_destroy(scanner); });
int res = yyparse(scanner, &data);
yylex_destroy(scanner);
if (res) throw ParseError(data.error.value()); yy_scan_buffer(text, length, scanner);
yyparse(scanner, &data);
data.result->bindVars(*this, staticEnv); data.result->bindVars(*this, staticEnv);