#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum FunctionSummary {
#[default]
Unknown,
SideEffectFree,
SideEffectFreeReturnsUndefined,
}
impl FunctionSummary {
pub fn is_side_effect_free(self) -> bool {
matches!(self, Self::SideEffectFree | Self::SideEffectFreeReturnsUndefined)
}
pub fn returns_undefined(self) -> bool {
self == Self::SideEffectFreeReturnsUndefined
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum MemberWriteEffect {
#[default]
None,
Hazard,
MayMutatePrototype,
}
impl MemberWriteEffect {
pub fn is_hazardous(self) -> bool {
self >= Self::Hazard
}
pub fn may_mutate_prototype(self) -> bool {
self >= Self::MayMutatePrototype
}
}
#[derive(Debug, Default)]
pub struct PersistentSymbolMetadata {
function_summary: FunctionSummary,
member_write_effect: MemberWriteEffect,
}
impl PersistentSymbolMetadata {
#[inline]
pub fn set_function_summary(&mut self, summary: FunctionSummary) {
self.function_summary = summary;
}
#[inline]
pub fn function_summary(&self) -> FunctionSummary {
self.function_summary
}
#[inline]
pub fn record_member_write_effect(&mut self, effect: MemberWriteEffect) {
self.member_write_effect = self.member_write_effect.max(effect);
}
#[inline]
pub fn member_write_effect(&self) -> MemberWriteEffect {
self.member_write_effect
}
}