mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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; | ||||
| } | ||||
| 
 | ||||
| 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 */ | ||||
| static PyObject * | ||||
| make_coro(PyThreadState *tstate, PyFunctionObject *func, | ||||
|  | @ -5883,12 +5865,17 @@ make_coro(PyThreadState *tstate, PyFunctionObject *func, | |||
|         return NULL; | ||||
|     } | ||||
|     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); | ||||
|         return NULL; | ||||
|     } | ||||
|     frame->generator = gen; | ||||
|     ((PyGenObject *)gen)->gi_frame_valid = 1; | ||||
|     return gen; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Shannon
						Mark Shannon