Skip to main content

luaur_analysis/methods/
normalizer_is_inhabited_normalize_alt_c.rs

1use crate::enums::normalization_result::NormalizationResult;
2use crate::records::fuel_initializer::FuelInitializer;
3use crate::records::normalized_type::NormalizedType;
4use crate::records::normalizer::Normalizer;
5use crate::records::normalizer_hit_limits::NormalizerHitLimits;
6use crate::type_aliases::type_id::TypeId;
7use luaur_common::records::dense_hash_set::DenseHashSet;
8
9impl Normalizer {
10    pub fn is_inhabited_type_id(&mut self, ty: TypeId) -> NormalizationResult {
11        if self.cache_inhabitance {
12            if let Some(result) = self.cached_is_inhabited.find(&ty) {
13                return if *result {
14                    NormalizationResult::True
15                } else {
16                    NormalizationResult::False
17                };
18            }
19        }
20
21        let mut seen: DenseHashSet<TypeId> = DenseHashSet::new(core::ptr::null_mut());
22
23        match std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
24            let mut fi = FuelInitializer {
25                normalizer: self as *mut Normalizer,
26                initialized_fuel: false,
27            };
28            fi.fuel_initializer_not_null_normalizer(self as *mut Normalizer);
29            let _fi = fi;
30
31            let result = self.is_inhabited_type_id_set_type_id(ty, &mut seen);
32
33            if self.cache_inhabitance {
34                if result == NormalizationResult::True {
35                    *self.cached_is_inhabited.get_or_insert(ty) = true;
36                } else if result == NormalizationResult::False {
37                    *self.cached_is_inhabited.get_or_insert(ty) = false;
38                }
39            }
40
41            result
42        })) {
43            Ok(result) => result,
44            Err(payload) if payload.downcast_ref::<NormalizerHitLimits>().is_some() => {
45                NormalizationResult::HitLimits
46            }
47            Err(payload) => std::panic::resume_unwind(payload),
48        }
49    }
50}