mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Fix leak when an exception is raised during generator creation. (GH-29960)
This commit is contained in:
		
							parent
							
								
									d596acbd3b
								
							
						
					
					
						commit
						064e53d19a
					
				
					 1 changed files with 7 additions and 20 deletions
				
			
		|  | @ -5852,24 +5852,6 @@ initialize_locals(PyThreadState *tstate, PyFunctionObject *func, | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int |  | ||||||
| initialize_coro_frame(InterpreterFrame *frame, PyThreadState *tstate, |  | ||||||
|            PyFunctionObject *func, PyObject *locals, |  | ||||||
|            PyObject *const *args, Py_ssize_t argcount, |  | ||||||
|            PyObject *kwnames) |  | ||||||
| { |  | ||||||
|     assert(is_tstate_valid(tstate)); |  | ||||||
|     assert(func->func_defaults == NULL || PyTuple_CheckExact(func->func_defaults)); |  | ||||||
|     PyCodeObject *code = (PyCodeObject *)func->func_code; |  | ||||||
|     _PyFrame_InitializeSpecials(frame, func, locals, code->co_nlocalsplus); |  | ||||||
|     for (int i = 0; i < code->co_nlocalsplus; i++) { |  | ||||||
|         frame->localsplus[i] = NULL; |  | ||||||
|     } |  | ||||||
|     assert(frame->frame_obj == NULL); |  | ||||||
|     return initialize_locals(tstate, func, frame->localsplus, args, argcount, kwnames); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /* Consumes all the references to the args */ | /* Consumes all the references to the args */ | ||||||
| static PyObject * | static PyObject * | ||||||
| make_coro(PyThreadState *tstate, PyFunctionObject *func, | make_coro(PyThreadState *tstate, PyFunctionObject *func, | ||||||
|  | @ -5883,12 +5865,17 @@ make_coro(PyThreadState *tstate, PyFunctionObject *func, | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|     InterpreterFrame *frame = (InterpreterFrame *)((PyGenObject *)gen)->gi_iframe; |     InterpreterFrame *frame = (InterpreterFrame *)((PyGenObject *)gen)->gi_iframe; | ||||||
|     if (initialize_coro_frame(frame, tstate, func, locals, args, argcount, kwnames)) { |     PyCodeObject *code = (PyCodeObject *)func->func_code; | ||||||
|  |     _PyFrame_InitializeSpecials(frame, func, locals, code->co_nlocalsplus); | ||||||
|  |     for (int i = 0; i < code->co_nlocalsplus; i++) { | ||||||
|  |         frame->localsplus[i] = NULL; | ||||||
|  |     } | ||||||
|  |     ((PyGenObject *)gen)->gi_frame_valid = 1; | ||||||
|  |     if (initialize_locals(tstate, func, frame->localsplus, args, argcount, kwnames)) { | ||||||
|         Py_DECREF(gen); |         Py_DECREF(gen); | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|     frame->generator = gen; |     frame->generator = gen; | ||||||
|     ((PyGenObject *)gen)->gi_frame_valid = 1; |  | ||||||
|     return gen; |     return gen; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Shannon
						Mark Shannon