use std::collections::HashMap;
use typescript_types::TsValue;
#[derive(Debug, Clone)]
pub struct CallFrame {
pub function_name: String,
pub return_ip: usize,
pub locals: HashMap<String, TsValue>,
pub local_indices: HashMap<String, usize>,
pub local_values: Vec<TsValue>,
pub stack_base: usize,
}
impl CallFrame {
pub fn new(function_name: String, return_ip: usize, stack_base: usize) -> Self {
Self {
function_name,
return_ip,
locals: HashMap::new(),
local_indices: HashMap::new(),
local_values: Vec::new(),
stack_base,
}
}
pub fn set_local(&mut self, name: &str, value: TsValue) {
self.locals.insert(name.to_string(), value.clone());
if !self.local_indices.contains_key(name) {
let index = self.local_values.len();
self.local_indices.insert(name.to_string(), index);
self.local_values.push(value);
}
else {
let index = self.local_indices[name];
self.local_values[index] = value;
}
}
pub fn get_local(&self, name: &str) -> Option<&TsValue> {
self.locals.get(name)
}
pub fn get_local_by_index(&self, index: usize) -> Option<&TsValue> {
self.local_values.get(index)
}
pub fn set_local_by_index(&mut self, index: usize, value: TsValue) {
if index < self.local_values.len() {
self.local_values[index] = value;
}
}
pub fn get_local_index(&self, name: &str) -> Option<usize> {
self.local_indices.get(name).copied()
}
}