⚡ Sangsakala Proxy 🏠 Home
Skip to content

Commit ea53d24

Browse files
capi: preserve tp_new trampoline on C slot install
Assisted-by: OpenCode:github-copilot/gpt-5.3-codex
1 parent 05ad852 commit ea53d24

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

‎crates/vm/src/builtins/type.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,6 +1666,7 @@ impl PyType {
16661666
self.name()
16671667
))
16681668
})?;
1669+
let previous_new = self.slots.new.load();
16691670
let mut owned = ext.c_slots.write();
16701671
if owned.is_some() {
16711672
return Err(vm.new_type_error(format!("type '{}' already has C slots", self.name())));
@@ -1675,6 +1676,10 @@ impl PyType {
16751676
self.slots.c_slots.store(Some(table.as_ptr()));
16761677
if has_new {
16771678
self.slots.new.store(Some(crate::types::c_new_trampoline));
1679+
} else if previous_new.is_some_and(crate::types::c_slots::is_c_trampoline) {
1680+
// Installing a table that omits tp_new must not clear an existing
1681+
// C tp_new trampoline this type already uses.
1682+
self.slots.new.store(previous_new);
16781683
}
16791684
*owned = Some(table);
16801685
Ok(())

0 commit comments

Comments
 (0)