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:
Mahmoud Al-Qudsi 2019-04-13 16:57:00 -05:00
parent 8e4010b263
commit b2a1da602f
3 changed files with 7 additions and 6 deletions

View File

@ -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(

View File

@ -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>

View File

@ -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.