summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Python/frame.c
diff options
context:
space:
mode:
authorAlexSm <[email protected]>2024-03-05 10:40:59 +0100
committerGitHub <[email protected]>2024-03-05 12:40:59 +0300
commit1ac13c847b5358faba44dbb638a828e24369467b (patch)
tree07672b4dd3604ad3dee540a02c6494cb7d10dc3d /contrib/tools/python3/src/Python/frame.c
parentffcca3e7f7958ddc6487b91d3df8c01054bd0638 (diff)
Library import 16 (#2433)
Co-authored-by: robot-piglet <[email protected]> Co-authored-by: deshevoy <[email protected]> Co-authored-by: robot-contrib <[email protected]> Co-authored-by: thegeorg <[email protected]> Co-authored-by: robot-ya-builder <[email protected]> Co-authored-by: svidyuk <[email protected]> Co-authored-by: shadchin <[email protected]> Co-authored-by: robot-ratatosk <[email protected]> Co-authored-by: innokentii <[email protected]> Co-authored-by: arkady-e1ppa <[email protected]> Co-authored-by: snermolaev <[email protected]> Co-authored-by: dimdim11 <[email protected]> Co-authored-by: kickbutt <[email protected]> Co-authored-by: abdullinsaid <[email protected]> Co-authored-by: korsunandrei <[email protected]> Co-authored-by: petrk <[email protected]> Co-authored-by: miroslav2 <[email protected]> Co-authored-by: serjflint <[email protected]> Co-authored-by: akhropov <[email protected]> Co-authored-by: prettyboy <[email protected]> Co-authored-by: ilikepugs <[email protected]> Co-authored-by: hiddenpath <[email protected]> Co-authored-by: mikhnenko <[email protected]> Co-authored-by: spreis <[email protected]> Co-authored-by: andreyshspb <[email protected]> Co-authored-by: dimaandreev <[email protected]> Co-authored-by: rashid <[email protected]> Co-authored-by: robot-ydb-importer <[email protected]> Co-authored-by: r-vetrov <[email protected]> Co-authored-by: ypodlesov <[email protected]> Co-authored-by: zaverden <[email protected]> Co-authored-by: vpozdyayev <[email protected]> Co-authored-by: robot-cozmo <[email protected]> Co-authored-by: v-korovin <[email protected]> Co-authored-by: arikon <[email protected]> Co-authored-by: khoden <[email protected]> Co-authored-by: psydmm <[email protected]> Co-authored-by: robot-javacom <[email protected]> Co-authored-by: dtorilov <[email protected]> Co-authored-by: sennikovmv <[email protected]> Co-authored-by: hcpp <[email protected]>
Diffstat (limited to 'contrib/tools/python3/src/Python/frame.c')
-rw-r--r--contrib/tools/python3/src/Python/frame.c168
1 files changed, 0 insertions, 168 deletions
diff --git a/contrib/tools/python3/src/Python/frame.c b/contrib/tools/python3/src/Python/frame.c
deleted file mode 100644
index b84fd9b6a93..00000000000
--- a/contrib/tools/python3/src/Python/frame.c
+++ /dev/null
@@ -1,168 +0,0 @@
-
-#define _PY_INTERPRETER
-
-#include "Python.h"
-#include "frameobject.h"
-#include "pycore_code.h" // stats
-#include "pycore_frame.h"
-#include "pycore_object.h" // _PyObject_GC_UNTRACK()
-#include "opcode.h"
-
-int
-_PyFrame_Traverse(_PyInterpreterFrame *frame, visitproc visit, void *arg)
-{
- Py_VISIT(frame->frame_obj);
- Py_VISIT(frame->f_locals);
- Py_VISIT(frame->f_funcobj);
- Py_VISIT(frame->f_code);
- /* locals */
- PyObject **locals = _PyFrame_GetLocalsArray(frame);
- int i = 0;
- /* locals and stack */
- for (; i <frame->stacktop; i++) {
- Py_VISIT(locals[i]);
- }
- return 0;
-}
-
-PyFrameObject *
-_PyFrame_MakeAndSetFrameObject(_PyInterpreterFrame *frame)
-{
- assert(frame->frame_obj == NULL);
- PyObject *exc = PyErr_GetRaisedException();
-
- PyFrameObject *f = _PyFrame_New_NoTrack(frame->f_code);
- if (f == NULL) {
- Py_XDECREF(exc);
- return NULL;
- }
- 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
- // *also* created the same frame... while we were in the middle of
- // creating it! See test_sneaky_frame_object in test_frame.py for a
- // concrete example.
- //
- // Regardless, just throw f away and use that frame instead, since it's
- // already been exposed to user code. It's actually a bit tricky to do
- // this, since we aren't backed by a real _PyInterpreterFrame anymore.
- // Just pretend that we have an owned, cleared frame so frame_dealloc
- // doesn't make the situation worse:
- f->f_frame = (_PyInterpreterFrame *)f->_f_frame_data;
- f->f_frame->owner = FRAME_CLEARED;
- f->f_frame->frame_obj = f;
- Py_DECREF(f);
- return frame->frame_obj;
- }
- assert(frame->owner != FRAME_OWNED_BY_FRAME_OBJECT);
- assert(frame->owner != FRAME_CLEARED);
- f->f_frame = frame;
- frame->frame_obj = f;
- return f;
-}
-
-void
-_PyFrame_Copy(_PyInterpreterFrame *src, _PyInterpreterFrame *dest)
-{
- assert(src->stacktop >= src->f_code->co_nlocalsplus);
- Py_ssize_t size = ((char*)&src->localsplus[src->stacktop]) - (char *)src;
- memcpy(dest, src, size);
- // Don't leave a dangling pointer to the old frame when creating generators
- // and coroutines:
- dest->previous = NULL;
-}
-
-
-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;
- frame->owner = FRAME_OWNED_BY_FRAME_OBJECT;
- if (_PyFrame_IsIncomplete(frame)) {
- // This may be a newly-created generator or coroutine frame. Since it's
- // dead anyways, just pretend that the first RESUME ran:
- PyCodeObject *code = frame->f_code;
- frame->prev_instr = _PyCode_CODE(code) + code->_co_firsttraceable;
- }
- assert(!_PyFrame_IsIncomplete(frame));
- assert(f->f_back == NULL);
- _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) {
- /* Memory error here. */
- assert(PyErr_ExceptionMatches(PyExc_MemoryError));
- /* Nothing we can do about it */
- PyErr_Clear();
- }
- else {
- f->f_back = (PyFrameObject *)Py_NewRef(back);
- }
- }
- if (!_PyObject_GC_IS_TRACKED((PyObject *)f)) {
- _PyObject_GC_TRACK((PyObject *)f);
- }
-}
-
-void
-_PyFrame_ClearExceptCode(_PyInterpreterFrame *frame)
-{
- /* It is the responsibility of the owning generator/coroutine
- * to have cleared the enclosing generator, if any. */
- assert(frame->owner != FRAME_OWNED_BY_GENERATOR ||
- _PyFrame_GetGenerator(frame)->gi_frame_state == FRAME_CLEARED);
- // GH-99729: Clearing this frame can expose the stack (via finalizers). It's
- // crucial that this frame has been unlinked, and is no longer visible:
- assert(_PyThreadState_GET()->cframe->current_frame != frame);
- if (frame->frame_obj) {
- PyFrameObject *f = frame->frame_obj;
- frame->frame_obj = NULL;
- if (Py_REFCNT(f) > 1) {
- take_ownership(f, frame);
- Py_DECREF(f);
- return;
- }
- Py_DECREF(f);
- }
- assert(frame->stacktop >= 0);
- for (int i = 0; i < frame->stacktop; i++) {
- Py_XDECREF(frame->localsplus[i]);
- }
- Py_XDECREF(frame->frame_obj);
- Py_XDECREF(frame->f_locals);
- Py_DECREF(frame->f_funcobj);
-}
-
-/* Unstable API functions */
-
-PyObject *
-PyUnstable_InterpreterFrame_GetCode(struct _PyInterpreterFrame *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
-PyUnstable_InterpreterFrame_GetLine(_PyInterpreterFrame *frame)
-{
- int addr = _PyInterpreterFrame_LASTI(frame) * sizeof(_Py_CODEUNIT);
- return PyCode_Addr2Line(frame->f_code, addr);
-}