Skip to content

Commit 28cc5f5

Browse files
committed
Separate WeakRefList from ObjExt as independent prefix
Split the monolithic ObjExt prefix into two independent prefixes: - ObjExt: dict + member slots (allocated when HAS_DICT or member_count > 0) - WeakRefList: weakref support (allocated when HAS_WEAKREF) Layout: [ObjExt?][WeakRefList?][PyInner<T>] WeakRefList is always at a fixed offset (WEAKREF_OFFSET) before PyInner. ObjExt offset varies based on whether WeakRefList is also present. Add MANAGED_WEAKREF flag (1 << 3) matching CPython's Py_TPFLAGS_MANAGED_WEAKREF.
1 parent 46abff6 commit 28cc5f5

File tree

4 files changed

+159
-65
lines changed

4 files changed

+159
-65
lines changed

crates/vm/src/builtins/type.rs

Lines changed: 4 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
@@ -662,7 +662,7 @@ impl PyType {
662662
slots.flags |= PyTypeFlags::HAS_DICT
663663
}
664664
if base.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF) {
665-
slots.flags |= PyTypeFlags::HAS_WEAKREF
665+
slots.flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF
666666
}
667667

668668
// Inherit SEQUENCE and MAPPING flags from base class
@@ -1989,7 +1989,7 @@ impl Constructor for PyType {
19891989
// 2. __weakref__ is in __slots__
19901990
let may_add_weakref = !base.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF);
19911991
if (heaptype_slots.is_none() && may_add_weakref) || add_weakref {
1992-
flags |= PyTypeFlags::HAS_WEAKREF;
1992+
flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF;
19931993
}
19941994

19951995
let (slots, heaptype_ext) = {

0 commit comments

Comments
 (0)