mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	gh-125323: Remove some unsafe Py_DECREFs in bytecodes.c, replacing them with PyStackRef_CLOSEs (GH-125324)
This commit is contained in:
		
							parent
							
								
									b52c7306ea
								
							
						
					
					
						commit
						4b358ee647
					
				
					 6 changed files with 65 additions and 60 deletions
				
			
		|  | @ -474,8 +474,8 @@ dummy_func( | |||
| 
 | ||||
|             STAT_INC(BINARY_OP, hit); | ||||
|             PyObject *res_o = _PyLong_Multiply((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|             INPUTS_DEAD(); | ||||
|             ERROR_IF(res_o == NULL, error); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|  | @ -487,8 +487,8 @@ dummy_func( | |||
| 
 | ||||
|             STAT_INC(BINARY_OP, hit); | ||||
|             PyObject *res_o = _PyLong_Add((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|             INPUTS_DEAD(); | ||||
|             ERROR_IF(res_o == NULL, error); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|  | @ -500,8 +500,8 @@ dummy_func( | |||
| 
 | ||||
|             STAT_INC(BINARY_OP, hit); | ||||
|             PyObject *res_o = _PyLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|             INPUTS_DEAD(); | ||||
|             ERROR_IF(res_o == NULL, error); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|  | @ -594,8 +594,8 @@ dummy_func( | |||
| 
 | ||||
|             STAT_INC(BINARY_OP, hit); | ||||
|             PyObject *res_o = PyUnicode_Concat(left_o, right_o); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, _PyUnicode_ExactDealloc); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|             INPUTS_DEAD(); | ||||
|             ERROR_IF(res_o == NULL, error); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|  | @ -636,12 +636,12 @@ dummy_func( | |||
|              * that the string is safe to mutate. | ||||
|              */ | ||||
|             assert(Py_REFCNT(left_o) >= 2); | ||||
|             _Py_DECREF_NO_DEALLOC(left_o); | ||||
|             PyStackRef_CLOSE(left); | ||||
|             DEAD(left); | ||||
|             PyObject *temp = PyStackRef_AsPyObjectBorrow(*target_local); | ||||
|             PyUnicode_Append(&temp, right_o); | ||||
|             *target_local = PyStackRef_FromPyObjectSteal(temp); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|             DEAD(right); | ||||
|             ERROR_IF(PyStackRef_IsNull(*target_local), error); | ||||
|         #if TIER_ONE | ||||
|  | @ -755,7 +755,7 @@ dummy_func( | |||
|             PyObject *res_o = PyList_GET_ITEM(list, index); | ||||
|             assert(res_o != NULL); | ||||
|             Py_INCREF(res_o); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             DEAD(sub_st); | ||||
|             PyStackRef_CLOSE(list_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|  | @ -775,7 +775,7 @@ dummy_func( | |||
|             DEOPT_IF(Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c); | ||||
|             STAT_INC(BINARY_SUBSCR, hit); | ||||
|             PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c]; | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             DEAD(sub_st); | ||||
|             PyStackRef_CLOSE(str_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|  | @ -796,7 +796,7 @@ dummy_func( | |||
|             PyObject *res_o = PyTuple_GET_ITEM(tuple, index); | ||||
|             assert(res_o != NULL); | ||||
|             Py_INCREF(res_o); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             DEAD(sub_st); | ||||
|             PyStackRef_CLOSE(tuple_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|  | @ -908,7 +908,7 @@ dummy_func( | |||
|             PyList_SET_ITEM(list, index, PyStackRef_AsPyObjectSteal(value)); | ||||
|             assert(old_value != NULL); | ||||
|             Py_DECREF(old_value); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             DEAD(sub_st); | ||||
|             PyStackRef_CLOSE(list_st); | ||||
|         } | ||||
|  | @ -2398,9 +2398,9 @@ dummy_func( | |||
|             double dright = PyFloat_AS_DOUBLE(right_o); | ||||
|             // 1 if NaN, 2 if <, 4 if >, 8 if ==; this matches low four bits of the oparg
 | ||||
|             int sign_ish = COMPARISON_BIT(dleft, dright); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, _PyFloat_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, _PyFloat_ExactDealloc); | ||||
|             DEAD(left); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, _PyFloat_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, _PyFloat_ExactDealloc); | ||||
|             DEAD(right); | ||||
|             res = (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False; | ||||
|             // It's always a bool, so we don't care about oparg & 16.
 | ||||
|  | @ -2420,9 +2420,9 @@ dummy_func( | |||
|             Py_ssize_t iright = _PyLong_CompactValue((PyLongObject *)right_o); | ||||
|             // 2 if <, 4 if >, 8 if ==; this matches the low 4 bits of the oparg
 | ||||
|             int sign_ish = COMPARISON_BIT(ileft, iright); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|             DEAD(left); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|             DEAD(right); | ||||
|             res =  (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False; | ||||
|             // It's always a bool, so we don't care about oparg & 16.
 | ||||
|  | @ -2436,9 +2436,9 @@ dummy_func( | |||
|             STAT_INC(COMPARE_OP, hit); | ||||
|             int eq = _PyUnicode_Equal(left_o, right_o); | ||||
|             assert((oparg >> 5) == Py_EQ || (oparg >> 5) == Py_NE); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, _PyUnicode_ExactDealloc); | ||||
|             DEAD(left); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|             DEAD(right); | ||||
|             assert(eq == 0 || eq == 1); | ||||
|             assert((oparg & 0xf) == COMPARISON_NOT_EQUALS || (oparg & 0xf) == COMPARISON_EQUALS); | ||||
|  |  | |||
							
								
								
									
										40
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										40
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -541,8 +541,8 @@ | |||
|             PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); | ||||
|             STAT_INC(BINARY_OP, hit); | ||||
|             PyObject *res_o = _PyLong_Multiply((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|             if (res_o == NULL) JUMP_TO_ERROR(); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -561,8 +561,8 @@ | |||
|             PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); | ||||
|             STAT_INC(BINARY_OP, hit); | ||||
|             PyObject *res_o = _PyLong_Add((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|             if (res_o == NULL) JUMP_TO_ERROR(); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -581,8 +581,8 @@ | |||
|             PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); | ||||
|             STAT_INC(BINARY_OP, hit); | ||||
|             PyObject *res_o = _PyLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|             if (res_o == NULL) JUMP_TO_ERROR(); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -722,8 +722,8 @@ | |||
|             PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); | ||||
|             STAT_INC(BINARY_OP, hit); | ||||
|             PyObject *res_o = PyUnicode_Concat(left_o, right_o); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, _PyUnicode_ExactDealloc); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|             if (res_o == NULL) JUMP_TO_ERROR(); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -764,11 +764,11 @@ | |||
|              * that the string is safe to mutate. | ||||
|              */ | ||||
|             assert(Py_REFCNT(left_o) >= 2); | ||||
|             _Py_DECREF_NO_DEALLOC(left_o); | ||||
|             PyStackRef_CLOSE(left); | ||||
|             PyObject *temp = PyStackRef_AsPyObjectBorrow(*target_local); | ||||
|             PyUnicode_Append(&temp, right_o); | ||||
|             *target_local = PyStackRef_FromPyObjectSteal(temp); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|             if (PyStackRef_IsNull(*target_local)) JUMP_TO_ERROR(); | ||||
|             #if TIER_ONE | ||||
|             // The STORE_FAST is already done. This is done here in tier one,
 | ||||
|  | @ -904,7 +904,7 @@ | |||
|             PyObject *res_o = PyList_GET_ITEM(list, index); | ||||
|             assert(res_o != NULL); | ||||
|             Py_INCREF(res_o); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE(list_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -946,7 +946,7 @@ | |||
|             } | ||||
|             STAT_INC(BINARY_SUBSCR, hit); | ||||
|             PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c]; | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE(str_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -985,7 +985,7 @@ | |||
|             PyObject *res_o = PyTuple_GET_ITEM(tuple, index); | ||||
|             assert(res_o != NULL); | ||||
|             Py_INCREF(res_o); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE(tuple_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -1160,7 +1160,7 @@ | |||
|             PyList_SET_ITEM(list, index, PyStackRef_AsPyObjectSteal(value)); | ||||
|             assert(old_value != NULL); | ||||
|             Py_DECREF(old_value); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE(list_st); | ||||
|             stack_pointer += -3; | ||||
|             assert(WITHIN_STACK_BOUNDS()); | ||||
|  | @ -2912,8 +2912,8 @@ | |||
|             double dright = PyFloat_AS_DOUBLE(right_o); | ||||
|             // 1 if NaN, 2 if <, 4 if >, 8 if ==; this matches low four bits of the oparg
 | ||||
|             int sign_ish = COMPARISON_BIT(dleft, dright); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, _PyFloat_ExactDealloc); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, _PyFloat_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, _PyFloat_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, _PyFloat_ExactDealloc); | ||||
|             res = (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False; | ||||
|             // It's always a bool, so we don't care about oparg & 16.
 | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -2946,8 +2946,8 @@ | |||
|             Py_ssize_t iright = _PyLong_CompactValue((PyLongObject *)right_o); | ||||
|             // 2 if <, 4 if >, 8 if ==; this matches the low 4 bits of the oparg
 | ||||
|             int sign_ish = COMPARISON_BIT(ileft, iright); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|             res =  (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False; | ||||
|             // It's always a bool, so we don't care about oparg & 16.
 | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -2968,8 +2968,8 @@ | |||
|             STAT_INC(COMPARE_OP, hit); | ||||
|             int eq = _PyUnicode_Equal(left_o, right_o); | ||||
|             assert((oparg >> 5) == Py_EQ || (oparg >> 5) == Py_NE); | ||||
|             _Py_DECREF_SPECIALIZED(left_o, _PyUnicode_ExactDealloc); | ||||
|             _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(left, _PyUnicode_ExactDealloc); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|             assert(eq == 0 || eq == 1); | ||||
|             assert((oparg & 0xf) == COMPARISON_NOT_EQUALS || (oparg & 0xf) == COMPARISON_EQUALS); | ||||
|             assert(COMPARISON_NOT_EQUALS + 1 == COMPARISON_EQUALS); | ||||
|  |  | |||
							
								
								
									
										40
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										40
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -118,8 +118,8 @@ | |||
|                 PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); | ||||
|                 STAT_INC(BINARY_OP, hit); | ||||
|                 PyObject *res_o = _PyLong_Add((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|                 _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|                 _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|                 if (res_o == NULL) goto pop_2_error; | ||||
|                 res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             } | ||||
|  | @ -153,8 +153,8 @@ | |||
|                 PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); | ||||
|                 STAT_INC(BINARY_OP, hit); | ||||
|                 PyObject *res_o = PyUnicode_Concat(left_o, right_o); | ||||
|                 _Py_DECREF_SPECIALIZED(left_o, _PyUnicode_ExactDealloc); | ||||
|                 _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(left, _PyUnicode_ExactDealloc); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|                 if (res_o == NULL) goto pop_2_error; | ||||
|                 res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             } | ||||
|  | @ -207,11 +207,11 @@ | |||
|                  * that the string is safe to mutate. | ||||
|                  */ | ||||
|                 assert(Py_REFCNT(left_o) >= 2); | ||||
|                 _Py_DECREF_NO_DEALLOC(left_o); | ||||
|                 PyStackRef_CLOSE(left); | ||||
|                 PyObject *temp = PyStackRef_AsPyObjectBorrow(*target_local); | ||||
|                 PyUnicode_Append(&temp, right_o); | ||||
|                 *target_local = PyStackRef_FromPyObjectSteal(temp); | ||||
|                 _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|                 if (PyStackRef_IsNull(*target_local)) goto pop_2_error; | ||||
|                 #if TIER_ONE | ||||
|                 // The STORE_FAST is already done. This is done here in tier one,
 | ||||
|  | @ -285,8 +285,8 @@ | |||
|                 PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); | ||||
|                 STAT_INC(BINARY_OP, hit); | ||||
|                 PyObject *res_o = _PyLong_Multiply((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|                 _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|                 _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|                 if (res_o == NULL) goto pop_2_error; | ||||
|                 res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             } | ||||
|  | @ -356,8 +356,8 @@ | |||
|                 PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); | ||||
|                 STAT_INC(BINARY_OP, hit); | ||||
|                 PyObject *res_o = _PyLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o); | ||||
|                 _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|                 _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|                 if (res_o == NULL) goto pop_2_error; | ||||
|                 res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             } | ||||
|  | @ -582,7 +582,7 @@ | |||
|             PyObject *res_o = PyList_GET_ITEM(list, index); | ||||
|             assert(res_o != NULL); | ||||
|             Py_INCREF(res_o); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE(list_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -614,7 +614,7 @@ | |||
|             DEOPT_IF(Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c, BINARY_SUBSCR); | ||||
|             STAT_INC(BINARY_SUBSCR, hit); | ||||
|             PyObject *res_o = (PyObject*)&_Py_SINGLETON(strings).ascii[c]; | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE(str_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -646,7 +646,7 @@ | |||
|             PyObject *res_o = PyTuple_GET_ITEM(tuple, index); | ||||
|             assert(res_o != NULL); | ||||
|             Py_INCREF(res_o); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE(tuple_st); | ||||
|             res = PyStackRef_FromPyObjectSteal(res_o); | ||||
|             stack_pointer[-2] = res; | ||||
|  | @ -3284,8 +3284,8 @@ | |||
|                 double dright = PyFloat_AS_DOUBLE(right_o); | ||||
|                 // 1 if NaN, 2 if <, 4 if >, 8 if ==; this matches low four bits of the oparg
 | ||||
|                 int sign_ish = COMPARISON_BIT(dleft, dright); | ||||
|                 _Py_DECREF_SPECIALIZED(left_o, _PyFloat_ExactDealloc); | ||||
|                 _Py_DECREF_SPECIALIZED(right_o, _PyFloat_ExactDealloc); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(left, _PyFloat_ExactDealloc); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(right, _PyFloat_ExactDealloc); | ||||
|                 res = (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False; | ||||
|                 // It's always a bool, so we don't care about oparg & 16.
 | ||||
|             } | ||||
|  | @ -3326,8 +3326,8 @@ | |||
|                 Py_ssize_t iright = _PyLong_CompactValue((PyLongObject *)right_o); | ||||
|                 // 2 if <, 4 if >, 8 if ==; this matches the low 4 bits of the oparg
 | ||||
|                 int sign_ish = COMPARISON_BIT(ileft, iright); | ||||
|                 _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free); | ||||
|                 _Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(left, (destructor)PyObject_Free); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(right, (destructor)PyObject_Free); | ||||
|                 res =  (sign_ish & oparg) ? PyStackRef_True : PyStackRef_False; | ||||
|                 // It's always a bool, so we don't care about oparg & 16.
 | ||||
|             } | ||||
|  | @ -3362,8 +3362,8 @@ | |||
|                 STAT_INC(COMPARE_OP, hit); | ||||
|                 int eq = _PyUnicode_Equal(left_o, right_o); | ||||
|                 assert((oparg >> 5) == Py_EQ || (oparg >> 5) == Py_NE); | ||||
|                 _Py_DECREF_SPECIALIZED(left_o, _PyUnicode_ExactDealloc); | ||||
|                 _Py_DECREF_SPECIALIZED(right_o, _PyUnicode_ExactDealloc); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(left, _PyUnicode_ExactDealloc); | ||||
|                 PyStackRef_CLOSE_SPECIALIZED(right, _PyUnicode_ExactDealloc); | ||||
|                 assert(eq == 0 || eq == 1); | ||||
|                 assert((oparg & 0xf) == COMPARISON_NOT_EQUALS || (oparg & 0xf) == COMPARISON_EQUALS); | ||||
|                 assert(COMPARISON_NOT_EQUALS + 1 == COMPARISON_EQUALS); | ||||
|  | @ -7720,7 +7720,7 @@ | |||
|             PyList_SET_ITEM(list, index, PyStackRef_AsPyObjectSteal(value)); | ||||
|             assert(old_value != NULL); | ||||
|             Py_DECREF(old_value); | ||||
|             _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||
|             PyStackRef_CLOSE(list_st); | ||||
|             stack_pointer += -3; | ||||
|             assert(WITHIN_STACK_BOUNDS()); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ken Jin
						Ken Jin