Skip to content

Commit 3e0689c

Browse files
committed
pythongh-120834: fix type of *_iframe field in _PyGenObject_HEAD declaration
1 parent 83d3d7a commit 3e0689c

File tree

5 files changed

+23
-22
lines changed

5 files changed

+23
-22
lines changed

Include/cpython/genobject.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
extern "C" {
88
#endif
99

10+
struct _PyInterpreterFrame;
11+
1012
/* --- Generators --------------------------------------------------------- */
1113

1214
/* _PyGenObject_HEAD defines the initial segment of generator
@@ -26,7 +28,7 @@ extern "C" {
2628
char prefix##_running_async; \
2729
/* The frame */ \
2830
int8_t prefix##_frame_state; \
29-
PyObject *prefix##_iframe[1]; \
31+
struct _PyInterpreterFrame *prefix##_iframe[1]; \
3032

3133
typedef struct {
3234
/* The gi_ prefix is intended to remind of generator-iterator. */

Objects/genobject.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ static const char *ASYNC_GEN_IGNORED_EXIT_MSG =
3030
/* Returns a borrowed reference */
3131
static inline PyCodeObject *
3232
_PyGen_GetCode(PyGenObject *gen) {
33-
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)(gen->gi_iframe);
34-
return _PyFrame_GetCode(frame);
33+
return _PyFrame_GetCode(gen->gi_iframe);
3534
}
3635

3736
PyCodeObject *
@@ -48,7 +47,7 @@ gen_traverse(PyGenObject *gen, visitproc visit, void *arg)
4847
Py_VISIT(gen->gi_name);
4948
Py_VISIT(gen->gi_qualname);
5049
if (gen->gi_frame_state != FRAME_CLEARED) {
51-
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)(gen->gi_iframe);
50+
_PyInterpreterFrame *frame = gen->gi_iframe;
5251
assert(frame->frame_obj == NULL ||
5352
frame->frame_obj->f_frame->owner == FRAME_OWNED_BY_GENERATOR);
5453
int err = _PyFrame_Traverse(frame, visit, arg);
@@ -141,7 +140,7 @@ gen_dealloc(PyGenObject *gen)
141140
Py_CLEAR(((PyAsyncGenObject*)gen)->ag_origin_or_finalizer);
142141
}
143142
if (gen->gi_frame_state != FRAME_CLEARED) {
144-
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe;
143+
_PyInterpreterFrame *frame = gen->gi_iframe;
145144
gen->gi_frame_state = FRAME_CLEARED;
146145
frame->previous = NULL;
147146
_PyFrame_ClearExceptCode(frame);
@@ -163,7 +162,7 @@ gen_send_ex2(PyGenObject *gen, PyObject *arg, PyObject **presult,
163162
int exc, int closing)
164163
{
165164
PyThreadState *tstate = _PyThreadState_GET();
166-
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe;
165+
_PyInterpreterFrame *frame = gen->gi_iframe;
167166

168167
*presult = NULL;
169168
if (gen->gi_frame_state == FRAME_CREATED && arg && arg != Py_None) {
@@ -342,7 +341,7 @@ PyObject *
342341
_PyGen_yf(PyGenObject *gen)
343342
{
344343
if (gen->gi_frame_state == FRAME_SUSPENDED_YIELD_FROM) {
345-
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe;
344+
_PyInterpreterFrame *frame = gen->gi_iframe;
346345
assert(is_resume(frame->instr_ptr));
347346
assert((frame->instr_ptr->op.arg & RESUME_OPARG_LOCATION_MASK) >= RESUME_AFTER_YIELD_FROM);
348347
return Py_NewRef(_PyFrame_StackPeek(frame));
@@ -372,7 +371,7 @@ gen_close(PyGenObject *gen, PyObject *args)
372371
gen->gi_frame_state = state;
373372
Py_DECREF(yf);
374373
}
375-
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe;
374+
_PyInterpreterFrame *frame = gen->gi_iframe;
376375
if (is_resume(frame->instr_ptr)) {
377376
/* We can safely ignore the outermost try block
378377
* as it is automatically generated to handle
@@ -382,7 +381,7 @@ gen_close(PyGenObject *gen, PyObject *args)
382381
// RESUME after YIELD_VALUE and exception depth is 1
383382
assert((oparg & RESUME_OPARG_LOCATION_MASK) != RESUME_AT_FUNC_START);
384383
gen->gi_frame_state = FRAME_COMPLETED;
385-
_PyFrame_ClearLocals((_PyInterpreterFrame *)gen->gi_iframe);
384+
_PyFrame_ClearLocals(gen->gi_iframe);
386385
Py_RETURN_NONE;
387386
}
388387
}
@@ -431,7 +430,7 @@ _gen_throw(PyGenObject *gen, int close_on_genexit,
431430
PyObject *yf = _PyGen_yf(gen);
432431

433432
if (yf) {
434-
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe;
433+
_PyInterpreterFrame *frame = gen->gi_iframe;
435434
PyObject *ret;
436435
int err;
437436
if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) &&
@@ -739,7 +738,7 @@ _gen_getframe(PyGenObject *gen, const char *const name)
739738
if (FRAME_STATE_FINISHED(gen->gi_frame_state)) {
740739
Py_RETURN_NONE;
741740
}
742-
return _Py_XNewRef((PyObject *)_PyFrame_GetFrameObject((_PyInterpreterFrame *)gen->gi_iframe));
741+
return _Py_XNewRef((PyObject *)_PyFrame_GetFrameObject(gen->gi_iframe));
743742
}
744743

745744
static PyObject *
@@ -949,7 +948,7 @@ gen_new_with_qualname(PyTypeObject *type, PyFrameObject *f,
949948
/* Copy the frame */
950949
assert(f->f_frame->frame_obj == NULL);
951950
assert(f->f_frame->owner == FRAME_OWNED_BY_FRAME_OBJECT);
952-
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe;
951+
_PyInterpreterFrame *frame = gen->gi_iframe;
953952
_PyFrame_Copy((_PyInterpreterFrame *)f->_f_frame_data, frame);
954953
gen->gi_frame_state = FRAME_CREATED;
955954
assert(frame->frame_obj == f);

Python/bytecodes.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ dummy_func(
10151015
((PyGenObject *)receiver)->gi_frame_state < FRAME_EXECUTING)
10161016
{
10171017
PyGenObject *gen = (PyGenObject *)receiver;
1018-
_PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe;
1018+
_PyInterpreterFrame *gen_frame = gen->gi_iframe;
10191019
STACK_SHRINK(1);
10201020
_PyFrame_StackPush(gen_frame, v);
10211021
gen->gi_frame_state = FRAME_EXECUTING;
@@ -1055,7 +1055,7 @@ dummy_func(
10551055
DEOPT_IF(Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type);
10561056
DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING);
10571057
STAT_INC(SEND, hit);
1058-
_PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe;
1058+
_PyInterpreterFrame *gen_frame = gen->gi_iframe;
10591059
STACK_SHRINK(1);
10601060
_PyFrame_StackPush(gen_frame, v);
10611061
gen->gi_frame_state = FRAME_EXECUTING;
@@ -2799,7 +2799,7 @@ dummy_func(
27992799
DEOPT_IF(Py_TYPE(gen) != &PyGen_Type);
28002800
DEOPT_IF(gen->gi_frame_state >= FRAME_EXECUTING);
28012801
STAT_INC(FOR_ITER, hit);
2802-
gen_frame = (_PyInterpreterFrame *)gen->gi_iframe;
2802+
gen_frame = gen->gi_iframe;
28032803
_PyFrame_StackPush(gen_frame, Py_None);
28042804
gen->gi_frame_state = FRAME_EXECUTING;
28052805
gen->gi_exc_state.previous_item = tstate->exc_info;
@@ -3940,7 +3940,7 @@ dummy_func(
39403940
}
39413941
assert(EMPTY());
39423942
_PyFrame_SetStackPointer(frame, stack_pointer);
3943-
_PyInterpreterFrame *gen_frame = (_PyInterpreterFrame *)gen->gi_iframe;
3943+
_PyInterpreterFrame *gen_frame = gen->gi_iframe;
39443944
frame->instr_ptr++;
39453945
_PyFrame_Copy(frame, gen_frame);
39463946
assert(frame->frame_obj == NULL);

Python/executor_cases.c.h

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)