mirror of
https://github.com/nushell/nushell.git
synced 2025-06-30 22:50:14 +02:00
Shrink Value
by boxing Range
/Closure
(#12784)
# Description On 64-bit platforms the current size of `Value` is 56 bytes. The limiting variants were `Closure` and `Range`. Boxing the two reduces the size of Value to 48 bytes. This is the minimal size possible with our current 16-byte `Span` and any 24-byte `Vec` container which we use in several variants. (Note the extra full 8-bytes necessary for the discriminant or other smaller values due to the 8-byte alignment of `usize`) This is leads to a size reduction of ~15% for `Value` and should overall be beneficial as both `Range` and `Closure` are rarely used compared to the primitive types or even our general container types. # User-Facing Changes Less memory used, potential runtime benefits. (Too late in the evening to run the benchmarks myself right now)
This commit is contained in:
committed by
GitHub
parent
92831d7efc
commit
ba6f38510c
@ -139,7 +139,7 @@ pub fn group_by(
|
||||
match grouper {
|
||||
Value::CellPath { val, .. } => group_cell_path(val, values)?,
|
||||
Value::Closure { val, .. } => {
|
||||
group_closure(values, span, val, engine_state, stack)?
|
||||
group_closure(values, span, *val, engine_state, stack)?
|
||||
}
|
||||
_ => {
|
||||
return Err(ShellError::TypeMismatch {
|
||||
|
@ -133,7 +133,7 @@ fn insert(
|
||||
if let Value::Closure { val, .. } = replacement {
|
||||
match (cell_path.members.first(), &mut value) {
|
||||
(Some(PathMember::String { .. }), Value::List { vals, .. }) => {
|
||||
let mut closure = ClosureEval::new(engine_state, stack, val);
|
||||
let mut closure = ClosureEval::new(engine_state, stack, *val);
|
||||
for val in vals {
|
||||
insert_value_by_closure(
|
||||
val,
|
||||
@ -147,7 +147,7 @@ fn insert(
|
||||
(first, _) => {
|
||||
insert_single_value_by_closure(
|
||||
&mut value,
|
||||
ClosureEvalOnce::new(engine_state, stack, val),
|
||||
ClosureEvalOnce::new(engine_state, stack, *val),
|
||||
head,
|
||||
&cell_path.members,
|
||||
matches!(first, Some(PathMember::Int { .. })),
|
||||
@ -188,7 +188,7 @@ fn insert(
|
||||
let value = stream.next();
|
||||
let end_of_stream = value.is_none();
|
||||
let value = value.unwrap_or(Value::nothing(head));
|
||||
let new_value = ClosureEvalOnce::new(engine_state, stack, val)
|
||||
let new_value = ClosureEvalOnce::new(engine_state, stack, *val)
|
||||
.run_with_value(value.clone())?
|
||||
.into_value(head);
|
||||
|
||||
@ -203,7 +203,7 @@ fn insert(
|
||||
if let Value::Closure { val, .. } = replacement {
|
||||
insert_single_value_by_closure(
|
||||
&mut value,
|
||||
ClosureEvalOnce::new(engine_state, stack, val),
|
||||
ClosureEvalOnce::new(engine_state, stack, *val),
|
||||
head,
|
||||
path,
|
||||
true,
|
||||
@ -224,7 +224,7 @@ fn insert(
|
||||
.chain(stream)
|
||||
.into_pipeline_data_with_metadata(head, engine_state.ctrlc.clone(), metadata))
|
||||
} else if let Value::Closure { val, .. } = replacement {
|
||||
let mut closure = ClosureEval::new(engine_state, stack, val);
|
||||
let mut closure = ClosureEval::new(engine_state, stack, *val);
|
||||
let stream = stream.map(move |mut value| {
|
||||
let err = insert_value_by_closure(
|
||||
&mut value,
|
||||
|
@ -117,7 +117,7 @@ fn update(
|
||||
if let Value::Closure { val, .. } = replacement {
|
||||
match (cell_path.members.first(), &mut value) {
|
||||
(Some(PathMember::String { .. }), Value::List { vals, .. }) => {
|
||||
let mut closure = ClosureEval::new(engine_state, stack, val);
|
||||
let mut closure = ClosureEval::new(engine_state, stack, *val);
|
||||
for val in vals {
|
||||
update_value_by_closure(
|
||||
val,
|
||||
@ -131,7 +131,7 @@ fn update(
|
||||
(first, _) => {
|
||||
update_single_value_by_closure(
|
||||
&mut value,
|
||||
ClosureEvalOnce::new(engine_state, stack, val),
|
||||
ClosureEvalOnce::new(engine_state, stack, *val),
|
||||
head,
|
||||
&cell_path.members,
|
||||
matches!(first, Some(PathMember::Int { .. })),
|
||||
@ -175,7 +175,7 @@ fn update(
|
||||
if let Value::Closure { val, .. } = replacement {
|
||||
update_single_value_by_closure(
|
||||
value,
|
||||
ClosureEvalOnce::new(engine_state, stack, val),
|
||||
ClosureEvalOnce::new(engine_state, stack, *val),
|
||||
head,
|
||||
path,
|
||||
true,
|
||||
@ -189,7 +189,7 @@ fn update(
|
||||
.chain(stream)
|
||||
.into_pipeline_data_with_metadata(head, engine_state.ctrlc.clone(), metadata))
|
||||
} else if let Value::Closure { val, .. } = replacement {
|
||||
let mut closure = ClosureEval::new(engine_state, stack, val);
|
||||
let mut closure = ClosureEval::new(engine_state, stack, *val);
|
||||
let stream = stream.map(move |mut value| {
|
||||
let err = update_value_by_closure(
|
||||
&mut value,
|
||||
|
@ -163,7 +163,7 @@ fn upsert(
|
||||
if let Value::Closure { val, .. } = replacement {
|
||||
match (cell_path.members.first(), &mut value) {
|
||||
(Some(PathMember::String { .. }), Value::List { vals, .. }) => {
|
||||
let mut closure = ClosureEval::new(engine_state, stack, val);
|
||||
let mut closure = ClosureEval::new(engine_state, stack, *val);
|
||||
for val in vals {
|
||||
upsert_value_by_closure(
|
||||
val,
|
||||
@ -177,7 +177,7 @@ fn upsert(
|
||||
(first, _) => {
|
||||
upsert_single_value_by_closure(
|
||||
&mut value,
|
||||
ClosureEvalOnce::new(engine_state, stack, val),
|
||||
ClosureEvalOnce::new(engine_state, stack, *val),
|
||||
head,
|
||||
&cell_path.members,
|
||||
matches!(first, Some(PathMember::Int { .. })),
|
||||
@ -216,7 +216,7 @@ fn upsert(
|
||||
let value = if path.is_empty() {
|
||||
let value = stream.next().unwrap_or(Value::nothing(head));
|
||||
if let Value::Closure { val, .. } = replacement {
|
||||
ClosureEvalOnce::new(engine_state, stack, val)
|
||||
ClosureEvalOnce::new(engine_state, stack, *val)
|
||||
.run_with_value(value)?
|
||||
.into_value(head)
|
||||
} else {
|
||||
@ -226,7 +226,7 @@ fn upsert(
|
||||
if let Value::Closure { val, .. } = replacement {
|
||||
upsert_single_value_by_closure(
|
||||
&mut value,
|
||||
ClosureEvalOnce::new(engine_state, stack, val),
|
||||
ClosureEvalOnce::new(engine_state, stack, *val),
|
||||
head,
|
||||
path,
|
||||
true,
|
||||
@ -249,7 +249,7 @@ fn upsert(
|
||||
.chain(stream)
|
||||
.into_pipeline_data_with_metadata(head, engine_state.ctrlc.clone(), metadata))
|
||||
} else if let Value::Closure { val, .. } = replacement {
|
||||
let mut closure = ClosureEval::new(engine_state, stack, val);
|
||||
let mut closure = ClosureEval::new(engine_state, stack, *val);
|
||||
let stream = stream.map(move |mut value| {
|
||||
let err = upsert_value_by_closure(
|
||||
&mut value,
|
||||
|
@ -103,7 +103,7 @@ impl Command for Zip {
|
||||
let metadata = input.metadata();
|
||||
let other = if let Value::Closure { val, .. } = other {
|
||||
// If a closure was provided, evaluate it and consume its stream output
|
||||
ClosureEvalOnce::new(engine_state, stack, val).run_with_input(PipelineData::Empty)?
|
||||
ClosureEvalOnce::new(engine_state, stack, *val).run_with_input(PipelineData::Empty)?
|
||||
} else {
|
||||
other.into_pipeline_data()
|
||||
};
|
||||
|
Reference in New Issue
Block a user