aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Python/frame.c
diff options
context:
space:
mode:
authorshadchin <shadchin@yandex-team.com>2024-02-12 07:53:52 +0300
committershadchin <shadchin@yandex-team.com>2024-02-12 08:07:36 +0300
commitce1b7ca3171f9158180640c6a02a74b4afffedea (patch)
treee47c1e8391b1b0128262c1e9b1e6ed4c8fff2348 /contrib/tools/python3/src/Python/frame.c
parent57350d96f030db90f220ce50ee591d5c5d403df7 (diff)
downloadydb-ce1b7ca3171f9158180640c6a02a74b4afffedea.tar.gz
Update Python from 3.11.8 to 3.12.2
Diffstat (limited to 'contrib/tools/python3/src/Python/frame.c')
-rw-r--r--contrib/tools/python3/src/Python/frame.c56
1 files changed, 27 insertions, 29 deletions
diff --git a/contrib/tools/python3/src/Python/frame.c b/contrib/tools/python3/src/Python/frame.c
index 3ea3a2ced4..b84fd9b6a9 100644
--- a/contrib/tools/python3/src/Python/frame.c
+++ b/contrib/tools/python3/src/Python/frame.c
@@ -1,4 +1,6 @@
+#define _PY_INTERPRETER
+
#include "Python.h"
#include "frameobject.h"
#include "pycore_code.h" // stats
@@ -11,7 +13,7 @@ _PyFrame_Traverse(_PyInterpreterFrame *frame, visitproc visit, void *arg)
{
Py_VISIT(frame->frame_obj);
Py_VISIT(frame->f_locals);
- Py_VISIT(frame->f_func);
+ Py_VISIT(frame->f_funcobj);
Py_VISIT(frame->f_code);
/* locals */
PyObject **locals = _PyFrame_GetLocalsArray(frame);
@@ -27,17 +29,14 @@ PyFrameObject *
_PyFrame_MakeAndSetFrameObject(_PyInterpreterFrame *frame)
{
assert(frame->frame_obj == NULL);
- PyObject *error_type, *error_value, *error_traceback;
- PyErr_Fetch(&error_type, &error_value, &error_traceback);
+ PyObject *exc = PyErr_GetRaisedException();
PyFrameObject *f = _PyFrame_New_NoTrack(frame->f_code);
if (f == NULL) {
- Py_XDECREF(error_type);
- Py_XDECREF(error_value);
- Py_XDECREF(error_traceback);
+ Py_XDECREF(exc);
return NULL;
}
- PyErr_Restore(error_type, error_value, error_traceback);
+ PyErr_SetRaisedException(exc);
if (frame->frame_obj) {
// GH-97002: How did we get into this horrible situation? Most likely,
// allocating f triggered a GC collection, which ran some code that
@@ -78,9 +77,11 @@ _PyFrame_Copy(_PyInterpreterFrame *src, _PyInterpreterFrame *dest)
static void
take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
{
+ assert(frame->owner != FRAME_OWNED_BY_CSTACK);
assert(frame->owner != FRAME_OWNED_BY_FRAME_OBJECT);
assert(frame->owner != FRAME_CLEARED);
Py_ssize_t size = ((char*)&frame->localsplus[frame->stacktop]) - (char *)frame;
+ Py_INCREF(frame->f_code);
memcpy((_PyInterpreterFrame *)f->_f_frame_data, frame, size);
frame = (_PyInterpreterFrame *)f->_f_frame_data;
f->f_frame = frame;
@@ -93,11 +94,10 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
}
assert(!_PyFrame_IsIncomplete(frame));
assert(f->f_back == NULL);
- _PyInterpreterFrame *prev = frame->previous;
- while (prev && _PyFrame_IsIncomplete(prev)) {
- prev = prev->previous;
- }
+ _PyInterpreterFrame *prev = _PyFrame_GetFirstComplete(frame->previous);
+ frame->previous = NULL;
if (prev) {
+ assert(prev->owner != FRAME_OWNED_BY_CSTACK);
/* Link PyFrameObjects.f_back and remove link through _PyInterpreterFrame.previous */
PyFrameObject *back = _PyFrame_GetFrameObject(prev);
if (back == NULL) {
@@ -109,7 +109,6 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
else {
f->f_back = (PyFrameObject *)Py_NewRef(back);
}
- frame->previous = NULL;
}
if (!_PyObject_GC_IS_TRACKED((PyObject *)f)) {
_PyObject_GC_TRACK((PyObject *)f);
@@ -117,7 +116,7 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
}
void
-_PyFrame_Clear(_PyInterpreterFrame *frame)
+_PyFrame_ClearExceptCode(_PyInterpreterFrame *frame)
{
/* It is the responsibility of the owning generator/coroutine
* to have cleared the enclosing generator, if any. */
@@ -142,28 +141,27 @@ _PyFrame_Clear(_PyInterpreterFrame *frame)
}
Py_XDECREF(frame->frame_obj);
Py_XDECREF(frame->f_locals);
- Py_DECREF(frame->f_func);
- Py_DECREF(frame->f_code);
+ Py_DECREF(frame->f_funcobj);
}
-/* Consumes reference to func */
-_PyInterpreterFrame *
-_PyFrame_Push(PyThreadState *tstate, PyFunctionObject *func)
+/* Unstable API functions */
+
+PyObject *
+PyUnstable_InterpreterFrame_GetCode(struct _PyInterpreterFrame *frame)
{
- PyCodeObject *code = (PyCodeObject *)func->func_code;
- size_t size = code->co_nlocalsplus + code->co_stacksize + FRAME_SPECIALS_SIZE;
- CALL_STAT_INC(frames_pushed);
- _PyInterpreterFrame *new_frame = _PyThreadState_BumpFramePointer(tstate, size);
- if (new_frame == NULL) {
- Py_DECREF(func);
- return NULL;
- }
- _PyFrame_InitializeSpecials(new_frame, func, NULL, code->co_nlocalsplus);
- return new_frame;
+ PyObject *code = (PyObject *)frame->f_code;
+ Py_INCREF(code);
+ return code;
+}
+
+int
+PyUnstable_InterpreterFrame_GetLasti(struct _PyInterpreterFrame *frame)
+{
+ return _PyInterpreterFrame_LASTI(frame) * sizeof(_Py_CODEUNIT);
}
int
-_PyInterpreterFrame_GetLine(_PyInterpreterFrame *frame)
+PyUnstable_InterpreterFrame_GetLine(_PyInterpreterFrame *frame)
{
int addr = _PyInterpreterFrame_LASTI(frame) * sizeof(_Py_CODEUNIT);
return PyCode_Addr2Line(frame->f_code, addr);