From 354d51a3a6759f050912dcc547d4fcf9d2bddf5d Mon Sep 17 00:00:00 2001 From: JT <547158+jntrnr@users.noreply.github.com> Date: Mon, 3 Jan 2022 07:18:48 +1100 Subject: [PATCH] Fix perf regression with stmts (#650) --- crates/nu-engine/src/eval.rs | 79 +++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/crates/nu-engine/src/eval.rs b/crates/nu-engine/src/eval.rs index 1868d42ae0..322f3b1156 100644 --- a/crates/nu-engine/src/eval.rs +++ b/crates/nu-engine/src/eval.rs @@ -418,52 +418,57 @@ pub fn eval_block( } if stmt_idx < (num_stmts) - 1 { - // Drain the input to the screen via tabular output - let config = stack.get_config().unwrap_or_default(); + match input { + PipelineData::Value(Value::Nothing { .. }, ..) => {} + _ => { + // Drain the input to the screen via tabular output + let config = stack.get_config().unwrap_or_default(); - match engine_state.find_decl("table".as_bytes()) { - Some(decl_id) => { - let table = engine_state.get_decl(decl_id).run( - engine_state, - stack, - &Call::new(), - input, - )?; + match engine_state.find_decl("table".as_bytes()) { + Some(decl_id) => { + let table = engine_state.get_decl(decl_id).run( + engine_state, + stack, + &Call::new(), + input, + )?; - for item in table { - let stdout = std::io::stdout(); + for item in table { + let stdout = std::io::stdout(); - if let Value::Error { error } = item { - return Err(error); + if let Value::Error { error } = item { + return Err(error); + } + + let mut out = item.into_string("\n", &config); + out.push('\n'); + + match stdout.lock().write_all(out.as_bytes()) { + Ok(_) => (), + Err(err) => eprintln!("{}", err), + }; + } } + None => { + for item in input { + let stdout = std::io::stdout(); - let mut out = item.into_string("\n", &config); - out.push('\n'); + if let Value::Error { error } = item { + return Err(error); + } - match stdout.lock().write_all(out.as_bytes()) { - Ok(_) => (), - Err(err) => eprintln!("{}", err), - }; - } - } - None => { - for item in input { - let stdout = std::io::stdout(); + let mut out = item.into_string("\n", &config); + out.push('\n'); - if let Value::Error { error } = item { - return Err(error); + match stdout.lock().write_all(out.as_bytes()) { + Ok(_) => (), + Err(err) => eprintln!("{}", err), + }; + } } - - let mut out = item.into_string("\n", &config); - out.push('\n'); - - match stdout.lock().write_all(out.as_bytes()) { - Ok(_) => (), - Err(err) => eprintln!("{}", err), - }; - } + }; } - }; + } input = PipelineData::new(Span { start: 0, end: 0 }) }