summaryrefslogtreecommitdiffstats
path: root/Objects/typeobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/typeobject.c')
-rw-r--r--Objects/typeobject.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index bd2cade..4c7e5d4 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -11,6 +11,8 @@
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "pycore_unionobject.h" // _Py_Union(), _Py_union_type_or
#include "frameobject.h"
+#include "pycore_frame.h" // _PyFrame_OpAlreadyRan
+#include "opcode.h" // MAKE_CELL
#include "structmember.h" // PyMemberDef
#include <ctype.h>
@@ -8877,14 +8879,17 @@ super_init_without_args(PyFrameObject *f, PyCodeObject *co,
}
PyObject *obj = f->f_localsptr[0];
- Py_ssize_t i;
+ int i;
if (obj == NULL && co->co_cell2arg) {
/* The first argument might be a cell. */
for (i = 0; i < co->co_ncellvars; i++) {
if (co->co_cell2arg[i] == 0) {
- PyObject *cell = f->f_localsptr[co->co_nlocals + i];
- assert(PyCell_Check(cell));
- obj = PyCell_GET(cell);
+ int celloffset = co->co_nlocals + i;
+ PyObject *cell = f->f_localsptr[celloffset];
+ if (PyCell_Check(cell) &&
+ _PyFrame_OpAlreadyRan(f, MAKE_CELL, celloffset)) {
+ obj = PyCell_GET(cell);
+ }
break;
}
}