mirror of https://github.com/python/cpython
gh-120834: fix type of *_iframe field in _PyGenObject_HEAD declaration (#120835)
This commit is contained in:
parent
c38e2f64d0
commit
65a12c559c
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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…
Reference in New Issue