mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 13:46:03 +02:00
Use Vec
for Closure
captures (#10940)
# Description Changes the `captures` field in `Closure` from a `HashMap` to a `Vec` and makes `Stack::captures_to_stack` take an owned `Vec` instead of a borrowed `HashMap`. This eliminates the conversion to a `Vec` inside `captures_to_stack` and makes it possible to avoid clones altogether when using an owned `Closure` (which is the case for most commands). Additionally, using a `Vec` reduces the size of `Value` by 8 bytes (down to 72). # User-Facing Changes Breaking API change for `nu-protocol`.
This commit is contained in:
@ -182,7 +182,7 @@ mod test {
|
||||
ast::{CellPath, PathMember},
|
||||
engine::Closure,
|
||||
};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::collections::HashSet;
|
||||
|
||||
#[test]
|
||||
fn from_value() {
|
||||
@ -243,7 +243,7 @@ mod test {
|
||||
Value::closure(
|
||||
Closure {
|
||||
block_id: 0,
|
||||
captures: HashMap::new(),
|
||||
captures: Vec::new(),
|
||||
},
|
||||
span,
|
||||
),
|
||||
|
@ -41,7 +41,7 @@ impl Command for Explain {
|
||||
let capture_block: Closure = call.req(engine_state, stack, 0)?;
|
||||
let block = engine_state.get_block(capture_block.block_id);
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
|
||||
let elements = get_pipeline_elements(engine_state, &mut stack, block)?;
|
||||
|
||||
|
2
crates/nu-command/src/env/export_env.rs
vendored
2
crates/nu-command/src/env/export_env.rs
vendored
@ -37,7 +37,7 @@ impl Command for ExportEnv {
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let capture_block: Closure = call.req(engine_state, caller_stack, 0)?;
|
||||
let block = engine_state.get_block(capture_block.block_id);
|
||||
let mut callee_stack = caller_stack.captures_to_stack(&capture_block.captures);
|
||||
let mut callee_stack = caller_stack.captures_to_stack(capture_block.captures);
|
||||
|
||||
let _ = eval_block(
|
||||
engine_state,
|
||||
|
2
crates/nu-command/src/env/with_env.rs
vendored
2
crates/nu-command/src/env/with_env.rs
vendored
@ -85,7 +85,7 @@ fn with_env(
|
||||
|
||||
let capture_block: Closure = call.req(engine_state, stack, 1)?;
|
||||
let block = engine_state.get_block(capture_block.block_id);
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
|
||||
let mut env: HashMap<String, Value> = HashMap::new();
|
||||
|
||||
|
@ -121,7 +121,7 @@ with 'transpose' first."#
|
||||
let outer_ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
let span = call.head;
|
||||
|
@ -58,7 +58,7 @@ a variable. On the other hand, the "row condition" syntax is not supported."#
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
let span = call.head;
|
||||
|
@ -246,7 +246,7 @@ fn group_closure(
|
||||
|
||||
for value in values {
|
||||
if let Some(capture_block) = &block {
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures.clone());
|
||||
let block = engine_state.get_block(capture_block.block_id);
|
||||
let pipeline = eval_block(
|
||||
engine_state,
|
||||
|
@ -125,7 +125,7 @@ fn insert(
|
||||
let capture_block = Closure::from_value(replacement)?;
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
|
||||
|
@ -49,7 +49,7 @@ impl Command for Items {
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
let span = call.head;
|
||||
|
@ -128,7 +128,7 @@ impl Command for ParEach {
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let outer_ctrlc = engine_state.ctrlc.clone();
|
||||
let block_id = capture_block.block_id;
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
let span = call.head;
|
||||
let redirect_stdout = call.redirect_stdout;
|
||||
let redirect_stderr = call.redirect_stderr;
|
||||
|
@ -98,7 +98,7 @@ impl Command for Reduce {
|
||||
|
||||
let fold: Option<Value> = call.get_flag(engine_state, stack, "fold")?;
|
||||
let capture_block: Closure = call.req(engine_state, stack, 0)?;
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
let block = engine_state.get_block(capture_block.block_id);
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
|
||||
|
@ -141,7 +141,7 @@ fn rename(
|
||||
if let Some(capture_block) = call.get_flag::<Closure>(engine_state, stack, "block")? {
|
||||
let engine_state = engine_state.clone();
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
let stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let stack = stack.captures_to_stack(capture_block.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
Some((engine_state, block, stack, orig_env_vars, orig_env_hidden))
|
||||
|
@ -86,7 +86,7 @@ impl Command for SkipUntil {
|
||||
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
let var_id = block.signature.get_positional(0).and_then(|arg| arg.var_id);
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
|
@ -91,7 +91,7 @@ impl Command for SkipWhile {
|
||||
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
let var_id = block.signature.get_positional(0).and_then(|arg| arg.var_id);
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
|
@ -82,7 +82,7 @@ impl Command for TakeUntil {
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
let var_id = block.signature.get_positional(0).and_then(|arg| arg.var_id);
|
||||
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
|
@ -82,7 +82,7 @@ impl Command for TakeWhile {
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
let var_id = block.signature.get_positional(0).and_then(|arg| arg.var_id);
|
||||
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
|
@ -122,7 +122,7 @@ fn update(
|
||||
let capture_block = Closure::from_value(replacement)?;
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
|
||||
|
@ -144,7 +144,7 @@ fn upsert(
|
||||
let capture_block = Closure::from_value(replacement)?;
|
||||
let block = engine_state.get_block(capture_block.block_id).clone();
|
||||
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
|
||||
|
@ -30,7 +30,7 @@ pub fn boolean_fold(
|
||||
|
||||
let block = engine_state.get_block(block_id);
|
||||
let var_id = block.signature.get_positional(0).and_then(|arg| arg.var_id);
|
||||
let mut stack = stack.captures_to_stack(&capture_block.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.captures);
|
||||
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
|
@ -59,7 +59,7 @@ not supported."#
|
||||
let span = call.head;
|
||||
|
||||
let metadata = input.metadata();
|
||||
let mut stack = stack.captures_to_stack(&closure.captures);
|
||||
let mut stack = stack.captures_to_stack(closure.captures);
|
||||
let block = engine_state.get_block(closure.block_id).clone();
|
||||
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
|
@ -102,7 +102,7 @@ used as the next argument to the closure, otherwise generation stops.
|
||||
let block = engine_state.get_block(capture_block.item.block_id).clone();
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
let mut stack = stack.captures_to_stack(&capture_block.item.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.item.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
let redirect_stdout = call.redirect_stdout;
|
||||
|
@ -114,7 +114,7 @@ used as the next argument to the closure, otherwise generation stops.
|
||||
let block = engine_state.get_block(capture_block.item.block_id).clone();
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let engine_state = engine_state.clone();
|
||||
let mut stack = stack.captures_to_stack(&capture_block.item.captures);
|
||||
let mut stack = stack.captures_to_stack(capture_block.item.captures);
|
||||
let orig_env_vars = stack.env_vars.clone();
|
||||
let orig_env_hidden = stack.env_hidden.clone();
|
||||
let redirect_stdout = call.redirect_stdout;
|
||||
|
Reference in New Issue
Block a user