diff --git a/derive/src/pyclass.rs b/derive/src/pyclass.rs index e2f656ed8b..6cd2958914 100644 --- a/derive/src/pyclass.rs +++ b/derive/src/pyclass.rs @@ -210,6 +210,7 @@ fn generate_class_def( Some(v) => quote!(Some(#v) ), None => quote!(None), }; + let basicsize = quote!(std::mem::size_of::<#ident>()); let is_pystruct = attrs.iter().any(|attr| { path_eq(&attr.path, "derive") && if let Ok(Meta::List(l)) = attr.parse_meta() { @@ -259,6 +260,7 @@ fn generate_class_def( const MODULE_NAME: Option<&'static str> = #module_name; const TP_NAME: &'static str = #module_class_name; const DOC: Option<&'static str> = #doc; + const BASICSIZE: usize = #basicsize; } impl ::rustpython_vm::class::StaticType for #ident { diff --git a/vm/src/builtins/object.rs b/vm/src/builtins/object.rs index 908ae27e6d..4d1173e1b4 100644 --- a/vm/src/builtins/object.rs +++ b/vm/src/builtins/object.rs @@ -326,6 +326,11 @@ impl PyBaseObject { fn hash(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { Self::slot_hash(&zelf, vm) } + + #[pymethod(magic)] + fn sizeof(zelf: PyObjectRef) -> usize { + zelf.class().slots.basicsize + } } pub fn object_get_dict(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult { diff --git a/vm/src/class.rs b/vm/src/class.rs index a96e5108d2..c6e057929c 100644 --- a/vm/src/class.rs +++ b/vm/src/class.rs @@ -58,6 +58,7 @@ pub trait PyClassDef { const MODULE_NAME: Option<&'static str>; const TP_NAME: &'static str; const DOC: Option<&'static str> = None; + const BASICSIZE: usize; } impl PyClassDef for PyRef @@ -68,6 +69,7 @@ where const MODULE_NAME: Option<&'static str> = T::MODULE_NAME; const TP_NAME: &'static str = T::TP_NAME; const DOC: Option<&'static str> = T::DOC; + const BASICSIZE: usize = T::BASICSIZE; } pub trait PyClassImpl: PyClassDef { @@ -125,6 +127,7 @@ pub trait PyClassImpl: PyClassDef { let mut slots = PyTypeSlots { flags: Self::TP_FLAGS, name: PyRwLock::new(Some(Self::TP_NAME.to_owned())), + basicsize: Self::BASICSIZE, doc: Self::DOC, ..Default::default() }; diff --git a/vm/src/types/slot.rs b/vm/src/types/slot.rs index 5d29231be4..449b0fc52e 100644 --- a/vm/src/types/slot.rs +++ b/vm/src/types/slot.rs @@ -23,7 +23,9 @@ use std::{ #[non_exhaustive] pub struct PyTypeSlots { pub name: PyRwLock>, // tp_name, not class name - // tp_basicsize, tp_itemsize + + pub basicsize: usize, + // tp_itemsize // Methods to implement standard operations