mirror of
https://github.com/python/cpython.git
synced 2025-08-01 07:33:08 +00:00
This was reverted in GH-26596 (commit 6d518bb
) due to some bad memory accesses.
* Add the MAKE_CELL opcode. (gh-26396)
The memory accesses have been fixed.
https://bugs.python.org/issue43693
This commit is contained in:
parent
ab36b9f834
commit
3e1c7167d8
16 changed files with 4470 additions and 4234 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue