mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	GH-122034: Add StackRef variants of type checks to reduce the number of PyStackRef_AsPyObjectBorrow calls (GH-122037)
This commit is contained in:
		
							parent
							
								
									aef95eb107
								
							
						
					
					
						commit
						5e686ff57d
					
				
					 4 changed files with 60 additions and 27 deletions
				
			
		
							
								
								
									
										24
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										24
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -1078,7 +1078,7 @@ | |||
|                 assert(Py_TYPE(callable_o) == &PyMethod_Type); | ||||
|                 self = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self); | ||||
|                 method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func); | ||||
|                 assert(PyFunction_Check(PyStackRef_AsPyObjectBorrow(method))); | ||||
|                 assert(PyStackRef_FunctionCheck(method)); | ||||
|                 PyStackRef_CLOSE(callable); | ||||
|             } | ||||
|             // flush
 | ||||
|  | @ -3544,7 +3544,7 @@ | |||
|             receiver = stack_pointer[-2]; | ||||
|             /* Need to create a fake StopIteration error here,
 | ||||
|              * to conform to PEP 380 */ | ||||
|             if (PyGen_Check(PyStackRef_AsPyObjectBorrow(receiver))) { | ||||
|             if (PyStackRef_GenCheck(receiver)) { | ||||
|                 if (monitor_stop_iteration(tstate, frame, this_instr, PyStackRef_AsPyObjectBorrow(value))) { | ||||
|                     goto error; | ||||
|                 } | ||||
|  | @ -3667,7 +3667,7 @@ | |||
|             INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_FALSE); | ||||
|             /* Skip 1 cache entry */ | ||||
|             _PyStackRef cond = POP(); | ||||
|             assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond))); | ||||
|             assert(PyStackRef_BoolCheck(cond)); | ||||
|             int flag = PyStackRef_Is(cond, PyStackRef_False); | ||||
|             int offset = flag * oparg; | ||||
|             #if ENABLE_SPECIALIZATION | ||||
|  | @ -3730,7 +3730,7 @@ | |||
|             INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_TRUE); | ||||
|             /* Skip 1 cache entry */ | ||||
|             _PyStackRef cond = POP(); | ||||
|             assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond))); | ||||
|             assert(PyStackRef_BoolCheck(cond)); | ||||
|             int flag = PyStackRef_Is(cond, PyStackRef_True); | ||||
|             int offset = flag * oparg; | ||||
|             #if ENABLE_SPECIALIZATION | ||||
|  | @ -5329,7 +5329,7 @@ | |||
|             _PyStackRef cond; | ||||
|             /* Skip 1 cache entry */ | ||||
|             cond = stack_pointer[-1]; | ||||
|             assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond))); | ||||
|             assert(PyStackRef_BoolCheck(cond)); | ||||
|             int flag = PyStackRef_Is(cond, PyStackRef_False); | ||||
|             #if ENABLE_SPECIALIZATION | ||||
|             this_instr[1].cache = (this_instr[1].cache << 1) | flag; | ||||
|  | @ -5363,7 +5363,7 @@ | |||
|             // _POP_JUMP_IF_TRUE
 | ||||
|             cond = b; | ||||
|             { | ||||
|                 assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond))); | ||||
|                 assert(PyStackRef_BoolCheck(cond)); | ||||
|                 int flag = PyStackRef_Is(cond, PyStackRef_True); | ||||
|                 #if ENABLE_SPECIALIZATION | ||||
|                 this_instr[1].cache = (this_instr[1].cache << 1) | flag; | ||||
|  | @ -5398,7 +5398,7 @@ | |||
|             // _POP_JUMP_IF_FALSE
 | ||||
|             cond = b; | ||||
|             { | ||||
|                 assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond))); | ||||
|                 assert(PyStackRef_BoolCheck(cond)); | ||||
|                 int flag = PyStackRef_Is(cond, PyStackRef_False); | ||||
|                 #if ENABLE_SPECIALIZATION | ||||
|                 this_instr[1].cache = (this_instr[1].cache << 1) | flag; | ||||
|  | @ -5418,7 +5418,7 @@ | |||
|             _PyStackRef cond; | ||||
|             /* Skip 1 cache entry */ | ||||
|             cond = stack_pointer[-1]; | ||||
|             assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond))); | ||||
|             assert(PyStackRef_BoolCheck(cond)); | ||||
|             int flag = PyStackRef_Is(cond, PyStackRef_True); | ||||
|             #if ENABLE_SPECIALIZATION | ||||
|             this_instr[1].cache = (this_instr[1].cache << 1) | flag; | ||||
|  | @ -5455,7 +5455,7 @@ | |||
|             else { | ||||
|                 prev_exc = PyStackRef_None; | ||||
|             } | ||||
|             assert(PyExceptionInstance_Check(PyStackRef_AsPyObjectBorrow(new_exc))); | ||||
|             assert(PyStackRef_ExceptionInstanceCheck(new_exc)); | ||||
|             exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc); | ||||
|             stack_pointer[-1] = prev_exc; | ||||
|             stack_pointer[0] = new_exc; | ||||
|  | @ -6418,7 +6418,7 @@ | |||
|             /* Skip 1 cache entry */ | ||||
|             /* Skip 2 cache entries */ | ||||
|             value = stack_pointer[-1]; | ||||
|             DEOPT_IF(!PyBool_Check(PyStackRef_AsPyObjectBorrow(value)), TO_BOOL); | ||||
|             DEOPT_IF(!PyStackRef_BoolCheck(value), TO_BOOL); | ||||
|             STAT_INC(TO_BOOL, hit); | ||||
|             DISPATCH(); | ||||
|         } | ||||
|  | @ -6548,7 +6548,7 @@ | |||
|             _PyStackRef value; | ||||
|             _PyStackRef res; | ||||
|             value = stack_pointer[-1]; | ||||
|             assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(value))); | ||||
|             assert(PyStackRef_BoolCheck(value)); | ||||
|             res = PyStackRef_Is(value, PyStackRef_False) | ||||
|             ? PyStackRef_True : PyStackRef_False; | ||||
|             stack_pointer[-1] = res; | ||||
|  | @ -6715,7 +6715,7 @@ | |||
|             else { | ||||
|                 Py_DECREF(tb); | ||||
|             } | ||||
|             assert(PyLong_Check(PyStackRef_AsPyObjectBorrow(lasti))); | ||||
|             assert(PyStackRef_LongCheck(lasti)); | ||||
|             (void)lasti; // Shut up compiler warning if asserts are off
 | ||||
|             PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb}; | ||||
|             int has_self = !PyStackRef_IsNull(exit_self); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Shannon
						Mark Shannon