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:
+17
-7
@@ -168,6 +168,13 @@ impl VM {
|
|||||||
} else {
|
} else {
|
||||||
self.unpack(&closure.parameter_node, &next_args, &mut 0)?;
|
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);
|
result = self.eval_observed(observer, &closure.exec_node);
|
||||||
self.frames.pop();
|
self.frames.pop();
|
||||||
} else if let Some(series) = next_obj.as_series() {
|
} else if let Some(series) = next_obj.as_series() {
|
||||||
@@ -239,9 +246,7 @@ impl VM {
|
|||||||
// Fill remaining stack slots with Void
|
// Fill remaining stack slots with Void
|
||||||
let current_stack = self.stack.len() as u32;
|
let current_stack = self.stack.len() as u32;
|
||||||
if closure.stack_size > current_stack {
|
if closure.stack_size > current_stack {
|
||||||
for _ in 0..(closure.stack_size - current_stack) {
|
self.stack.resize(closure.stack_size as usize, Value::Void);
|
||||||
self.stack.push(Value::Void);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.frames.push(CallFrame {
|
self.frames.push(CallFrame {
|
||||||
@@ -263,9 +268,7 @@ impl VM {
|
|||||||
self.stack.clear();
|
self.stack.clear();
|
||||||
self.frames.clear();
|
self.frames.clear();
|
||||||
|
|
||||||
for _ in 0..stack_size {
|
self.stack.resize(stack_size as usize, Value::Void);
|
||||||
self.stack.push(Value::Void);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.frames.push(CallFrame {
|
self.frames.push(CallFrame {
|
||||||
stack_base: 0,
|
stack_base: 0,
|
||||||
@@ -697,7 +700,14 @@ impl VM {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let res = match unpack_res {
|
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),
|
Err(e) => Err(e),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user