Add test; Make garbage collection work
This commit is contained in:
parent
6c699ec900
commit
dab3d2de8e
@ -63,8 +63,6 @@ impl AbstractTree for Assignment {
|
|||||||
context.set_type(self.identifier.clone(), r#type)?;
|
context.set_type(self.identifier.clone(), r#type)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.identifier.validate(source, context)?;
|
|
||||||
|
|
||||||
if let Some(type_specification) = &self.type_specification {
|
if let Some(type_specification) = &self.type_specification {
|
||||||
match self.operator {
|
match self.operator {
|
||||||
AssignmentOperator::Equal => {
|
AssignmentOperator::Equal => {
|
||||||
@ -135,13 +133,9 @@ impl AbstractTree for Assignment {
|
|||||||
|
|
||||||
let new_value = match self.operator {
|
let new_value = match self.operator {
|
||||||
AssignmentOperator::PlusEqual => {
|
AssignmentOperator::PlusEqual => {
|
||||||
if let Some(left) = context.get_value(&self.identifier)? {
|
let left = self.identifier.run(source, context)?;
|
||||||
left.add(right, self.syntax_position)?
|
|
||||||
} else {
|
left.add(right, self.syntax_position)?
|
||||||
return Err(RuntimeError::ValidationFailure(
|
|
||||||
ValidationError::VariableIdentifierNotFound(self.identifier.clone()),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
AssignmentOperator::MinusEqual => {
|
AssignmentOperator::MinusEqual => {
|
||||||
if let Some(left) = context.get_value(&self.identifier)? {
|
if let Some(left) = context.get_value(&self.identifier)? {
|
||||||
|
@ -180,6 +180,8 @@ impl Context {
|
|||||||
/// representing whether or not the variable was found.
|
/// representing whether or not the variable was found.
|
||||||
pub fn add_allowance(&self, identifier: &Identifier) -> Result<bool, RwLockError> {
|
pub fn add_allowance(&self, identifier: &Identifier) -> Result<bool, RwLockError> {
|
||||||
if let Some((_value_data, counter)) = self.inner.read()?.get(identifier) {
|
if let Some((_value_data, counter)) = self.inner.read()?.get(identifier) {
|
||||||
|
log::debug!("Adding allowance for {identifier}.");
|
||||||
|
|
||||||
counter.add_allowance()?;
|
counter.add_allowance()?;
|
||||||
|
|
||||||
Ok(true)
|
Ok(true)
|
||||||
@ -207,7 +209,13 @@ impl Context {
|
|||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
|
|
||||||
if counter.allowances() == counter.runtime_uses() {
|
counter.add_runtime_use()?;
|
||||||
|
|
||||||
|
log::debug!("Adding runtime use for {identifier}.");
|
||||||
|
|
||||||
|
let (allowances, runtime_uses) = counter.get_counts()?;
|
||||||
|
|
||||||
|
if allowances == runtime_uses {
|
||||||
self.unset(identifier)?;
|
self.unset(identifier)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,3 +379,26 @@ impl Display for Context {
|
|||||||
writeln!(f, "}}")
|
writeln!(f, "}}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn drops_variables() {
|
||||||
|
let context = Context::new();
|
||||||
|
|
||||||
|
interpret_with_context(
|
||||||
|
"
|
||||||
|
x = 1
|
||||||
|
y = 2
|
||||||
|
|
||||||
|
z = x + y
|
||||||
|
",
|
||||||
|
context.clone(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(context.inner.read().unwrap().len(), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -16,12 +16,9 @@ impl UsageCounter {
|
|||||||
})))
|
})))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn allowances(&self) -> Result<usize, RwLockError> {
|
pub fn get_counts(&self) -> Result<(usize, usize), RwLockError> {
|
||||||
Ok(self.0.read()?.allowances)
|
let inner = self.0.read()?;
|
||||||
}
|
Ok((inner.allowances, inner.runtime_uses))
|
||||||
|
|
||||||
pub fn runtime_uses(&self) -> Result<usize, RwLockError> {
|
|
||||||
Ok(self.0.read()?.runtime_uses)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_allowance(&self) -> Result<(), RwLockError> {
|
pub fn add_allowance(&self) -> Result<(), RwLockError> {
|
||||||
|
Loading…
Reference in New Issue
Block a user