Files
rlox/src/backend/environment.rs
T

46 lines
1.1 KiB
Rust
Raw Normal View History

use std::collections::HashMap;
use crate::{
frontend::{source_registry::SourceSlice, tokens::LiteralValue},
result::{runtime_error, LoxResult},
};
#[derive(Debug, Clone)]
pub struct EnvironmentStack {
stack: Vec<HashMap<String, LiteralValue>>,
}
impl EnvironmentStack {
pub fn new() -> Self {
EnvironmentStack {
stack: vec![HashMap::new()],
}
}
pub fn push_new_scope(&mut self) {
self.stack.push(HashMap::new());
}
pub fn pop_scope(&mut self) {
self.stack.pop();
}
pub fn get(&self, name: &str) -> LoxResult<LiteralValue> {
let size = self.stack.len();
for i in (0..size).rev() {
if let Some(value) = self.stack[i].get(name) {
return Ok(value.clone());
}
}
runtime_error(
SourceSlice::default(), // todo change this to the actual source slice
format!("Undefined variable '{}'", name),
)
}
pub fn set(&mut self, name: String, value: LiteralValue) {
self.stack.last_mut().unwrap().insert(name, value);
}
}