Refactor stack management to use resize

Replaces manual iteration for pushing `Value::Void` with `Vec::resize`
for more efficient stack management. This change improves performance by
reducing redundant operations and simplifies the code.
This commit is contained in:
Michael Schimmel
2026-03-10 20:43:46 +01:00
parent efcb4e3685
commit 3657f19047
+17 -7
View File
@@ -168,6 +168,13 @@ impl VM {
} else {
self.unpack(&closure.parameter_node, &next_args, &mut 0)?;
}
// PRE-ALLOCATION
let current_stack = self.stack.len() as u32;
if closure.stack_size > current_stack {
self.stack.resize(closure.stack_size as usize, Value::Void);
}
result = self.eval_observed(observer, &closure.exec_node);
self.frames.pop();
} else if let Some(series) = next_obj.as_series() {
@@ -239,9 +246,7 @@ impl VM {
// Fill remaining stack slots with Void
let current_stack = self.stack.len() as u32;
if closure.stack_size > current_stack {
for _ in 0..(closure.stack_size - current_stack) {
self.stack.push(Value::Void);
}
self.stack.resize(closure.stack_size as usize, Value::Void);
}
self.frames.push(CallFrame {
@@ -263,9 +268,7 @@ impl VM {
self.stack.clear();
self.frames.clear();
for _ in 0..stack_size {
self.stack.push(Value::Void);
}
self.stack.resize(stack_size as usize, Value::Void);
self.frames.push(CallFrame {
stack_base: 0,
@@ -697,7 +700,14 @@ impl VM {
};
let res = match unpack_res {
Ok(_) => self.eval_internal(obs, &closure.exec_node),
Ok(_) => {
// PRE-ALLOCATION
let current_stack = (self.stack.len() - base) as u32;
if closure.stack_size > current_stack {
self.stack.resize(base + closure.stack_size as usize, Value::Void);
}
self.eval_internal(obs, &closure.exec_node)
}
Err(e) => Err(e),
};