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:
Ian Manske
2023-11-07 23:43:28 +00:00
committed by GitHub
parent 7a3cbf43e8
commit 60da7abbc7
33 changed files with 46 additions and 59 deletions

View File

@ -42,7 +42,7 @@ fn get_prompt_string(
.and_then(|v| match v {
Value::Closure { val, .. } => {
let block = engine_state.get_block(val.block_id);
let mut stack = stack.captures_to_stack(&val.captures);
let mut stack = stack.captures_to_stack(val.captures);
// Use eval_subexpression to force a redirection of output, so we can use everything in prompt
let ret_val =
eval_subexpression(engine_state, &mut stack, block, PipelineData::empty());

View File

@ -252,7 +252,7 @@ pub(crate) fn add_columnar_menu(
let menu_completer = NuMenuCompleter::new(
val.block_id,
span,
stack.captures_to_stack(&val.captures),
stack.captures_to_stack(val.captures.clone()),
engine_state,
only_buffer_difference,
);
@ -334,7 +334,7 @@ pub(crate) fn add_list_menu(
let menu_completer = NuMenuCompleter::new(
val.block_id,
span,
stack.captures_to_stack(&val.captures),
stack.captures_to_stack(val.captures.clone()),
engine_state,
only_buffer_difference,
);
@ -452,7 +452,7 @@ pub(crate) fn add_description_menu(
let menu_completer = NuMenuCompleter::new(
val.block_id,
span,
stack.captures_to_stack(&val.captures),
stack.captures_to_stack(val.captures.clone()),
engine_state,
only_buffer_difference,
);