mirror of
https://github.com/python/cpython.git
synced 2025-10-14 02:43:49 +00:00
GH-121459: Streamline PyObject* to PyStackRef conversions by disallowing NULL pointers. (GH-124894)
This commit is contained in:
parent
10094a533a
commit
d1453f60c2
4 changed files with 63 additions and 57 deletions
32
Python/executor_cases.c.h
generated
32
Python/executor_cases.c.h
generated
|
@ -3281,10 +3281,11 @@
|
|||
iterable = stack_pointer[-1];
|
||||
/* before: [obj]; after [getiter(obj)] */
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
iter = PyStackRef_FromPyObjectSteal(PyObject_GetIter(PyStackRef_AsPyObjectBorrow(iterable)));
|
||||
PyObject *iter_o = PyObject_GetIter(PyStackRef_AsPyObjectBorrow(iterable));
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
PyStackRef_CLOSE(iterable);
|
||||
if (PyStackRef_IsNull(iter)) JUMP_TO_ERROR();
|
||||
if (iter_o == NULL) JUMP_TO_ERROR();
|
||||
iter = PyStackRef_FromPyObjectSteal(iter_o);
|
||||
stack_pointer[-1] = iter;
|
||||
break;
|
||||
}
|
||||
|
@ -3552,24 +3553,21 @@
|
|||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
attr = PyStackRef_FromPyObjectSteal(_PyObject_LookupSpecialMethod(owner_o, name, &self_or_null_o));
|
||||
PyObject *attr_o = _PyObject_LookupSpecialMethod(owner_o, name, &self_or_null_o);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (PyStackRef_IsNull(attr)) {
|
||||
if (attr_o == NULL) {
|
||||
if (!_PyErr_Occurred(tstate)) {
|
||||
stack_pointer[0] = attr;
|
||||
stack_pointer += 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyErr_Format(tstate, PyExc_TypeError,
|
||||
_Py_SpecialMethods[oparg].error,
|
||||
Py_TYPE(owner_o)->tp_name);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
if (true) JUMP_TO_ERROR();
|
||||
}
|
||||
if (PyStackRef_IsNull(attr)) JUMP_TO_ERROR();
|
||||
self_or_null = PyStackRef_FromPyObjectSteal(self_or_null_o);
|
||||
attr = PyStackRef_FromPyObjectSteal(attr_o);
|
||||
self_or_null = self_or_null_o == NULL ?
|
||||
PyStackRef_NULL : PyStackRef_FromPyObjectSteal(self_or_null_o);
|
||||
stack_pointer[0] = attr;
|
||||
stack_pointer[1] = self_or_null;
|
||||
stack_pointer += 2;
|
||||
|
@ -3613,10 +3611,11 @@
|
|||
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
||||
int has_self = !PyStackRef_IsNull(exit_self);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
res = PyStackRef_FromPyObjectSteal(PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
|
||||
(3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL));
|
||||
PyObject *res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
|
||||
(3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (PyStackRef_IsNull(res)) JUMP_TO_ERROR();
|
||||
if (res_o == NULL) JUMP_TO_ERROR();
|
||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
stack_pointer[0] = res;
|
||||
stack_pointer += 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
|
@ -5373,10 +5372,11 @@
|
|||
* of format(value) is value itself. */
|
||||
if (!PyUnicode_CheckExact(value_o)) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
res = PyStackRef_FromPyObjectSteal(PyObject_Format(value_o, NULL));
|
||||
PyObject *res_o = PyObject_Format(value_o, NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
PyStackRef_CLOSE(value);
|
||||
if (PyStackRef_IsNull(res)) JUMP_TO_ERROR();
|
||||
if (res_o == NULL) JUMP_TO_ERROR();
|
||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
}
|
||||
else {
|
||||
res = value;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue