X Tutup
Skip to content

Commit ead2d98

Browse files
authored
Separate WeakRefList from ObjExt as independent prefix (RustPython#7365)
- Remove weak_list from ObjExt, allocate WeakRefList as its own prefix slot before PyInner - Add MANAGED_WEAKREF flag (1 << 3) to PyTypeFlags - Normalize MANAGED_WEAKREF from HAS_WEAKREF after flag assembly - Use Layout::extend offsets in bootstrap allocator
1 parent ce8952b commit ead2d98

File tree

4 files changed

+170
-65
lines changed

4 files changed

+170
-65
lines changed

crates/vm/src/builtins/type.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -585,12 +585,12 @@ impl PyType {
585585
slots.flags |= PyTypeFlags::HAS_DICT
586586
}
587587

588-
// Inherit HAS_WEAKREF from any base in MRO that has it
588+
// Inherit HAS_WEAKREF/MANAGED_WEAKREF from any base in MRO that has it
589589
if mro
590590
.iter()
591591
.any(|b| b.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF))
592592
{
593-
slots.flags |= PyTypeFlags::HAS_WEAKREF
593+
slots.flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF
594594
}
595595

596596
// Inherit SEQUENCE and MAPPING flags from base classes
@@ -605,6 +605,11 @@ impl PyType {
605605

606606
Self::inherit_readonly_slots(&mut slots, &base);
607607

608+
// Normalize: any type with HAS_WEAKREF gets MANAGED_WEAKREF
609+
if slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF) {
610+
slots.flags |= PyTypeFlags::MANAGED_WEAKREF;
611+
}
612+
608613
if let Some(qualname) = attrs.get(identifier!(ctx, __qualname__))
609614
&& !qualname.fast_isinstance(ctx.types.str_type)
610615
{
@@ -655,7 +660,7 @@ impl PyType {
655660
slots.flags |= PyTypeFlags::HAS_DICT
656661
}
657662
if base.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF) {
658-
slots.flags |= PyTypeFlags::HAS_WEAKREF
663+
slots.flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF
659664
}
660665

661666
// Inherit SEQUENCE and MAPPING flags from base class
@@ -668,6 +673,11 @@ impl PyType {
668673

669674
Self::inherit_readonly_slots(&mut slots, &base);
670675

676+
// Normalize: any type with HAS_WEAKREF gets MANAGED_WEAKREF
677+
if slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF) {
678+
slots.flags |= PyTypeFlags::MANAGED_WEAKREF;
679+
}
680+
671681
let bases = PyRwLock::new(vec![base.clone()]);
672682
let mro = base.mro_map_collect(|x| x.to_owned());
673683

@@ -1976,7 +1986,7 @@ impl Constructor for PyType {
19761986
// 2. __weakref__ is in __slots__
19771987
let may_add_weakref = !base.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF);
19781988
if (heaptype_slots.is_none() && may_add_weakref) || add_weakref {
1979-
flags |= PyTypeFlags::HAS_WEAKREF;
1989+
flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF;
19801990
}
19811991

19821992
let (slots, heaptype_ext) = {

0 commit comments

Comments
 (0)
X Tutup