#include #include #include #include #include #include #include #include namespace torch { namespace lazy { std::optional GetPythonFrameTop() { if (!Py_IsInitialized()) { return std::nullopt; } pybind11::gil_scoped_acquire gil; PyFrameObject* frame = PyEval_GetFrame(); if (frame == nullptr) { return std::nullopt; } SourceLocation loc; auto code = THPCodeObjectPtr(PyFrame_GetCode(frame)); loc.line = PyFrame_GetLineNumber(frame); loc.file = THPUtils_unpackString(code->co_filename); loc.function = THPUtils_unpackString(code->co_name); return loc; } std::vector GetPythonFrames() { std::vector frames; if (Py_IsInitialized()) { pybind11::gil_scoped_acquire gil; PyFrameObject* frame = PyEval_GetFrame(); if (frame != nullptr) { Py_INCREF(frame); } while (frame != nullptr) { SourceLocation loc; auto code = THPCodeObjectPtr(PyFrame_GetCode(frame)); loc.line = PyFrame_GetLineNumber(frame); loc.file = THPUtils_unpackString(code->co_filename); loc.function = THPUtils_unpackString(code->co_name); frames.push_back(std::move(loc)); auto new_frame = PyFrame_GetBack(frame); Py_DECREF(frame); frame = new_frame; } } return frames; } } // namespace lazy } // namespace torch