diff --git a/crates/vm/src/builtins/int.rs b/crates/vm/src/builtins/int.rs index 9b74b66e3a7..cc42d02733a 100644 --- a/crates/vm/src/builtins/int.rs +++ b/crates/vm/src/builtins/int.rs @@ -444,7 +444,8 @@ impl PyInt { #[pymethod] fn __sizeof__(&self) -> usize { - core::mem::size_of::() + (((self.value.bits() + 7) & !7) / 8) as usize + let digits = self.value.iter_u32_digits().count().max(1); + core::mem::size_of::() + (::ITEMSIZE * digits) } #[pymethod] diff --git a/crates/vm/src/builtins/object.rs b/crates/vm/src/builtins/object.rs index 6f072542547..5d4bfe80fd8 100644 --- a/crates/vm/src/builtins/object.rs +++ b/crates/vm/src/builtins/object.rs @@ -1,4 +1,4 @@ -use super::{PyDictRef, PyList, PyStr, PyStrRef, PyType, PyTypeRef}; +use super::{PyDictRef, PyInt, PyList, PyStr, PyStrRef, PyType, PyTypeRef}; use crate::common::hash::PyHash; use crate::types::PyTypeFlags; use crate::{ @@ -526,6 +526,13 @@ impl PyBaseObject { #[pymethod] fn __sizeof__(zelf: PyObjectRef) -> usize { + if let Some(int) = zelf.downcast_ref::() { + let digits = int.as_bigint().iter_u32_digits().count(); + let basicsize = zelf.class().slots.basicsize; + let itemsize = zelf.class().slots.itemsize; + return basicsize + itemsize * digits; + } + zelf.class().slots.basicsize } } diff --git a/extra_tests/snippets/builtin_object.py b/extra_tests/snippets/builtin_object.py index 64486e1673e..98c78c679fe 100644 --- a/extra_tests/snippets/builtin_object.py +++ b/extra_tests/snippets/builtin_object.py @@ -32,3 +32,6 @@ class MyObject: 0: "ab", } assert "ab ab" == "{k[0]} {vv}".format(k=d, vv=d[0]) + +big = 1223456789812391231291231231231212312312312312312312321321321321312312321123123123199129391239219394923912949213021949302194942130123949203912430392402139210492139123012940219394923942395943856228368385 +assert object.__sizeof__(big) >= big.__sizeof__()