Skip to content

Commit

Permalink
pythonGH-120024: Refactor code a bit so that escaping calls can be wr…
Browse files Browse the repository at this point in the history
…apped in spill code in code generator (pythonGH-122693)
  • Loading branch information
markshannon authored Aug 6, 2024
1 parent b72c748 commit a8be8fc
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 42 deletions.
50 changes: 32 additions & 18 deletions Python/bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,8 @@ dummy_func(
/* Need to create a fake StopIteration error here,
* to conform to PEP 380 */
if (PyStackRef_GenCheck(receiver)) {
if (monitor_stop_iteration(tstate, frame, this_instr, PyStackRef_AsPyObjectBorrow(value))) {
int err = monitor_stop_iteration(tstate, frame, this_instr, PyStackRef_AsPyObjectBorrow(value));
if (err) {
ERROR_NO_POP();
}
}
Expand All @@ -302,7 +303,8 @@ dummy_func(
tier1 inst(INSTRUMENTED_END_SEND, (receiver, value -- value)) {
PyObject *receiver_o = PyStackRef_AsPyObjectBorrow(receiver);
if (PyGen_Check(receiver_o) || PyCoro_CheckExact(receiver_o)) {
if (monitor_stop_iteration(tstate, frame, this_instr, PyStackRef_AsPyObjectBorrow(value))) {
int err = monitor_stop_iteration(tstate, frame, this_instr, PyStackRef_AsPyObjectBorrow(value));
if (err) {
ERROR_NO_POP();
}
}
Expand Down Expand Up @@ -1069,11 +1071,12 @@ dummy_func(
PyStackRef_AsPyObjectBorrow(v));
}
if (retval_o == NULL) {
if (_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)
) {
int matches = _PyErr_ExceptionMatches(tstate, PyExc_StopIteration);
if (matches) {
_PyEval_MonitorRaise(tstate, frame, this_instr);
}
if (_PyGen_FetchStopIterationValue(&retval_o) == 0) {
int err = _PyGen_FetchStopIterationValue(&retval_o);
if (err == 0) {
assert(retval_o != NULL);
JUMPBY(oparg);
}
Expand Down Expand Up @@ -1210,7 +1213,8 @@ dummy_func(
assert(throwflag);
assert(exc_value && PyExceptionInstance_Check(exc_value));

if (PyErr_GivenExceptionMatches(exc_value, PyExc_StopIteration)) {
int matches = PyErr_GivenExceptionMatches(exc_value, PyExc_StopIteration);
if (matches) {
value = PyStackRef_FromPyObjectNew(((PyStopIterationObject *)exc_value)->value);
DECREF_INPUTS();
none = PyStackRef_None;
Expand Down Expand Up @@ -1425,7 +1429,8 @@ dummy_func(
inst(LOAD_FROM_DICT_OR_GLOBALS, (mod_or_class_dict -- v)) {
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
PyObject *v_o;
if (PyMapping_GetOptionalItem(PyStackRef_AsPyObjectBorrow(mod_or_class_dict), name, &v_o) < 0) {
int err = PyMapping_GetOptionalItem(PyStackRef_AsPyObjectBorrow(mod_or_class_dict), name, &v_o);
if (err < 0) {
ERROR_NO_POP();
}
if (v_o == NULL) {
Expand Down Expand Up @@ -1596,7 +1601,8 @@ dummy_func(
assert(class_dict);
assert(oparg >= 0 && oparg < _PyFrame_GetCode(frame)->co_nlocalsplus);
name = PyTuple_GET_ITEM(_PyFrame_GetCode(frame)->co_localsplusnames, oparg);
if (PyMapping_GetOptionalItem(class_dict, name, &value_o) < 0) {
int err = PyMapping_GetOptionalItem(class_dict, name, &value_o);
if (err < 0) {
ERROR_NO_POP();
}
if (!value_o) {
Expand Down Expand Up @@ -1676,7 +1682,8 @@ dummy_func(

PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
if (none_val == NULL) {
if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
int matches = _PyErr_ExceptionMatches(tstate, PyExc_TypeError);
if (matches &&
(Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
{
_PyErr_Clear(tstate);
Expand Down Expand Up @@ -1762,8 +1769,10 @@ dummy_func(
PyObject *dict_o = PyStackRef_AsPyObjectBorrow(dict);
PyObject *update_o = PyStackRef_AsPyObjectBorrow(update);

if (PyDict_Update(dict_o, update_o) < 0) {
if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
int err = PyDict_Update(dict_o, update_o);
if (err < 0) {
int matches = _PyErr_ExceptionMatches(tstate, PyExc_AttributeError);
if (matches) {
_PyErr_Format(tstate, PyExc_TypeError,
"'%.200s' object is not a mapping",
Py_TYPE(update_o)->tp_name);
Expand All @@ -1779,7 +1788,8 @@ dummy_func(
PyObject *dict_o = PyStackRef_AsPyObjectBorrow(dict);
PyObject *update_o = PyStackRef_AsPyObjectBorrow(update);

if (_PyDict_MergeEx(dict_o, update_o, 2) < 0) {
int err = _PyDict_MergeEx(dict_o, update_o, 2);
if (err < 0) {
_PyEval_FormatKwargsError(tstate, callable_o, update_o);
DECREF_INPUTS();
ERROR_IF(true, error);
Expand Down Expand Up @@ -1943,7 +1953,8 @@ dummy_func(
if (oparg & 1) {
/* Designed to work in tandem with CALL, pushes two values. */
attr_o = NULL;
if (_PyObject_GetMethod(PyStackRef_AsPyObjectBorrow(owner), name, &attr_o)) {
int is_meth = _PyObject_GetMethod(PyStackRef_AsPyObjectBorrow(owner), name, &attr_o);
if (is_meth) {
/* We can bypass temporary bound method object.
meth is unbound method and obj is self.
meth | self | arg1 | ... | argN
Expand Down Expand Up @@ -2416,8 +2427,8 @@ dummy_func(
inst(CHECK_EG_MATCH, (exc_value_st, match_type_st -- rest, match)) {
PyObject *exc_value = PyStackRef_AsPyObjectBorrow(exc_value_st);
PyObject *match_type = PyStackRef_AsPyObjectBorrow(match_type_st);

if (_PyEval_CheckExceptStarTypeValid(tstate, match_type) < 0) {
int err = _PyEval_CheckExceptStarTypeValid(tstate, match_type);
if (err < 0) {
DECREF_INPUTS();
ERROR_IF(true, error);
}
Expand Down Expand Up @@ -2704,7 +2715,8 @@ dummy_func(
if (next_o == NULL) {
next = PyStackRef_NULL;
if (_PyErr_Occurred(tstate)) {
if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
int matches = _PyErr_ExceptionMatches(tstate, PyExc_StopIteration);
if (!matches) {
ERROR_NO_POP();
}
_PyEval_MonitorRaise(tstate, frame, this_instr);
Expand All @@ -2729,7 +2741,8 @@ dummy_func(
PyObject *next_o = (*Py_TYPE(iter_o)->tp_iternext)(iter_o);
if (next_o == NULL) {
if (_PyErr_Occurred(tstate)) {
if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
int matches = _PyErr_ExceptionMatches(tstate, PyExc_StopIteration);
if (!matches) {
ERROR_NO_POP();
}
_PyEval_MonitorRaise(tstate, frame, frame->instr_ptr);
Expand All @@ -2756,7 +2769,8 @@ dummy_func(
}
else {
if (_PyErr_Occurred(tstate)) {
if (!_PyErr_ExceptionMatches(tstate, PyExc_StopIteration)) {
int matches = _PyErr_ExceptionMatches(tstate, PyExc_StopIteration);
if (!matches) {
ERROR_NO_POP();
}
_PyEval_MonitorRaise(tstate, frame, this_instr);
Expand Down
24 changes: 16 additions & 8 deletions Python/executor_cases.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 30 additions & 16 deletions Python/generated_cases.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit a8be8fc

Please sign in to comment.