pytorch/torch/csrc/dynamo/cpython_defs.h
William Wen 812bae09be [dynamo] fix 3.11+ refleak (#124238)
Fixes https://github.com/pytorch/pytorch/issues/119607 for 3.11+.

In 3.11+, `_PyFrame_FastToLocalsWithError` could implicity run `COPY_FREE_VARS` on the original frame, leading to double incref's since the dynamo shadow frame can rerun `COPY_FREE_VARS`. So the solution is to skip the first `COPY_FREE_VARS` instruction in the shadow frame if it was already executed in the original frame.

Also move the location for clearing the original frame in 3.12 to handle error cases more thoroughly.

Pull Request resolved: https://github.com/pytorch/pytorch/pull/124238
Approved by: https://github.com/jansel
2024-04-18 03:02:29 +00:00

45 lines
1.0 KiB
C

#pragma once
#include <torch/csrc/utils/python_compat.h>
// Functions that need to be copied from the CPython source
// should go in cpython_defs.c. Copying is required when, e.g.,
// we need to call internal CPython functions that are not exposed.
#if IS_PYTHON_3_11_PLUS
#include <internal/pycore_frame.h>
int THP_PyFrame_FastToLocalsWithError(
_PyInterpreterFrame* frame,
int* free_vars_copied);
PyFunctionObject* _PyFunction_CopyWithNewCode(
PyFunctionObject* o,
PyCodeObject* code);
void THP_PyFrame_Clear(_PyInterpreterFrame* frame);
_PyInterpreterFrame* THP_PyThreadState_BumpFramePointerSlow(
PyThreadState* tstate,
size_t size);
void THP_PyThreadState_PopFrame(
PyThreadState* tstate,
_PyInterpreterFrame* frame);
#endif
// pointers to _PyOpcode_Caches for C++
#ifdef __cplusplus
extern "C" const uint8_t* THP_PyOpcode_Caches;
extern "C" const int THP_PyOpcode_Caches_size;
#else
extern const uint8_t* THP_PyOpcode_Caches;
extern const int THP_PyOpcode_Caches_size;
#endif