diff --git a/src/types/typeobject.rs b/src/types/typeobject.rs index da2ac33034d..9ce5537aaf0 100644 --- a/src/types/typeobject.rs +++ b/src/types/typeobject.rs @@ -57,9 +57,15 @@ impl PyType { pub fn name(&self) -> PyResult> { #[cfg(not(any(Py_LIMITED_API, PyPy)))] { - let name = unsafe { CStr::from_ptr((*self.as_type_ptr()).tp_name) }.to_str()?; + let ptr = self.as_type_ptr(); - Ok(Cow::Borrowed(name)) + let name = unsafe { CStr::from_ptr((*ptr).tp_name) }.to_str()?; + + if unsafe { ffi::PyType_HasFeature(ptr, ffi::Py_TPFLAGS_IMMUTABLETYPE) } != 0 { + Ok(Cow::Borrowed(name)) + } else { + Ok(Cow::Owned(name.to_owned())) + } } #[cfg(any(Py_LIMITED_API, PyPy))]