From 2e343fc465ed0206340cf139ba485f9004bbdd41 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 10 Nov 2022 11:25:33 +0100 Subject: [PATCH] gh-99300: Use Py_NewRef() in Python/ceval.c (#99318) Replace Py_INCREF() and Py_XINCREF() with Py_NewRef() and Py_XNewRef() in Python/ceval.c and related files. --- Python/bytecodes.c | 86 +++++++++++++------------------------- Python/ceval.c | 24 ++++------- Python/generated_cases.c.h | 86 +++++++++++++------------------------- 3 files changed, 68 insertions(+), 128 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index d2df56ef7ba..c1f416e6bb8 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -941,10 +941,9 @@ dummy_func( PUSH(value); DISPATCH(); } - Py_INCREF(exc_value); PyObject *exc_type = Py_NewRef(Py_TYPE(exc_value)); PyObject *exc_traceback = PyException_GetTraceback(exc_value); - _PyErr_Restore(tstate, exc_type, exc_value, exc_traceback); + _PyErr_Restore(tstate, exc_type, Py_NewRef(exc_value), exc_traceback); goto exception_unwind; } @@ -982,8 +981,8 @@ dummy_func( } assert(PyExceptionInstance_Check(error)); SET_TOP(error); - PyException_SetCause(error, exc); - Py_INCREF(exc); + PyException_SetCause(error, Py_NewRef(exc)); + // Steal exc reference, rather than Py_NewRef+Py_DECREF PyException_SetContext(error, exc); Py_DECREF(message); } @@ -994,8 +993,7 @@ dummy_func( // stack effect: ( -- __0) inst(LOAD_ASSERTION_ERROR) { PyObject *value = PyExc_AssertionError; - Py_INCREF(value); - PUSH(value); + PUSH(Py_NewRef(value)); } // stack effect: ( -- __0) @@ -1351,8 +1349,7 @@ dummy_func( JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL); STAT_INC(LOAD_GLOBAL, hit); STACK_GROW(push_null+1); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); } // error: LOAD_GLOBAL has irregular stack effect @@ -1376,8 +1373,7 @@ dummy_func( JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL); STAT_INC(LOAD_GLOBAL, hit); STACK_GROW(push_null+1); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); } // stack effect: ( -- ) @@ -1459,8 +1455,7 @@ dummy_func( format_exc_unbound(tstate, frame->f_code, oparg); goto error; } - Py_INCREF(value); - PUSH(value); + PUSH(Py_NewRef(value)); } // stack effect: (__0 -- ) @@ -1482,8 +1477,7 @@ dummy_func( assert(oparg == co->co_nfreevars); for (int i = 0; i < oparg; ++i) { PyObject *o = PyTuple_GET_ITEM(closure, i); - Py_INCREF(o); - frame->localsplus[offset + i] = o; + frame->localsplus[offset + i] = Py_NewRef(o); } } @@ -1987,9 +1981,8 @@ dummy_func( SET_TOP(NULL); int shrink_stack = !(oparg & 1); STACK_SHRINK(shrink_stack); - Py_INCREF(name); new_frame->localsplus[0] = owner; - new_frame->localsplus[1] = name; + new_frame->localsplus[1] = Py_NewRef(name); for (int i = 2; i < code->co_nlocalsplus; i++) { new_frame->localsplus[i] = NULL; } @@ -2233,8 +2226,7 @@ dummy_func( PyObject *left = TOP(); int res = Py_Is(left, right) ^ oparg; PyObject *b = res ? Py_True : Py_False; - Py_INCREF(b); - SET_TOP(b); + SET_TOP(Py_NewRef(b)); Py_DECREF(left); Py_DECREF(right); } @@ -2250,8 +2242,7 @@ dummy_func( goto error; } PyObject *b = (res^oparg) ? Py_True : Py_False; - Py_INCREF(b); - PUSH(b); + PUSH(Py_NewRef(b)); } // stack effect: ( -- ) @@ -2532,8 +2523,7 @@ dummy_func( } else { // Failure! - Py_INCREF(Py_None); - SET_TOP(Py_None); + SET_TOP(Py_NewRef(Py_None)); } Py_DECREF(subject); } @@ -2543,8 +2533,7 @@ dummy_func( PyObject *subject = TOP(); int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; PyObject *res = match ? Py_True : Py_False; - Py_INCREF(res); - PUSH(res); + PUSH(Py_NewRef(res)); PREDICT(POP_JUMP_IF_FALSE); } @@ -2553,8 +2542,7 @@ dummy_func( PyObject *subject = TOP(); int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; PyObject *res = match ? Py_True : Py_False; - Py_INCREF(res); - PUSH(res); + PUSH(Py_NewRef(res)); PREDICT(POP_JUMP_IF_FALSE); } @@ -2656,8 +2644,7 @@ dummy_func( if (seq) { if (it->it_index < PyList_GET_SIZE(seq)) { PyObject *next = PyList_GET_ITEM(seq, it->it_index++); - Py_INCREF(next); - PUSH(next); + PUSH(Py_NewRef(next)); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); DISPATCH(); } @@ -2704,8 +2691,7 @@ dummy_func( JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); assert(_Py_OPCODE(*next_instr) == END_FOR); frame->prev_instr = next_instr - 1; - Py_INCREF(Py_None); - _PyFrame_StackPush(gen_frame, Py_None); + _PyFrame_StackPush(gen_frame, Py_NewRef(Py_None)); gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; @@ -2826,12 +2812,10 @@ dummy_func( SET_TOP(exc_info->exc_value); } else { - Py_INCREF(Py_None); - SET_TOP(Py_None); + SET_TOP(Py_NewRef(Py_None)); } - Py_INCREF(value); - PUSH(value); + PUSH(Py_NewRef(value)); assert(PyExceptionInstance_Check(value)); exc_info->exc_value = value; @@ -2857,8 +2841,7 @@ dummy_func( PyObject *res = read_obj(cache->descr); assert(res != NULL); assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); PUSH(self); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); } @@ -2885,8 +2868,7 @@ dummy_func( PyObject *res = read_obj(cache->descr); assert(res != NULL); assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); PUSH(self); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); } @@ -2904,8 +2886,7 @@ dummy_func( PyObject *res = read_obj(cache->descr); assert(res != NULL); assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); PUSH(self); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); } @@ -2927,8 +2908,7 @@ dummy_func( PyObject *res = read_obj(cache->descr); assert(res != NULL); assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); PUSH(self); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); } @@ -2939,12 +2919,10 @@ dummy_func( PyObject *function = PEEK(oparg + 1); DEOPT_IF(Py_TYPE(function) != &PyMethod_Type, CALL); STAT_INC(CALL, hit); - PyObject *meth = ((PyMethodObject *)function)->im_func; PyObject *self = ((PyMethodObject *)function)->im_self; - Py_INCREF(meth); - Py_INCREF(self); - PEEK(oparg + 1) = self; - PEEK(oparg + 2) = meth; + PEEK(oparg + 1) = Py_NewRef(self); + PyObject *meth = ((PyMethodObject *)function)->im_func; + PEEK(oparg + 2) = Py_NewRef(meth); Py_DECREF(function); GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS); } @@ -2974,12 +2952,10 @@ dummy_func( is_meth = is_method(stack_pointer, oparg); PyObject *function = PEEK(oparg + 1); if (!is_meth && Py_TYPE(function) == &PyMethod_Type) { - PyObject *meth = ((PyMethodObject *)function)->im_func; PyObject *self = ((PyMethodObject *)function)->im_self; - Py_INCREF(meth); - Py_INCREF(self); - PEEK(oparg+1) = self; - PEEK(oparg+2) = meth; + PEEK(oparg+1) = Py_NewRef(self); + PyObject *meth = ((PyMethodObject *)function)->im_func; + PEEK(oparg+2) = Py_NewRef(meth); Py_DECREF(function); is_meth = 1; } @@ -3102,8 +3078,7 @@ dummy_func( for (int i = argcount; i < code->co_argcount; i++) { PyObject *def = PyTuple_GET_ITEM(func->func_defaults, i - minargs); - Py_INCREF(def); - new_frame->localsplus[i] = def; + new_frame->localsplus[i] = Py_NewRef(def); } for (int i = code->co_argcount; i < code->co_nlocalsplus; i++) { new_frame->localsplus[i] = NULL; @@ -3734,8 +3709,7 @@ dummy_func( inst(COPY) { assert(oparg != 0); PyObject *peek = PEEK(oparg); - Py_INCREF(peek); - PUSH(peek); + PUSH(Py_NewRef(peek)); } // stack effect: (__0 -- ) diff --git a/Python/ceval.c b/Python/ceval.c index af706e1a021..8462cb1ba91 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -391,8 +391,7 @@ match_keys(PyThreadState *tstate, PyObject *map, PyObject *keys) Py_DECREF(value); Py_DECREF(values); // Return None: - Py_INCREF(Py_None); - values = Py_None; + values = Py_NewRef(Py_None); goto done; } PyTuple_SET_ITEM(values, i, value); @@ -1883,8 +1882,7 @@ initialize_locals(PyThreadState *tstate, PyFunctionObject *func, for (; i < defcount; i++) { if (localsplus[m+i] == NULL) { PyObject *def = defs[i]; - Py_INCREF(def); - localsplus[m+i] = def; + localsplus[m+i] = Py_NewRef(def); } } } @@ -1900,8 +1898,7 @@ initialize_locals(PyThreadState *tstate, PyFunctionObject *func, if (func->func_kwdefaults != NULL) { PyObject *def = PyDict_GetItemWithError(func->func_kwdefaults, varname); if (def) { - Py_INCREF(def); - localsplus[i] = def; + localsplus[i] = Py_NewRef(def); continue; } else if (_PyErr_Occurred(tstate)) { @@ -2092,15 +2089,13 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, newargs[i] = args[i]; } for (int i = 0; i < kwcount; i++) { - Py_INCREF(kws[2*i]); - PyTuple_SET_ITEM(kwnames, i, kws[2*i]); + PyTuple_SET_ITEM(kwnames, i, Py_NewRef(kws[2*i])); newargs[argcount+i] = kws[2*i+1]; } allargs = newargs; } for (int i = 0; i < kwcount; i++) { - Py_INCREF(kws[2*i]); - PyTuple_SET_ITEM(kwnames, i, kws[2*i]); + PyTuple_SET_ITEM(kwnames, i, Py_NewRef(kws[2*i])); } PyFrameConstructor constr = { .fc_globals = globals, @@ -2395,8 +2390,7 @@ call_exc_trace(Py_tracefunc func, PyObject *self, int err; _PyErr_Fetch(tstate, &type, &value, &orig_traceback); if (value == NULL) { - value = Py_None; - Py_INCREF(value); + value = Py_NewRef(Py_None); } _PyErr_NormalizeException(tstate, &type, &value, &orig_traceback); traceback = (orig_traceback != NULL) ? orig_traceback : Py_None; @@ -2699,8 +2693,7 @@ _PyEval_SetAsyncGenFirstiter(PyObject *firstiter) return -1; } - Py_XINCREF(firstiter); - Py_XSETREF(tstate->async_gen_firstiter, firstiter); + Py_XSETREF(tstate->async_gen_firstiter, Py_XNewRef(firstiter)); return 0; } @@ -2720,8 +2713,7 @@ _PyEval_SetAsyncGenFinalizer(PyObject *finalizer) return -1; } - Py_XINCREF(finalizer); - Py_XSETREF(tstate->async_gen_finalizer, finalizer); + Py_XSETREF(tstate->async_gen_finalizer, Py_XNewRef(finalizer)); return 0; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index da6b34038cd..d09384e7433 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -932,10 +932,9 @@ PUSH(value); DISPATCH(); } - Py_INCREF(exc_value); PyObject *exc_type = Py_NewRef(Py_TYPE(exc_value)); PyObject *exc_traceback = PyException_GetTraceback(exc_value); - _PyErr_Restore(tstate, exc_type, exc_value, exc_traceback); + _PyErr_Restore(tstate, exc_type, Py_NewRef(exc_value), exc_traceback); goto exception_unwind; } @@ -973,8 +972,8 @@ } assert(PyExceptionInstance_Check(error)); SET_TOP(error); - PyException_SetCause(error, exc); - Py_INCREF(exc); + PyException_SetCause(error, Py_NewRef(exc)); + // Steal exc reference, rather than Py_NewRef+Py_DECREF PyException_SetContext(error, exc); Py_DECREF(message); } @@ -983,8 +982,7 @@ TARGET(LOAD_ASSERTION_ERROR) { PyObject *value = PyExc_AssertionError; - Py_INCREF(value); - PUSH(value); + PUSH(Py_NewRef(value)); DISPATCH(); } @@ -1343,8 +1341,7 @@ JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL); STAT_INC(LOAD_GLOBAL, hit); STACK_GROW(push_null+1); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); DISPATCH(); } @@ -1368,8 +1365,7 @@ JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL); STAT_INC(LOAD_GLOBAL, hit); STACK_GROW(push_null+1); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); DISPATCH(); } @@ -1449,8 +1445,7 @@ format_exc_unbound(tstate, frame->f_code, oparg); goto error; } - Py_INCREF(value); - PUSH(value); + PUSH(Py_NewRef(value)); DISPATCH(); } @@ -1472,8 +1467,7 @@ assert(oparg == co->co_nfreevars); for (int i = 0; i < oparg; ++i) { PyObject *o = PyTuple_GET_ITEM(closure, i); - Py_INCREF(o); - frame->localsplus[offset + i] = o; + frame->localsplus[offset + i] = Py_NewRef(o); } DISPATCH(); } @@ -1977,9 +1971,8 @@ SET_TOP(NULL); int shrink_stack = !(oparg & 1); STACK_SHRINK(shrink_stack); - Py_INCREF(name); new_frame->localsplus[0] = owner; - new_frame->localsplus[1] = name; + new_frame->localsplus[1] = Py_NewRef(name); for (int i = 2; i < code->co_nlocalsplus; i++) { new_frame->localsplus[i] = NULL; } @@ -2223,8 +2216,7 @@ PyObject *left = TOP(); int res = Py_Is(left, right) ^ oparg; PyObject *b = res ? Py_True : Py_False; - Py_INCREF(b); - SET_TOP(b); + SET_TOP(Py_NewRef(b)); Py_DECREF(left); Py_DECREF(right); DISPATCH(); @@ -2240,8 +2232,7 @@ goto error; } PyObject *b = (res^oparg) ? Py_True : Py_False; - Py_INCREF(b); - PUSH(b); + PUSH(Py_NewRef(b)); DISPATCH(); } @@ -2524,8 +2515,7 @@ } else { // Failure! - Py_INCREF(Py_None); - SET_TOP(Py_None); + SET_TOP(Py_NewRef(Py_None)); } Py_DECREF(subject); DISPATCH(); @@ -2535,8 +2525,7 @@ PyObject *subject = TOP(); int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; PyObject *res = match ? Py_True : Py_False; - Py_INCREF(res); - PUSH(res); + PUSH(Py_NewRef(res)); PREDICT(POP_JUMP_IF_FALSE); DISPATCH(); } @@ -2545,8 +2534,7 @@ PyObject *subject = TOP(); int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; PyObject *res = match ? Py_True : Py_False; - Py_INCREF(res); - PUSH(res); + PUSH(Py_NewRef(res)); PREDICT(POP_JUMP_IF_FALSE); DISPATCH(); } @@ -2649,8 +2637,7 @@ if (seq) { if (it->it_index < PyList_GET_SIZE(seq)) { PyObject *next = PyList_GET_ITEM(seq, it->it_index++); - Py_INCREF(next); - PUSH(next); + PUSH(Py_NewRef(next)); JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER); DISPATCH(); } @@ -2698,8 +2685,7 @@ JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg); assert(_Py_OPCODE(*next_instr) == END_FOR); frame->prev_instr = next_instr - 1; - Py_INCREF(Py_None); - _PyFrame_StackPush(gen_frame, Py_None); + _PyFrame_StackPush(gen_frame, Py_NewRef(Py_None)); gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; @@ -2818,12 +2804,10 @@ SET_TOP(exc_info->exc_value); } else { - Py_INCREF(Py_None); - SET_TOP(Py_None); + SET_TOP(Py_NewRef(Py_None)); } - Py_INCREF(value); - PUSH(value); + PUSH(Py_NewRef(value)); assert(PyExceptionInstance_Check(value)); exc_info->exc_value = value; DISPATCH(); @@ -2848,8 +2832,7 @@ PyObject *res = read_obj(cache->descr); assert(res != NULL); assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); PUSH(self); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH(); @@ -2876,8 +2859,7 @@ PyObject *res = read_obj(cache->descr); assert(res != NULL); assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); PUSH(self); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH(); @@ -2895,8 +2877,7 @@ PyObject *res = read_obj(cache->descr); assert(res != NULL); assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); PUSH(self); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH(); @@ -2918,8 +2899,7 @@ PyObject *res = read_obj(cache->descr); assert(res != NULL); assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); - Py_INCREF(res); - SET_TOP(res); + SET_TOP(Py_NewRef(res)); PUSH(self); JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); DISPATCH(); @@ -2930,12 +2910,10 @@ PyObject *function = PEEK(oparg + 1); DEOPT_IF(Py_TYPE(function) != &PyMethod_Type, CALL); STAT_INC(CALL, hit); - PyObject *meth = ((PyMethodObject *)function)->im_func; PyObject *self = ((PyMethodObject *)function)->im_self; - Py_INCREF(meth); - Py_INCREF(self); - PEEK(oparg + 1) = self; - PEEK(oparg + 2) = meth; + PEEK(oparg + 1) = Py_NewRef(self); + PyObject *meth = ((PyMethodObject *)function)->im_func; + PEEK(oparg + 2) = Py_NewRef(meth); Py_DECREF(function); GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS); } @@ -2965,12 +2943,10 @@ is_meth = is_method(stack_pointer, oparg); PyObject *function = PEEK(oparg + 1); if (!is_meth && Py_TYPE(function) == &PyMethod_Type) { - PyObject *meth = ((PyMethodObject *)function)->im_func; PyObject *self = ((PyMethodObject *)function)->im_self; - Py_INCREF(meth); - Py_INCREF(self); - PEEK(oparg+1) = self; - PEEK(oparg+2) = meth; + PEEK(oparg+1) = Py_NewRef(self); + PyObject *meth = ((PyMethodObject *)function)->im_func; + PEEK(oparg+2) = Py_NewRef(meth); Py_DECREF(function); is_meth = 1; } @@ -3093,8 +3069,7 @@ for (int i = argcount; i < code->co_argcount; i++) { PyObject *def = PyTuple_GET_ITEM(func->func_defaults, i - minargs); - Py_INCREF(def); - new_frame->localsplus[i] = def; + new_frame->localsplus[i] = Py_NewRef(def); } for (int i = code->co_argcount; i < code->co_nlocalsplus; i++) { new_frame->localsplus[i] = NULL; @@ -3724,8 +3699,7 @@ TARGET(COPY) { assert(oparg != 0); PyObject *peek = PEEK(oparg); - Py_INCREF(peek); - PUSH(peek); + PUSH(Py_NewRef(peek)); DISPATCH(); }