use crate::gml::Instruction;
use crate::gml::instruction::DataType;
use crate::prelude::*;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct CodeAnalysis {
pub uses_array_copy_on_write: bool,
pub uses_short_circuit: bool,
}
impl Default for CodeAnalysis {
fn default() -> Self {
Self {
uses_array_copy_on_write: false,
uses_short_circuit: true,
}
}
}
#[must_use]
pub fn analyze(data: &GMData) -> CodeAnalysis {
let mut analysis = CodeAnalysis::default();
for code in &data.codes {
for instruction in &code.instructions {
match instruction {
Instruction::And {
lhs: DataType::Boolean,
rhs: DataType::Boolean,
}
| Instruction::Or {
lhs: DataType::Boolean,
rhs: DataType::Boolean,
} => {
analysis.uses_short_circuit = false;
}
Instruction::SetArrayOwner => {
analysis.uses_array_copy_on_write = true;
}
_ => {}
}
}
}
analysis
}
impl GMData {
#[must_use]
pub fn analyze_code(&self) -> CodeAnalysis {
analyze(self)
}
}