Check if subclass is in registry (recursive)
(
impl_data: &AbcData,
subclass: &PyObject,
vm: &VirtualMachine,
)
| 285 | |
| 286 | /// Check if subclass is in registry (recursive) |
| 287 | fn subclasscheck_check_registry( |
| 288 | impl_data: &AbcData, |
| 289 | subclass: &PyObject, |
| 290 | vm: &VirtualMachine, |
| 291 | ) -> PyResult<Option<bool>> { |
| 292 | // Fast path: check if subclass is in weakref directly |
| 293 | if in_weak_set(&impl_data.registry, subclass, vm)? { |
| 294 | return Ok(Some(true)); |
| 295 | } |
| 296 | |
| 297 | let registry_opt = impl_data.registry.read(); |
| 298 | let registry = match &*registry_opt { |
| 299 | Some(s) => s.clone(), |
| 300 | None => return Ok(None), |
| 301 | }; |
| 302 | drop(registry_opt); |
| 303 | |
| 304 | // Make a local copy to protect against concurrent modifications |
| 305 | let registry_copy = PyFrozenSet::from_iter(vm, registry.elements().into_iter())?; |
| 306 | |
| 307 | for weak_ref_obj in registry_copy.elements() { |
| 308 | if let Ok(weak_ref) = weak_ref_obj.downcast::<PyWeak>() |
| 309 | && let Some(rkey) = weak_ref.upgrade() |
| 310 | && subclass.to_owned().is_subclass(&rkey, vm)? |
| 311 | { |
| 312 | add_to_weak_set(&impl_data.cache, subclass, vm)?; |
| 313 | return Ok(Some(true)); |
| 314 | } |
| 315 | } |
| 316 | |
| 317 | Ok(None) |
| 318 | } |
| 319 | |
| 320 | /// Internal ABC helper for subclass checks. Should be never used outside abc module. |
| 321 | #[pyfunction] |
no test coverage detected