#include "pycore_fileutils.h" // _Py_write_noraise()
#include "pycore_gc.h" // PyGC_Head
#include "pycore_hashtable.h" // _Py_hashtable_t
+#include "pycore_object.h" // _PyType_PreHeaderSize
#include "pycore_pymem.h" // _Py_tracemalloc_config
#include "pycore_runtime.h" // _Py_ID()
#include "pycore_traceback.h"
/*[clinic end generated code: output=41ee0553a658b0aa input=29495f1b21c53212]*/
{
PyTypeObject *type;
- void *ptr;
traceback_t *traceback;
type = Py_TYPE(obj);
- if (PyType_IS_GC(type)) {
- ptr = (void *)((char *)obj - sizeof(PyGC_Head));
- }
- else {
- ptr = (void *)obj;
- }
+ const size_t presize = _PyType_PreHeaderSize(type);
+ uintptr_t ptr = (uintptr_t)((char *)obj - presize);
- traceback = tracemalloc_get_traceback(DEFAULT_DOMAIN, (uintptr_t)ptr);
- if (traceback == NULL)
+ traceback = tracemalloc_get_traceback(DEFAULT_DOMAIN, ptr);
+ if (traceback == NULL) {
Py_RETURN_NONE;
+ }
return traceback_to_pyobject(traceback, NULL);
}
return -1;
}
- uintptr_t ptr;
PyTypeObject *type = Py_TYPE(op);
- if (PyType_IS_GC(type)) {
- ptr = (uintptr_t)((char *)op - sizeof(PyGC_Head));
- }
- else {
- ptr = (uintptr_t)op;
- }
+ const size_t presize = _PyType_PreHeaderSize(type);
+ uintptr_t ptr = (uintptr_t)((char *)op - presize);
int res = -1;
/* Display the traceback where the object has been allocated.
Do it before dumping repr(obj), since repr() is more likely
to crash than dumping the traceback. */
- void *ptr;
PyTypeObject *type = Py_TYPE(obj);
- if (_PyType_IS_GC(type)) {
- ptr = (void *)((char *)obj - sizeof(PyGC_Head));
- }
- else {
- ptr = (void *)obj;
- }
+ const size_t presize = _PyType_PreHeaderSize(type);
+ void *ptr = (void *)((char *)obj - presize);
_PyMem_DumpTraceback(fileno(stderr), ptr);
/* This might succeed or fail, but we're about to abort, so at least