mirror of
https://github.com/fish-shell/fish-shell.git
synced 2025-03-15 15:05:27 +08:00
Fix error propagation in parser_t::eval
It was unconditionally returning `parse_execution_success`. This was causing certain parser errors to incorrectly return after evaluation with `$status` equal to `0`, as reported after `eval`, `source`, or sub-`fish` execution.
This commit is contained in:
parent
8e4010b263
commit
b2a1da602f
@ -1291,7 +1291,7 @@ parse_execution_result_t parse_execution_context_t::run_1_job(tnode_t<g::job> jo
|
||||
}
|
||||
|
||||
job_reap(false); // clean up jobs
|
||||
return parse_execution_success;
|
||||
return populated_job ? parse_execution_success : parse_execution_errored;
|
||||
}
|
||||
|
||||
parse_execution_result_t parse_execution_context_t::run_job_conjunction(
|
||||
|
@ -631,17 +631,17 @@ int parser_t::eval(wcstring cmd, const io_chain_t &io, enum block_type_t block_t
|
||||
std::fwprintf(stderr, L"%ls\n", backtrace_and_desc.c_str());
|
||||
return 1;
|
||||
}
|
||||
this->eval(ps, io, block_type);
|
||||
return 0;
|
||||
return this->eval(ps, io, block_type);
|
||||
}
|
||||
|
||||
void parser_t::eval(parsed_source_ref_t ps, const io_chain_t &io, enum block_type_t block_type) {
|
||||
int parser_t::eval(parsed_source_ref_t ps, const io_chain_t &io, enum block_type_t block_type) {
|
||||
assert(block_type == TOP || block_type == SUBST);
|
||||
if (!ps->tree.empty()) {
|
||||
// Execute the first node.
|
||||
tnode_t<grammar::job_list> start{&ps->tree, &ps->tree.front()};
|
||||
this->eval_node(ps, start, io, block_type, nullptr /* parent */);
|
||||
return this->eval_node(ps, start, io, block_type, nullptr /* parent */);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -225,7 +225,8 @@ class parser_t : public std::enable_shared_from_this<parser_t> {
|
||||
int eval(wcstring cmd, const io_chain_t &io, enum block_type_t block_type);
|
||||
|
||||
/// Evaluate the parsed source ps.
|
||||
void eval(parsed_source_ref_t ps, const io_chain_t &io, enum block_type_t block_type);
|
||||
/// \return 0 on success, 1 on a parse error.
|
||||
int eval(parsed_source_ref_t ps, const io_chain_t &io, enum block_type_t block_type);
|
||||
|
||||
/// Evaluates a node.
|
||||
/// The node type must be grammar::statement or grammar::job_list.
|
||||
|
Loading…
x
Reference in New Issue
Block a user