diff --git a/crates/vm/src/builtins/object.rs b/crates/vm/src/builtins/object.rs index ca208790f4..879c287fdb 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::{ @@ -577,6 +577,11 @@ impl PyBaseObject { #[pymethod] fn __sizeof__(zelf: PyObjectRef) -> usize { + if let Some(int) = zelf.downcast_ref::() { + let bits = int.as_bigint().bits(); + return std::mem::size_of::() + (((bits + 7) & !7) / 8) as usize; + } + zelf.class().slots.basicsize } } diff --git a/extra_tests/snippets/builtin_object.py b/extra_tests/snippets/builtin_object.py index 64486e1673..98c78c679f 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__()