From 7bb844a77835b446365aa56729483927acc6c561 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Sun, 4 Nov 2012 17:11:02 -0800 Subject: [PATCH] Fix bug where 'else if' does not support functions and redirections https://github.com/fish-shell/fish-shell/issues/359 --- parser.cpp | 12 +++++++----- parser.h | 2 +- tests/test7.in | 8 ++++++++ tests/test7.out | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/parser.cpp b/parser.cpp index 72cd4be10..1824cebd9 100644 --- a/parser.cpp +++ b/parser.cpp @@ -1309,11 +1309,13 @@ job_t *parser_t::job_get_from_pid( int pid ) \param j the job to which the process belongs to \param tok the tokenizer to read options from \param args the argument list to insert options into + \param args unskip whether we should ignore current_block->skip. Big hack because of our dumb handling of if statements. */ void parser_t::parse_job_argument_list( process_t *p, job_t *j, tokenizer *tok, - std::vector &args ) + std::vector &args, + bool unskip ) { int is_finished=0; @@ -1401,7 +1403,7 @@ void parser_t::parse_job_argument_list( process_t *p, { skip = 1; } - else if( current_block->skip ) + else if( current_block->skip && ! unskip ) { /* If this command should be skipped, we do not expand the arguments @@ -1505,7 +1507,7 @@ void parser_t::parse_job_argument_list( process_t *p, Otherwise, bogus errors may be the result. (Do check that token is string, though) */ - if( current_block->skip ) + if( current_block->skip && ! unskip ) { tok_next( tok ); if( tok_last_type( tok ) != TOK_STRING ) @@ -1965,7 +1967,7 @@ int parser_t::parse_job( process_t *p, continue; } - if( use_function && !current_block->skip ) + if( use_function && ( unskip || ! current_block->skip )) { bool nxt_forbidden=false; wcstring forbid; @@ -2267,7 +2269,7 @@ int parser_t::parse_job( process_t *p, } else { - parse_job_argument_list(p, j, tok, args); + parse_job_argument_list(p, j, tok, args, unskip); } } diff --git a/parser.h b/parser.h index 331ca520d..ebcfe1c3d 100644 --- a/parser.h +++ b/parser.h @@ -333,7 +333,7 @@ class parser_t { parser_t(const parser_t&); parser_t& operator=(const parser_t&); - void parse_job_argument_list( process_t *p, job_t *j, tokenizer *tok, std::vector& ); + void parse_job_argument_list( process_t *p, job_t *j, tokenizer *tok, std::vector&, bool ); int parse_job( process_t *p, job_t *j, tokenizer *tok ); void skipped_exec( job_t * j ); void eval_job( tokenizer *tok ); diff --git a/tests/test7.in b/tests/test7.in index 910f80805..d642e71e7 100644 --- a/tests/test7.in +++ b/tests/test7.in @@ -102,3 +102,11 @@ else if not_a_valid_command but it should be OK because a previous branch was ta else if test ! -n "abc" echo "epsilon 5.4" end + +# Ensure builtins work +# https://github.com/fish-shell/fish-shell/issues/359 +if not echo skip1 > /dev/null + echo "zeta 6.1" +else if echo skip2 > /dev/null + echo "zeta 6.2" +end diff --git a/tests/test7.out b/tests/test7.out index 903f1973e..9e101b0ed 100644 --- a/tests/test7.out +++ b/tests/test7.out @@ -24,3 +24,4 @@ yep4.2 delta4.1 delta4.2 epsilon5.2 +zeta 6.2