Skip to content

Commit 43df2a2

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 45d8129 commit 43df2a2

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
@@ -562,12 +562,12 @@ impl PyType {
562562
slots.flags |= PyTypeFlags::HAS_DICT
563563
}
564564

565-
// Inherit HAS_WEAKREF from any base in MRO that has it
565+
// Inherit HAS_WEAKREF/MANAGED_WEAKREF from any base in MRO that has it
566566
if mro
567567
.iter()
568568
.any(|b| b.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF))
569569
{
570-
slots.flags |= PyTypeFlags::HAS_WEAKREF
570+
slots.flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF
571571
}
572572

573573
// Inherit SEQUENCE and MAPPING flags from base classes
@@ -632,7 +632,7 @@ impl PyType {
632632
slots.flags |= PyTypeFlags::HAS_DICT
633633
}
634634
if base.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF) {
635-
slots.flags |= PyTypeFlags::HAS_WEAKREF
635+
slots.flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF
636636
}
637637

638638
// Inherit SEQUENCE and MAPPING flags from base class
@@ -1867,7 +1867,7 @@ impl Constructor for PyType {
18671867
// 2. __weakref__ is in __slots__
18681868
let may_add_weakref = !base.slots.flags.has_feature(PyTypeFlags::HAS_WEAKREF);
18691869
if (heaptype_slots.is_none() && may_add_weakref) || add_weakref {
1870-
flags |= PyTypeFlags::HAS_WEAKREF;
1870+
flags |= PyTypeFlags::HAS_WEAKREF | PyTypeFlags::MANAGED_WEAKREF;
18711871
}
18721872

18731873
let (slots, heaptype_ext) = {

0 commit comments

Comments
 (0)