From e4d0a58980906e3ec3246bb759d4fd1379a89266 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Wed, 10 Dec 2025 21:05:02 +0900 Subject: [PATCH] validate_downcast --- crates/vm/src/builtins/builtin_func.rs | 8 +------- crates/vm/src/builtins/str.rs | 10 ++++------ crates/vm/src/object/payload.rs | 7 ++++++- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/crates/vm/src/builtins/builtin_func.rs b/crates/vm/src/builtins/builtin_func.rs index 8c160c2eb4b..d1ce107e374 100644 --- a/crates/vm/src/builtins/builtin_func.rs +++ b/crates/vm/src/builtins/builtin_func.rs @@ -148,7 +148,7 @@ impl Representable for PyNativeFunction { impl Unconstructible for PyNativeFunction {} // `PyCMethodObject` in CPython -#[pyclass(name = "builtin_method", module = false, base = PyNativeFunction)] +#[pyclass(name = "builtin_method", module = false, base = PyNativeFunction, ctx = "builtin_method_type")] pub struct PyNativeMethod { pub(crate) func: PyNativeFunction, pub(crate) class: &'static Py, // TODO: the actual life is &'self @@ -189,12 +189,6 @@ impl PyNativeMethod { } } -impl PyPayload for PyNativeMethod { - fn class(ctx: &Context) -> &'static Py { - ctx.types.builtin_method_type - } -} - impl fmt::Debug for PyNativeMethod { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( diff --git a/crates/vm/src/builtins/str.rs b/crates/vm/src/builtins/str.rs index 80da626f318..9fa1472c26e 100644 --- a/crates/vm/src/builtins/str.rs +++ b/crates/vm/src/builtins/str.rs @@ -1932,12 +1932,10 @@ impl PyPayload for PyUtf8Str { std::any::TypeId::of::() } - fn downcastable_from(obj: &PyObject) -> bool { - obj.typeid() == Self::payload_type_id() && { - // SAFETY: we know the object is a PyStr in this context - let wtf8 = unsafe { obj.downcast_unchecked_ref::() }; - wtf8.is_utf8() - } + fn validate_downcastable_from(obj: &PyObject) -> bool { + // SAFETY: we know the object is a PyStr in this context + let wtf8 = unsafe { obj.downcast_unchecked_ref::() }; + wtf8.is_utf8() } fn try_downcast_from(obj: &PyObject, vm: &VirtualMachine) -> PyResult<()> { diff --git a/crates/vm/src/object/payload.rs b/crates/vm/src/object/payload.rs index 7fc40ddba90..b2211761492 100644 --- a/crates/vm/src/object/payload.rs +++ b/crates/vm/src/object/payload.rs @@ -25,7 +25,12 @@ pub trait PyPayload: MaybeTraverse + PyThreadingConstraint + Sized + 'static { /// # Safety: this function should only be called if `payload_type_id` matches the type of `obj`. #[inline] fn downcastable_from(obj: &PyObject) -> bool { - obj.typeid() == Self::payload_type_id() + obj.typeid() == Self::payload_type_id() && Self::validate_downcastable_from(obj) + } + + #[inline] + fn validate_downcastable_from(_obj: &PyObject) -> bool { + true } fn try_downcast_from(obj: &PyObject, vm: &VirtualMachine) -> PyResult<()> {