mirror of
				https://github.com/python/cpython.git
				synced 2025-11-01 06:01:29 +00:00 
			
		
		
		
	gh-120834: fix type of *_iframe field in _PyGenObject_HEAD declaration (#120835)
This commit is contained in:
		
							parent
							
								
									c38e2f64d0
								
							
						
					
					
						commit
						65a12c559c
					
				
					 12 changed files with 81 additions and 79 deletions
				
			
		|  | @ -9,29 +9,7 @@ extern "C" { | ||||||
| 
 | 
 | ||||||
| /* --- Generators --------------------------------------------------------- */ | /* --- Generators --------------------------------------------------------- */ | ||||||
| 
 | 
 | ||||||
| /* _PyGenObject_HEAD defines the initial segment of generator
 | typedef struct _PyGenObject PyGenObject; | ||||||
|    and coroutine objects. */ |  | ||||||
| #define _PyGenObject_HEAD(prefix)                                           \ |  | ||||||
|     PyObject_HEAD                                                           \ |  | ||||||
|     /* List of weak reference. */                                           \ |  | ||||||
|     PyObject *prefix##_weakreflist;                                         \ |  | ||||||
|     /* Name of the generator. */                                            \ |  | ||||||
|     PyObject *prefix##_name;                                                \ |  | ||||||
|     /* Qualified name of the generator. */                                  \ |  | ||||||
|     PyObject *prefix##_qualname;                                            \ |  | ||||||
|     _PyErr_StackItem prefix##_exc_state;                                    \ |  | ||||||
|     PyObject *prefix##_origin_or_finalizer;                                 \ |  | ||||||
|     char prefix##_hooks_inited;                                             \ |  | ||||||
|     char prefix##_closed;                                                   \ |  | ||||||
|     char prefix##_running_async;                                            \ |  | ||||||
|     /* The frame */                                                         \ |  | ||||||
|     int8_t prefix##_frame_state;                                            \ |  | ||||||
|     PyObject *prefix##_iframe[1];                                           \ |  | ||||||
| 
 |  | ||||||
| typedef struct { |  | ||||||
|     /* The gi_ prefix is intended to remind of generator-iterator. */ |  | ||||||
|     _PyGenObject_HEAD(gi) |  | ||||||
| } PyGenObject; |  | ||||||
| 
 | 
 | ||||||
| PyAPI_DATA(PyTypeObject) PyGen_Type; | PyAPI_DATA(PyTypeObject) PyGen_Type; | ||||||
| 
 | 
 | ||||||
|  | @ -46,9 +24,7 @@ PyAPI_FUNC(PyCodeObject *) PyGen_GetCode(PyGenObject *gen); | ||||||
| 
 | 
 | ||||||
| /* --- PyCoroObject ------------------------------------------------------- */ | /* --- PyCoroObject ------------------------------------------------------- */ | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct _PyCoroObject PyCoroObject; | ||||||
|     _PyGenObject_HEAD(cr) |  | ||||||
| } PyCoroObject; |  | ||||||
| 
 | 
 | ||||||
| PyAPI_DATA(PyTypeObject) PyCoro_Type; | PyAPI_DATA(PyTypeObject) PyCoro_Type; | ||||||
| 
 | 
 | ||||||
|  | @ -59,9 +35,7 @@ PyAPI_FUNC(PyObject *) PyCoro_New(PyFrameObject *, | ||||||
| 
 | 
 | ||||||
| /* --- Asynchronous Generators -------------------------------------------- */ | /* --- Asynchronous Generators -------------------------------------------- */ | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct _PyAsyncGenObject PyAsyncGenObject; | ||||||
|     _PyGenObject_HEAD(ag) |  | ||||||
| } PyAsyncGenObject; |  | ||||||
| 
 | 
 | ||||||
| PyAPI_DATA(PyTypeObject) PyAsyncGen_Type; | PyAPI_DATA(PyTypeObject) PyAsyncGen_Type; | ||||||
| PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type; | PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type; | ||||||
|  | @ -73,7 +47,6 @@ PyAPI_FUNC(PyObject *) PyAsyncGen_New(PyFrameObject *, | ||||||
| 
 | 
 | ||||||
| #define PyAsyncGenASend_CheckExact(op) Py_IS_TYPE((op), &_PyAsyncGenASend_Type) | #define PyAsyncGenASend_CheckExact(op) Py_IS_TYPE((op), &_PyAsyncGenASend_Type) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| #undef _PyGenObject_HEAD | #undef _PyGenObject_HEAD | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|  |  | ||||||
|  | @ -307,14 +307,6 @@ _PyFrame_PushTrampolineUnchecked(PyThreadState *tstate, PyCodeObject *code, int | ||||||
|     return frame; |     return frame; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline |  | ||||||
| PyGenObject *_PyFrame_GetGenerator(_PyInterpreterFrame *frame) |  | ||||||
| { |  | ||||||
|     assert(frame->owner == FRAME_OWNED_BY_GENERATOR); |  | ||||||
|     size_t offset_in_gen = offsetof(PyGenObject, gi_iframe); |  | ||||||
|     return (PyGenObject *)(((char *)frame) - offset_in_gen); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| PyAPI_FUNC(_PyInterpreterFrame *) | PyAPI_FUNC(_PyInterpreterFrame *) | ||||||
| _PyEvalFramePushAndInit(PyThreadState *tstate, PyFunctionObject *func, | _PyEvalFramePushAndInit(PyThreadState *tstate, PyFunctionObject *func, | ||||||
|                         PyObject *locals, PyObject* const* args, |                         PyObject *locals, PyObject* const* args, | ||||||
|  |  | ||||||
|  | @ -8,7 +8,49 @@ extern "C" { | ||||||
| #  error "this header requires Py_BUILD_CORE define" | #  error "this header requires Py_BUILD_CORE define" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include "pycore_freelist.h" | #include "pycore_frame.h" | ||||||
|  | 
 | ||||||
|  | /* _PyGenObject_HEAD defines the initial segment of generator
 | ||||||
|  |    and coroutine objects. */ | ||||||
|  | #define _PyGenObject_HEAD(prefix)                                           \ | ||||||
|  |     PyObject_HEAD                                                           \ | ||||||
|  |     /* List of weak reference. */                                           \ | ||||||
|  |     PyObject *prefix##_weakreflist;                                         \ | ||||||
|  |     /* Name of the generator. */                                            \ | ||||||
|  |     PyObject *prefix##_name;                                                \ | ||||||
|  |     /* Qualified name of the generator. */                                  \ | ||||||
|  |     PyObject *prefix##_qualname;                                            \ | ||||||
|  |     _PyErr_StackItem prefix##_exc_state;                                    \ | ||||||
|  |     PyObject *prefix##_origin_or_finalizer;                                 \ | ||||||
|  |     char prefix##_hooks_inited;                                             \ | ||||||
|  |     char prefix##_closed;                                                   \ | ||||||
|  |     char prefix##_running_async;                                            \ | ||||||
|  |     /* The frame */                                                         \ | ||||||
|  |     int8_t prefix##_frame_state;                                            \ | ||||||
|  |     struct _PyInterpreterFrame prefix##_iframe;                             \ | ||||||
|  | 
 | ||||||
|  | struct _PyGenObject { | ||||||
|  |     /* The gi_ prefix is intended to remind of generator-iterator. */ | ||||||
|  |     _PyGenObject_HEAD(gi) | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct _PyCoroObject { | ||||||
|  |     _PyGenObject_HEAD(cr) | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct _PyAsyncGenObject { | ||||||
|  |     _PyGenObject_HEAD(ag) | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #undef _PyGenObject_HEAD | ||||||
|  | 
 | ||||||
|  | static inline | ||||||
|  | PyGenObject *_PyGen_GetGeneratorFromFrame(_PyInterpreterFrame *frame) | ||||||
|  | { | ||||||
|  |     assert(frame->owner == FRAME_OWNED_BY_GENERATOR); | ||||||
|  |     size_t offset_in_gen = offsetof(PyGenObject, gi_iframe); | ||||||
|  |     return (PyGenObject *)(((char *)frame) - offset_in_gen); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| PyAPI_FUNC(PyObject *)_PyGen_yf(PyGenObject *); | PyAPI_FUNC(PyObject *)_PyGen_yf(PyGenObject *); | ||||||
| extern void _PyGen_Finalize(PyObject *self); | extern void _PyGen_Finalize(PyObject *self); | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ extern "C" { | ||||||
| #include "pycore_floatobject.h"   // struct _Py_float_state | #include "pycore_floatobject.h"   // struct _Py_float_state | ||||||
| #include "pycore_function.h"      // FUNC_MAX_WATCHERS | #include "pycore_function.h"      // FUNC_MAX_WATCHERS | ||||||
| #include "pycore_gc.h"            // struct _gc_runtime_state | #include "pycore_gc.h"            // struct _gc_runtime_state | ||||||
| #include "pycore_genobject.h"     // struct _Py_async_gen_state | #include "pycore_genobject.h"     // _PyGen_FetchStopIterationValue | ||||||
| #include "pycore_global_objects.h"// struct _Py_interp_cached_objects | #include "pycore_global_objects.h"// struct _Py_interp_cached_objects | ||||||
| #include "pycore_import.h"        // struct _import_state | #include "pycore_import.h"        // struct _import_state | ||||||
| #include "pycore_instruments.h"   // _PY_MONITORING_EVENTS | #include "pycore_instruments.h"   // _PY_MONITORING_EVENTS | ||||||
|  |  | ||||||
|  | @ -1338,7 +1338,7 @@ static bool frame_is_suspended(PyFrameObject *frame) | ||||||
| { | { | ||||||
|     assert(!_PyFrame_IsIncomplete(frame->f_frame)); |     assert(!_PyFrame_IsIncomplete(frame->f_frame)); | ||||||
|     if (frame->f_frame->owner == FRAME_OWNED_BY_GENERATOR) { |     if (frame->f_frame->owner == FRAME_OWNED_BY_GENERATOR) { | ||||||
|         PyGenObject *gen = _PyFrame_GetGenerator(frame->f_frame); |         PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame->f_frame); | ||||||
|         return FRAME_STATE_SUSPENDED(gen->gi_frame_state); |         return FRAME_STATE_SUSPENDED(gen->gi_frame_state); | ||||||
|     } |     } | ||||||
|     return false; |     return false; | ||||||
|  | @ -1665,7 +1665,7 @@ static PyObject * | ||||||
| frame_clear(PyFrameObject *f, PyObject *Py_UNUSED(ignored)) | frame_clear(PyFrameObject *f, PyObject *Py_UNUSED(ignored)) | ||||||
| { | { | ||||||
|     if (f->f_frame->owner == FRAME_OWNED_BY_GENERATOR) { |     if (f->f_frame->owner == FRAME_OWNED_BY_GENERATOR) { | ||||||
|         PyGenObject *gen = _PyFrame_GetGenerator(f->f_frame); |         PyGenObject *gen = _PyGen_GetGeneratorFromFrame(f->f_frame); | ||||||
|         if (gen->gi_frame_state == FRAME_EXECUTING) { |         if (gen->gi_frame_state == FRAME_EXECUTING) { | ||||||
|             goto running; |             goto running; | ||||||
|         } |         } | ||||||
|  | @ -2097,7 +2097,7 @@ PyFrame_GetGenerator(PyFrameObject *frame) | ||||||
|     if (frame->f_frame->owner != FRAME_OWNED_BY_GENERATOR) { |     if (frame->f_frame->owner != FRAME_OWNED_BY_GENERATOR) { | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|     PyGenObject *gen = _PyFrame_GetGenerator(frame->f_frame); |     PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame->f_frame); | ||||||
|     return Py_NewRef(gen); |     return Py_NewRef(gen); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,8 +6,8 @@ | ||||||
| #include "pycore_call.h"          // _PyObject_CallNoArgs() | #include "pycore_call.h"          // _PyObject_CallNoArgs() | ||||||
| #include "pycore_ceval.h"         // _PyEval_EvalFrame() | #include "pycore_ceval.h"         // _PyEval_EvalFrame() | ||||||
| #include "pycore_frame.h"         // _PyInterpreterFrame | #include "pycore_frame.h"         // _PyInterpreterFrame | ||||||
|  | #include "pycore_freelist.h"      // struct _Py_async_gen_freelist | ||||||
| #include "pycore_gc.h"            // _PyGC_CLEAR_FINALIZED() | #include "pycore_gc.h"            // _PyGC_CLEAR_FINALIZED() | ||||||
| #include "pycore_genobject.h"     // struct _Py_async_gen_freelist |  | ||||||
| #include "pycore_modsupport.h"    // _PyArg_CheckPositional() | #include "pycore_modsupport.h"    // _PyArg_CheckPositional() | ||||||
| #include "pycore_object.h"        // _PyObject_GC_UNTRACK() | #include "pycore_object.h"        // _PyObject_GC_UNTRACK() | ||||||
| #include "pycore_opcode_utils.h"  // RESUME_AFTER_YIELD_FROM | #include "pycore_opcode_utils.h"  // RESUME_AFTER_YIELD_FROM | ||||||
|  | @ -30,8 +30,7 @@ static const char *ASYNC_GEN_IGNORED_EXIT_MSG = | ||||||
| /* Returns a borrowed reference */ | /* Returns a borrowed reference */ | ||||||
| static inline PyCodeObject * | static inline PyCodeObject * | ||||||
| _PyGen_GetCode(PyGenObject *gen) { | _PyGen_GetCode(PyGenObject *gen) { | ||||||
|     _PyInterpreterFrame *frame = (_PyInterpreterFrame *)(gen->gi_iframe); |     return _PyFrame_GetCode(&gen->gi_iframe); | ||||||
|     return _PyFrame_GetCode(frame); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| PyCodeObject * | PyCodeObject * | ||||||
|  | @ -48,7 +47,7 @@ gen_traverse(PyGenObject *gen, visitproc visit, void *arg) | ||||||
|     Py_VISIT(gen->gi_name); |     Py_VISIT(gen->gi_name); | ||||||
|     Py_VISIT(gen->gi_qualname); |     Py_VISIT(gen->gi_qualname); | ||||||
|     if (gen->gi_frame_state != FRAME_CLEARED) { |     if (gen->gi_frame_state != FRAME_CLEARED) { | ||||||
|         _PyInterpreterFrame *frame = (_PyInterpreterFrame *)(gen->gi_iframe); |         _PyInterpreterFrame *frame = &gen->gi_iframe; | ||||||
|         assert(frame->frame_obj == NULL || |         assert(frame->frame_obj == NULL || | ||||||
|                frame->frame_obj->f_frame->owner == FRAME_OWNED_BY_GENERATOR); |                frame->frame_obj->f_frame->owner == FRAME_OWNED_BY_GENERATOR); | ||||||
|         int err = _PyFrame_Traverse(frame, visit, arg); |         int err = _PyFrame_Traverse(frame, visit, arg); | ||||||
|  | @ -141,7 +140,7 @@ gen_dealloc(PyGenObject *gen) | ||||||
|         Py_CLEAR(((PyAsyncGenObject*)gen)->ag_origin_or_finalizer); |         Py_CLEAR(((PyAsyncGenObject*)gen)->ag_origin_or_finalizer); | ||||||
|     } |     } | ||||||
|     if (gen->gi_frame_state != FRAME_CLEARED) { |     if (gen->gi_frame_state != FRAME_CLEARED) { | ||||||
|         _PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe; |         _PyInterpreterFrame *frame = &gen->gi_iframe; | ||||||
|         gen->gi_frame_state = FRAME_CLEARED; |         gen->gi_frame_state = FRAME_CLEARED; | ||||||
|         frame->previous = NULL; |         frame->previous = NULL; | ||||||
|         _PyFrame_ClearExceptCode(frame); |         _PyFrame_ClearExceptCode(frame); | ||||||
|  | @ -163,7 +162,7 @@ gen_send_ex2(PyGenObject *gen, PyObject *arg, PyObject **presult, | ||||||
|              int exc, int closing) |              int exc, int closing) | ||||||
| { | { | ||||||
|     PyThreadState *tstate = _PyThreadState_GET(); |     PyThreadState *tstate = _PyThreadState_GET(); | ||||||
|     _PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe; |     _PyInterpreterFrame *frame = &gen->gi_iframe; | ||||||
| 
 | 
 | ||||||
|     *presult = NULL; |     *presult = NULL; | ||||||
|     if (gen->gi_frame_state == FRAME_CREATED && arg && arg != Py_None) { |     if (gen->gi_frame_state == FRAME_CREATED && arg && arg != Py_None) { | ||||||
|  | @ -342,7 +341,7 @@ PyObject * | ||||||
| _PyGen_yf(PyGenObject *gen) | _PyGen_yf(PyGenObject *gen) | ||||||
| { | { | ||||||
|     if (gen->gi_frame_state == FRAME_SUSPENDED_YIELD_FROM) { |     if (gen->gi_frame_state == FRAME_SUSPENDED_YIELD_FROM) { | ||||||
|         _PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe; |         _PyInterpreterFrame *frame = &gen->gi_iframe; | ||||||
|         assert(is_resume(frame->instr_ptr)); |         assert(is_resume(frame->instr_ptr)); | ||||||
|         assert((frame->instr_ptr->op.arg & RESUME_OPARG_LOCATION_MASK) >= RESUME_AFTER_YIELD_FROM); |         assert((frame->instr_ptr->op.arg & RESUME_OPARG_LOCATION_MASK) >= RESUME_AFTER_YIELD_FROM); | ||||||
|         return Py_NewRef(_PyFrame_StackPeek(frame)); |         return Py_NewRef(_PyFrame_StackPeek(frame)); | ||||||
|  | @ -372,7 +371,7 @@ gen_close(PyGenObject *gen, PyObject *args) | ||||||
|         gen->gi_frame_state = state; |         gen->gi_frame_state = state; | ||||||
|         Py_DECREF(yf); |         Py_DECREF(yf); | ||||||
|     } |     } | ||||||
|     _PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe; |     _PyInterpreterFrame *frame = &gen->gi_iframe; | ||||||
|     if (is_resume(frame->instr_ptr)) { |     if (is_resume(frame->instr_ptr)) { | ||||||
|         /* We can safely ignore the outermost try block
 |         /* We can safely ignore the outermost try block
 | ||||||
|          * as it is automatically generated to handle |          * as it is automatically generated to handle | ||||||
|  | @ -382,7 +381,7 @@ gen_close(PyGenObject *gen, PyObject *args) | ||||||
|             // RESUME after YIELD_VALUE and exception depth is 1
 |             // RESUME after YIELD_VALUE and exception depth is 1
 | ||||||
|             assert((oparg & RESUME_OPARG_LOCATION_MASK) != RESUME_AT_FUNC_START); |             assert((oparg & RESUME_OPARG_LOCATION_MASK) != RESUME_AT_FUNC_START); | ||||||
|             gen->gi_frame_state = FRAME_COMPLETED; |             gen->gi_frame_state = FRAME_COMPLETED; | ||||||
|             _PyFrame_ClearLocals((_PyInterpreterFrame *)gen->gi_iframe); |             _PyFrame_ClearLocals(&gen->gi_iframe); | ||||||
|             Py_RETURN_NONE; |             Py_RETURN_NONE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -431,7 +430,7 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, | ||||||
|     PyObject *yf = _PyGen_yf(gen); |     PyObject *yf = _PyGen_yf(gen); | ||||||
| 
 | 
 | ||||||
|     if (yf) { |     if (yf) { | ||||||
|         _PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe; |         _PyInterpreterFrame *frame = &gen->gi_iframe; | ||||||
|         PyObject *ret; |         PyObject *ret; | ||||||
|         int err; |         int err; | ||||||
|         if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && |         if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && | ||||||
|  | @ -739,7 +738,7 @@ _gen_getframe(PyGenObject *gen, const char *const name) | ||||||
|     if (FRAME_STATE_FINISHED(gen->gi_frame_state)) { |     if (FRAME_STATE_FINISHED(gen->gi_frame_state)) { | ||||||
|         Py_RETURN_NONE; |         Py_RETURN_NONE; | ||||||
|     } |     } | ||||||
|     return _Py_XNewRef((PyObject *)_PyFrame_GetFrameObject((_PyInterpreterFrame *)gen->gi_iframe)); |     return _Py_XNewRef((PyObject *)_PyFrame_GetFrameObject(&gen->gi_iframe)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
|  | @ -814,8 +813,7 @@ static PyAsyncMethods gen_as_async = { | ||||||
| PyTypeObject PyGen_Type = { | PyTypeObject PyGen_Type = { | ||||||
|     PyVarObject_HEAD_INIT(&PyType_Type, 0) |     PyVarObject_HEAD_INIT(&PyType_Type, 0) | ||||||
|     "generator",                                /* tp_name */ |     "generator",                                /* tp_name */ | ||||||
|     offsetof(PyGenObject, gi_iframe) + |     sizeof(PyGenObject),                        /* tp_basicsize */ | ||||||
|     offsetof(_PyInterpreterFrame, localsplus),       /* tp_basicsize */ |  | ||||||
|     sizeof(PyObject *),                         /* tp_itemsize */ |     sizeof(PyObject *),                         /* tp_itemsize */ | ||||||
|     /* methods */ |     /* methods */ | ||||||
|     (destructor)gen_dealloc,                    /* tp_dealloc */ |     (destructor)gen_dealloc,                    /* tp_dealloc */ | ||||||
|  | @ -949,7 +947,7 @@ gen_new_with_qualname(PyTypeObject *type, PyFrameObject *f, | ||||||
|     /* Copy the frame */ |     /* Copy the frame */ | ||||||
|     assert(f->f_frame->frame_obj == NULL); |     assert(f->f_frame->frame_obj == NULL); | ||||||
|     assert(f->f_frame->owner == FRAME_OWNED_BY_FRAME_OBJECT); |     assert(f->f_frame->owner == FRAME_OWNED_BY_FRAME_OBJECT); | ||||||
|     _PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe; |     _PyInterpreterFrame *frame = &gen->gi_iframe; | ||||||
|     _PyFrame_Copy((_PyInterpreterFrame *)f->_f_frame_data, frame); |     _PyFrame_Copy((_PyInterpreterFrame *)f->_f_frame_data, frame); | ||||||
|     gen->gi_frame_state = FRAME_CREATED; |     gen->gi_frame_state = FRAME_CREATED; | ||||||
|     assert(frame->frame_obj == f); |     assert(frame->frame_obj == f); | ||||||
|  | @ -1166,8 +1164,7 @@ static PyAsyncMethods coro_as_async = { | ||||||
| PyTypeObject PyCoro_Type = { | PyTypeObject PyCoro_Type = { | ||||||
|     PyVarObject_HEAD_INIT(&PyType_Type, 0) |     PyVarObject_HEAD_INIT(&PyType_Type, 0) | ||||||
|     "coroutine",                                /* tp_name */ |     "coroutine",                                /* tp_name */ | ||||||
|     offsetof(PyCoroObject, cr_iframe) + |     sizeof(PyCoroObject),                       /* tp_basicsize */ | ||||||
|     offsetof(_PyInterpreterFrame, localsplus),       /* tp_basicsize */ |  | ||||||
|     sizeof(PyObject *),                         /* tp_itemsize */ |     sizeof(PyObject *),                         /* tp_itemsize */ | ||||||
|     /* methods */ |     /* methods */ | ||||||
|     (destructor)gen_dealloc,                    /* tp_dealloc */ |     (destructor)gen_dealloc,                    /* tp_dealloc */ | ||||||
|  | @ -1582,8 +1579,7 @@ static PyAsyncMethods async_gen_as_async = { | ||||||
| PyTypeObject PyAsyncGen_Type = { | PyTypeObject PyAsyncGen_Type = { | ||||||
|     PyVarObject_HEAD_INIT(&PyType_Type, 0) |     PyVarObject_HEAD_INIT(&PyType_Type, 0) | ||||||
|     "async_generator",                          /* tp_name */ |     "async_generator",                          /* tp_name */ | ||||||
|     offsetof(PyAsyncGenObject, ag_iframe) + |     sizeof(PyAsyncGenObject),                   /* tp_basicsize */ | ||||||
|     offsetof(_PyInterpreterFrame, localsplus),       /* tp_basicsize */ |  | ||||||
|     sizeof(PyObject *),                         /* tp_itemsize */ |     sizeof(PyObject *),                         /* tp_itemsize */ | ||||||
|     /* methods */ |     /* methods */ | ||||||
|     (destructor)gen_dealloc,                    /* tp_dealloc */ |     (destructor)gen_dealloc,                    /* tp_dealloc */ | ||||||
|  |  | ||||||
|  | @ -1015,7 +1015,7 @@ dummy_func( | ||||||
|                 ((PyGenObject *)receiver)->gi_frame_state < FRAME_EXECUTING) |                 ((PyGenObject *)receiver)->gi_frame_state < FRAME_EXECUTING) | ||||||
|             { |             { | ||||||
|                 PyGenObject *gen = (PyGenObject *)receiver; |                 PyGenObject *gen = (PyGenObject *)receiver; | ||||||
|                 _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |                 _PyInterpreterFrame *gen_frame = &gen->gi_iframe; | ||||||
|                 STACK_SHRINK(1); |                 STACK_SHRINK(1); | ||||||
|                 _PyFrame_StackPush(gen_frame, v); |                 _PyFrame_StackPush(gen_frame, v); | ||||||
|                 gen->gi_frame_state = FRAME_EXECUTING; |                 gen->gi_frame_state = FRAME_EXECUTING; | ||||||
|  | @ -1055,7 +1055,7 @@ dummy_func( | ||||||
|             DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type); |             DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type); | ||||||
|             DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING); |             DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING); | ||||||
|             STAT_INC(SEND, hit); |             STAT_INC(SEND, hit); | ||||||
|             _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |             _PyInterpreterFrame *gen_frame = &gen->gi_iframe; | ||||||
|             STACK_SHRINK(1); |             STACK_SHRINK(1); | ||||||
|             _PyFrame_StackPush(gen_frame, v); |             _PyFrame_StackPush(gen_frame, v); | ||||||
|             gen->gi_frame_state = FRAME_EXECUTING; |             gen->gi_frame_state = FRAME_EXECUTING; | ||||||
|  | @ -1069,7 +1069,7 @@ dummy_func( | ||||||
|         inst(INSTRUMENTED_YIELD_VALUE, (retval -- unused)) { |         inst(INSTRUMENTED_YIELD_VALUE, (retval -- unused)) { | ||||||
|             assert(frame != &entry_frame); |             assert(frame != &entry_frame); | ||||||
|             frame->instr_ptr = next_instr; |             frame->instr_ptr = next_instr; | ||||||
|             PyGenObject *gen = _PyFrame_GetGenerator(frame); |             PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame); | ||||||
|             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); |             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); | ||||||
|             assert(oparg == 0 || oparg == 1); |             assert(oparg == 0 || oparg == 1); | ||||||
|             gen->gi_frame_state = FRAME_SUSPENDED + oparg; |             gen->gi_frame_state = FRAME_SUSPENDED + oparg; | ||||||
|  | @ -1099,7 +1099,7 @@ dummy_func( | ||||||
|             assert(frame != &entry_frame); |             assert(frame != &entry_frame); | ||||||
|             #endif |             #endif | ||||||
|             frame->instr_ptr++; |             frame->instr_ptr++; | ||||||
|             PyGenObject *gen = _PyFrame_GetGenerator(frame); |             PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame); | ||||||
|             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); |             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); | ||||||
|             assert(oparg == 0 || oparg == 1); |             assert(oparg == 0 || oparg == 1); | ||||||
|             gen->gi_frame_state = FRAME_SUSPENDED + oparg; |             gen->gi_frame_state = FRAME_SUSPENDED + oparg; | ||||||
|  | @ -2799,7 +2799,7 @@ dummy_func( | ||||||
|             DEOPT_IF(Py_TYPE(gen) != &PyGen_Type); |             DEOPT_IF(Py_TYPE(gen) != &PyGen_Type); | ||||||
|             DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING); |             DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING); | ||||||
|             STAT_INC(FOR_ITER, hit); |             STAT_INC(FOR_ITER, hit); | ||||||
|             gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |             gen_frame = &gen->gi_iframe; | ||||||
|             _PyFrame_StackPush(gen_frame, Py_None); |             _PyFrame_StackPush(gen_frame, Py_None); | ||||||
|             gen->gi_frame_state = FRAME_EXECUTING; |             gen->gi_frame_state = FRAME_EXECUTING; | ||||||
|             gen->gi_exc_state.previous_item = tstate->exc_info; |             gen->gi_exc_state.previous_item = tstate->exc_info; | ||||||
|  | @ -3940,7 +3940,7 @@ dummy_func( | ||||||
|             } |             } | ||||||
|             assert(EMPTY()); |             assert(EMPTY()); | ||||||
|             _PyFrame_SetStackPointer(frame, stack_pointer); |             _PyFrame_SetStackPointer(frame, stack_pointer); | ||||||
|             _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |             _PyInterpreterFrame *gen_frame = &gen->gi_iframe; | ||||||
|             frame->instr_ptr++; |             frame->instr_ptr++; | ||||||
|             _PyFrame_Copy(frame, gen_frame); |             _PyFrame_Copy(frame, gen_frame); | ||||||
|             assert(frame->frame_obj == NULL); |             assert(frame->frame_obj == NULL); | ||||||
|  |  | ||||||
|  | @ -1711,7 +1711,7 @@ static void | ||||||
| clear_gen_frame(PyThreadState *tstate, _PyInterpreterFrame * frame) | clear_gen_frame(PyThreadState *tstate, _PyInterpreterFrame * frame) | ||||||
| { | { | ||||||
|     assert(frame->owner == FRAME_OWNED_BY_GENERATOR); |     assert(frame->owner == FRAME_OWNED_BY_GENERATOR); | ||||||
|     PyGenObject *gen = _PyFrame_GetGenerator(frame); |     PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame); | ||||||
|     gen->gi_frame_state = FRAME_CLEARED; |     gen->gi_frame_state = FRAME_CLEARED; | ||||||
|     assert(tstate->exc_info == &gen->gi_exc_state); |     assert(tstate->exc_info == &gen->gi_exc_state); | ||||||
|     tstate->exc_info = gen->gi_exc_state.previous_item; |     tstate->exc_info = gen->gi_exc_state.previous_item; | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -1125,7 +1125,7 @@ | ||||||
|             assert(frame != &entry_frame); |             assert(frame != &entry_frame); | ||||||
|             #endif |             #endif | ||||||
|             frame->instr_ptr++; |             frame->instr_ptr++; | ||||||
|             PyGenObject *gen = _PyFrame_GetGenerator(frame); |             PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame); | ||||||
|             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); |             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); | ||||||
|             assert(oparg == 0 || oparg == 1); |             assert(oparg == 0 || oparg == 1); | ||||||
|             gen->gi_frame_state = FRAME_SUSPENDED + oparg; |             gen->gi_frame_state = FRAME_SUSPENDED + oparg; | ||||||
|  | @ -2871,7 +2871,7 @@ | ||||||
|                 JUMP_TO_JUMP_TARGET(); |                 JUMP_TO_JUMP_TARGET(); | ||||||
|             } |             } | ||||||
|             STAT_INC(FOR_ITER, hit); |             STAT_INC(FOR_ITER, hit); | ||||||
|             gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |             gen_frame = &gen->gi_iframe; | ||||||
|             _PyFrame_StackPush(gen_frame, Py_None); |             _PyFrame_StackPush(gen_frame, Py_None); | ||||||
|             gen->gi_frame_state = FRAME_EXECUTING; |             gen->gi_frame_state = FRAME_EXECUTING; | ||||||
|             gen->gi_exc_state.previous_item = tstate->exc_info; |             gen->gi_exc_state.previous_item = tstate->exc_info; | ||||||
|  | @ -4110,7 +4110,7 @@ | ||||||
|             } |             } | ||||||
|             assert(EMPTY()); |             assert(EMPTY()); | ||||||
|             _PyFrame_SetStackPointer(frame, stack_pointer); |             _PyFrame_SetStackPointer(frame, stack_pointer); | ||||||
|             _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |             _PyInterpreterFrame *gen_frame = &gen->gi_iframe; | ||||||
|             frame->instr_ptr++; |             frame->instr_ptr++; | ||||||
|             _PyFrame_Copy(frame, gen_frame); |             _PyFrame_Copy(frame, gen_frame); | ||||||
|             assert(frame->frame_obj == NULL); |             assert(frame->frame_obj == NULL); | ||||||
|  |  | ||||||
|  | @ -112,7 +112,7 @@ _PyFrame_ClearExceptCode(_PyInterpreterFrame *frame) | ||||||
|     /* It is the responsibility of the owning generator/coroutine
 |     /* It is the responsibility of the owning generator/coroutine
 | ||||||
|      * to have cleared the enclosing generator, if any. */ |      * to have cleared the enclosing generator, if any. */ | ||||||
|     assert(frame->owner != FRAME_OWNED_BY_GENERATOR || |     assert(frame->owner != FRAME_OWNED_BY_GENERATOR || | ||||||
|         _PyFrame_GetGenerator(frame)->gi_frame_state == FRAME_CLEARED); |         _PyGen_GetGeneratorFromFrame(frame)->gi_frame_state == FRAME_CLEARED); | ||||||
|     // GH-99729: Clearing this frame can expose the stack (via finalizers). It's
 |     // 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:
 |     // crucial that this frame has been unlinked, and is no longer visible:
 | ||||||
|     assert(_PyThreadState_GET()->current_frame != frame); |     assert(_PyThreadState_GET()->current_frame != frame); | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										12
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -2747,7 +2747,7 @@ | ||||||
|                 DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER); |                 DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER); | ||||||
|                 DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, FOR_ITER); |                 DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, FOR_ITER); | ||||||
|                 STAT_INC(FOR_ITER, hit); |                 STAT_INC(FOR_ITER, hit); | ||||||
|                 gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |                 gen_frame = &gen->gi_iframe; | ||||||
|                 _PyFrame_StackPush(gen_frame, Py_None); |                 _PyFrame_StackPush(gen_frame, Py_None); | ||||||
|                 gen->gi_frame_state = FRAME_EXECUTING; |                 gen->gi_frame_state = FRAME_EXECUTING; | ||||||
|                 gen->gi_exc_state.previous_item = tstate->exc_info; |                 gen->gi_exc_state.previous_item = tstate->exc_info; | ||||||
|  | @ -3461,7 +3461,7 @@ | ||||||
|             retval = stack_pointer[-1]; |             retval = stack_pointer[-1]; | ||||||
|             assert(frame != &entry_frame); |             assert(frame != &entry_frame); | ||||||
|             frame->instr_ptr = next_instr; |             frame->instr_ptr = next_instr; | ||||||
|             PyGenObject *gen = _PyFrame_GetGenerator(frame); |             PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame); | ||||||
|             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); |             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); | ||||||
|             assert(oparg == 0 || oparg == 1); |             assert(oparg == 0 || oparg == 1); | ||||||
|             gen->gi_frame_state = FRAME_SUSPENDED + oparg; |             gen->gi_frame_state = FRAME_SUSPENDED + oparg; | ||||||
|  | @ -5180,7 +5180,7 @@ | ||||||
|             } |             } | ||||||
|             assert(EMPTY()); |             assert(EMPTY()); | ||||||
|             _PyFrame_SetStackPointer(frame, stack_pointer); |             _PyFrame_SetStackPointer(frame, stack_pointer); | ||||||
|             _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |             _PyInterpreterFrame *gen_frame = &gen->gi_iframe; | ||||||
|             frame->instr_ptr++; |             frame->instr_ptr++; | ||||||
|             _PyFrame_Copy(frame, gen_frame); |             _PyFrame_Copy(frame, gen_frame); | ||||||
|             assert(frame->frame_obj == NULL); |             assert(frame->frame_obj == NULL); | ||||||
|  | @ -5260,7 +5260,7 @@ | ||||||
|                     ((PyGenObject *)receiver)->gi_frame_state < FRAME_EXECUTING) |                     ((PyGenObject *)receiver)->gi_frame_state < FRAME_EXECUTING) | ||||||
|                 { |                 { | ||||||
|                     PyGenObject *gen = (PyGenObject *)receiver; |                     PyGenObject *gen = (PyGenObject *)receiver; | ||||||
|                     _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |                     _PyInterpreterFrame *gen_frame = &gen->gi_iframe; | ||||||
|                     STACK_SHRINK(1); |                     STACK_SHRINK(1); | ||||||
|                     _PyFrame_StackPush(gen_frame, v); |                     _PyFrame_StackPush(gen_frame, v); | ||||||
|                     gen->gi_frame_state = FRAME_EXECUTING; |                     gen->gi_frame_state = FRAME_EXECUTING; | ||||||
|  | @ -5310,7 +5310,7 @@ | ||||||
|             DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type, SEND); |             DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type, SEND); | ||||||
|             DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, SEND); |             DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING, SEND); | ||||||
|             STAT_INC(SEND, hit); |             STAT_INC(SEND, hit); | ||||||
|             _PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe; |             _PyInterpreterFrame *gen_frame = &gen->gi_iframe; | ||||||
|             STACK_SHRINK(1); |             STACK_SHRINK(1); | ||||||
|             _PyFrame_StackPush(gen_frame, v); |             _PyFrame_StackPush(gen_frame, v); | ||||||
|             gen->gi_frame_state = FRAME_EXECUTING; |             gen->gi_frame_state = FRAME_EXECUTING; | ||||||
|  | @ -6198,7 +6198,7 @@ | ||||||
|             assert(frame != &entry_frame); |             assert(frame != &entry_frame); | ||||||
|             #endif |             #endif | ||||||
|             frame->instr_ptr++; |             frame->instr_ptr++; | ||||||
|             PyGenObject *gen = _PyFrame_GetGenerator(frame); |             PyGenObject *gen = _PyGen_GetGeneratorFromFrame(frame); | ||||||
|             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); |             assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1); | ||||||
|             assert(oparg == 0 || oparg == 1); |             assert(oparg == 0 || oparg == 1); | ||||||
|             gen->gi_frame_state = FRAME_SUSPENDED + oparg; |             gen->gi_frame_state = FRAME_SUSPENDED + oparg; | ||||||
|  |  | ||||||
|  | @ -10,7 +10,6 @@ | ||||||
| #include "pycore_exceptions.h"    // _PyExc_InitTypes() | #include "pycore_exceptions.h"    // _PyExc_InitTypes() | ||||||
| #include "pycore_fileutils.h"     // _Py_ResetForceASCII() | #include "pycore_fileutils.h"     // _Py_ResetForceASCII() | ||||||
| #include "pycore_floatobject.h"   // _PyFloat_InitTypes() | #include "pycore_floatobject.h"   // _PyFloat_InitTypes() | ||||||
| #include "pycore_genobject.h"     // _PyAsyncGen_Fini() |  | ||||||
| #include "pycore_global_objects_fini_generated.h"  // "_PyStaticObjects_CheckRefcnt() | #include "pycore_global_objects_fini_generated.h"  // "_PyStaticObjects_CheckRefcnt() | ||||||
| #include "pycore_import.h"        // _PyImport_BootstrapImp() | #include "pycore_import.h"        // _PyImport_BootstrapImp() | ||||||
| #include "pycore_initconfig.h"    // _PyStatus_OK() | #include "pycore_initconfig.h"    // _PyStatus_OK() | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Irit Katriel
						Irit Katriel