mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	GH-91079: Implement C stack limits using addresses, not counters. (GH-130007)
* Implement C recursion protection with limit pointers * Remove calls to PyOS_CheckStack * Add stack protection to parser * Make tests more robust to low stacks * Improve error messages for stack overflow
This commit is contained in:
		
							parent
							
								
									c637bce20a
								
							
						
					
					
						commit
						2498c22fa0
					
				
					 47 changed files with 1217 additions and 1463 deletions
				
			
		
							
								
								
									
										9
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -5426,14 +5426,13 @@ | |||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             // CPython promises to check all non-vectorcall function calls.
 | ||||
|             if (tstate->c_recursion_remaining <= 0) { | ||||
|             if (_Py_ReachedRecursionLimit(tstate)) { | ||||
|                 UOP_STAT_INC(uopcode, miss); | ||||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             STAT_INC(CALL, hit); | ||||
|             PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable_o); | ||||
|             _PyStackRef arg = args[0]; | ||||
|             _Py_EnterRecursiveCallTstateUnchecked(tstate); | ||||
|             _PyFrame_SetStackPointer(frame, stack_pointer); | ||||
|             PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, PyCFunction_GET_SELF(callable_o), PyStackRef_AsPyObjectBorrow(arg)); | ||||
|             stack_pointer = _PyFrame_GetStackPointer(frame); | ||||
|  | @ -5813,7 +5812,7 @@ | |||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             // CPython promises to check all non-vectorcall function calls.
 | ||||
|             if (tstate->c_recursion_remaining <= 0) { | ||||
|             if (_Py_ReachedRecursionLimit(tstate)) { | ||||
|                 UOP_STAT_INC(uopcode, miss); | ||||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|  | @ -5826,7 +5825,6 @@ | |||
|             } | ||||
|             STAT_INC(CALL, hit); | ||||
|             PyCFunction cfunc = meth->ml_meth; | ||||
|             _Py_EnterRecursiveCallTstateUnchecked(tstate); | ||||
|             _PyFrame_SetStackPointer(frame, stack_pointer); | ||||
|             PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, | ||||
|                 PyStackRef_AsPyObjectBorrow(self_stackref), | ||||
|  | @ -5984,13 +5982,12 @@ | |||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             // CPython promises to check all non-vectorcall function calls.
 | ||||
|             if (tstate->c_recursion_remaining <= 0) { | ||||
|             if (_Py_ReachedRecursionLimit(tstate)) { | ||||
|                 UOP_STAT_INC(uopcode, miss); | ||||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             STAT_INC(CALL, hit); | ||||
|             PyCFunction cfunc = meth->ml_meth; | ||||
|             _Py_EnterRecursiveCallTstateUnchecked(tstate); | ||||
|             _PyFrame_SetStackPointer(frame, stack_pointer); | ||||
|             PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, self, NULL); | ||||
|             stack_pointer = _PyFrame_GetStackPointer(frame); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Shannon
						Mark Shannon