Skip to content

Commit 4ee068e

Browse files
committed
Separate WeakRefList from ObjExt as independent prefix
- 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 46abff6 commit 4ee068e

File tree

4 files changed

+169
-65
lines changed

4 files changed

+169
-65
lines changed

crates/vm/src/builtins/type.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -592,12 +592,12 @@ impl PyType {
592592
slots.flags |= PyTypeFlags::HAS_DICT
593593
}
594594

595-
// Inherit HAS_WEAKREF from any base in MRO that has it
595+
// Inherit HAS_WEAKREF/MANAGED_WEAKREF from any base in MRO that has it
596596
if mro
597597
.iter()
598598
.any(|b| b.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF))
599599
{
600-
slots.flags |= PyTypeFlags::HAS_WEAKREF
600+
slots.flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF
601601
}
602602

603603
// Inherit SEQUENCE and MAPPING flags from base classes
@@ -612,6 +612,11 @@ impl PyType {
612612

613613
Self::inherit_readonly_slots(&mut slots, &base);
614614

615+
// Normalize: any type with HAS_WEAKREF gets MANAGED_WEAKREF
616+
if slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF) {
617+
slots.flags |= PyTypeFlags::MANAGED_WEAKREF;
618+
}
619+
615620
if let Some(qualname) = attrs.get(identifier!(ctx, __qualname__))
616621
&& !qualname.fast_isinstance(ctx.types.str_type)
617622
{
@@ -662,7 +667,7 @@ impl PyType {
662667
slots.flags |= PyTypeFlags::HAS_DICT
663668
}
664669
if base.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF) {
665-
slots.flags |= PyTypeFlags::HAS_WEAKREF
670+
slots.flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF
666671
}
667672

668673
// Inherit SEQUENCE and MAPPING flags from base class
@@ -675,6 +680,11 @@ impl PyType {
675680

676681
Self::inherit_readonly_slots(&mut slots, &base);
677682

683+
// Normalize: any type with HAS_WEAKREF gets MANAGED_WEAKREF
684+
if slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF) {
685+
slots.flags |= PyTypeFlags::MANAGED_WEAKREF;
686+
}
687+
678688
let bases = PyRwLock::new(vec![base.clone()]);
679689
let mro = base.mro_map_collect(|x| x.to_owned());
680690

@@ -1989,7 +1999,7 @@ impl Constructor for PyType {
19891999
// 2. __weakref__ is in __slots__
19902000
let may_add_weakref = !base.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF);
19912001
if (heaptype_slots.is_none() && may_add_weakref) || add_weakref {
1992-
flags |= PyTypeFlags::HAS_WEAKREF;
2002+
flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF;
19932003
}
19942004

19952005
let (slots, heaptype_ext) = {

0 commit comments

Comments
 (0)