Recursively update subclasses' slots recurse_down_subclasses
(&self, name: &'static PyStrInterned, ctx: &Context)
| 665 | /// Recursively update subclasses' slots |
| 666 | /// recurse_down_subclasses |
| 667 | fn update_subclasses<const ADD: bool>(&self, name: &'static PyStrInterned, ctx: &Context) { |
| 668 | let subclasses = self.subclasses.read(); |
| 669 | for weak_ref in subclasses.iter() { |
| 670 | let Some(subclass) = weak_ref.upgrade() else { |
| 671 | continue; |
| 672 | }; |
| 673 | let Some(subclass) = subclass.downcast_ref::<PyType>() else { |
| 674 | continue; |
| 675 | }; |
| 676 | |
| 677 | // Skip if subclass has its own definition for this attribute |
| 678 | if subclass.attributes.read().contains_key(name) { |
| 679 | continue; |
| 680 | } |
| 681 | |
| 682 | // Update subclass's slots |
| 683 | for def in find_slot_defs_by_name(name.as_str()) { |
| 684 | subclass.update_one_slot::<ADD>(&def.accessor, name, ctx); |
| 685 | } |
| 686 | |
| 687 | // Recurse into subclass's subclasses |
| 688 | subclass.update_subclasses::<ADD>(name, ctx); |
| 689 | } |
| 690 | } |
| 691 | |
| 692 | /// Update a single slot |
| 693 | fn update_one_slot<const ADD: bool>( |
nothing calls this directly
no test coverage detected