mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	GH-134282: Always borrow references LOAD_CONST (GH-134284)
This commit is contained in:
		
							parent
							
								
									f695eca60c
								
							
						
					
					
						commit
						6dcb0fdfe0
					
				
					 17 changed files with 87 additions and 327 deletions
				
			
		|  | @ -295,55 +295,18 @@ dummy_func( | |||
|             value2 = PyStackRef_Borrow(GETLOCAL(oparg2)); | ||||
|         } | ||||
| 
 | ||||
|         family(LOAD_CONST, 0) = { | ||||
|             LOAD_CONST_MORTAL, | ||||
|             LOAD_CONST_IMMORTAL, | ||||
|         }; | ||||
| 
 | ||||
|         inst(LOAD_CONST, (-- value)) { | ||||
|             /* We can't do this in the bytecode compiler as
 | ||||
|              * marshalling can intern strings and make them immortal. */ | ||||
|             PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg); | ||||
|             value = PyStackRef_FromPyObjectNew(obj); | ||||
| #if ENABLE_SPECIALIZATION_FT | ||||
| #ifdef Py_GIL_DISABLED | ||||
|             uint8_t expected = LOAD_CONST; | ||||
|             if (!_Py_atomic_compare_exchange_uint8( | ||||
|                     &this_instr->op.code, &expected, | ||||
|                     _Py_IsImmortal(obj) ? LOAD_CONST_IMMORTAL : LOAD_CONST_MORTAL)) { | ||||
|                 // We might lose a race with instrumentation, which we don't care about.
 | ||||
|                 assert(expected >= MIN_INSTRUMENTED_OPCODE); | ||||
|             } | ||||
| #else | ||||
|             if (this_instr->op.code == LOAD_CONST) { | ||||
|                 this_instr->op.code = _Py_IsImmortal(obj) ? LOAD_CONST_IMMORTAL : LOAD_CONST_MORTAL; | ||||
|             } | ||||
| #endif | ||||
| #endif | ||||
|         } | ||||
| 
 | ||||
|         inst(LOAD_CONST_MORTAL, (-- value)) { | ||||
|             PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg); | ||||
|             value = PyStackRef_FromPyObjectNewMortal(obj); | ||||
|         } | ||||
| 
 | ||||
|         inst(LOAD_CONST_IMMORTAL, (-- value)) { | ||||
|             PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg); | ||||
|             assert(_Py_IsImmortal(obj)); | ||||
|             value = PyStackRef_FromPyObjectImmortal(obj); | ||||
|             value = PyStackRef_FromPyObjectBorrow(obj); | ||||
|         } | ||||
| 
 | ||||
|         replicate(4) inst(LOAD_SMALL_INT, (-- value)) { | ||||
|             assert(oparg < _PY_NSMALLPOSINTS); | ||||
|             PyObject *obj = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + oparg]; | ||||
|             value = PyStackRef_FromPyObjectImmortal(obj); | ||||
|             value = PyStackRef_FromPyObjectBorrow(obj); | ||||
|         } | ||||
| 
 | ||||
|         replicate(8) inst(STORE_FAST, (value --)) { | ||||
|             assert( | ||||
|                 ((_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_GENERATOR)) == 0) || | ||||
|                 PyStackRef_IsHeapSafe(value) | ||||
|             ); | ||||
|             _PyStackRef tmp = GETLOCAL(oparg); | ||||
|             GETLOCAL(oparg) = value; | ||||
|             DEAD(value); | ||||
|  | @ -355,10 +318,6 @@ dummy_func( | |||
|         }; | ||||
| 
 | ||||
|         inst(STORE_FAST_LOAD_FAST, (value1 -- value2)) { | ||||
|             assert( | ||||
|                 ((_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_GENERATOR)) == 0) || | ||||
|                 PyStackRef_IsHeapSafe(value1) | ||||
|             ); | ||||
|             uint32_t oparg1 = oparg >> 4; | ||||
|             uint32_t oparg2 = oparg & 15; | ||||
|             _PyStackRef tmp = GETLOCAL(oparg1); | ||||
|  | @ -369,14 +328,6 @@ dummy_func( | |||
|         } | ||||
| 
 | ||||
|         inst(STORE_FAST_STORE_FAST, (value2, value1 --)) { | ||||
|             assert( | ||||
|                 ((_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_GENERATOR)) == 0) || | ||||
|                 PyStackRef_IsHeapSafe(value1) | ||||
|             ); | ||||
|             assert( | ||||
|                 ((_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_GENERATOR)) == 0) || | ||||
|                 PyStackRef_IsHeapSafe(value2) | ||||
|             ); | ||||
|             uint32_t oparg1 = oparg >> 4; | ||||
|             uint32_t oparg2 = oparg & 15; | ||||
|             _PyStackRef tmp = GETLOCAL(oparg1); | ||||
|  | @ -942,7 +893,7 @@ dummy_func( | |||
|             PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc); | ||||
|             DEAD(sub_st); | ||||
|             PyStackRef_CLOSE(str_st); | ||||
|             res = PyStackRef_FromPyObjectImmortal(res_o); | ||||
|             res = PyStackRef_FromPyObjectBorrow(res_o); | ||||
|         } | ||||
| 
 | ||||
|         op(_GUARD_NOS_TUPLE, (nos, unused -- nos, unused)) { | ||||
|  | @ -5328,18 +5279,18 @@ dummy_func( | |||
|         } | ||||
| 
 | ||||
|         tier2 pure op(_LOAD_CONST_INLINE_BORROW, (ptr/4 -- value)) { | ||||
|             value = PyStackRef_FromPyObjectImmortal(ptr); | ||||
|             value = PyStackRef_FromPyObjectBorrow(ptr); | ||||
|         } | ||||
| 
 | ||||
|         tier2 pure op (_POP_TOP_LOAD_CONST_INLINE_BORROW, (ptr/4, pop -- value)) { | ||||
|             PyStackRef_CLOSE(pop); | ||||
|             value = PyStackRef_FromPyObjectImmortal(ptr); | ||||
|             value = PyStackRef_FromPyObjectBorrow(ptr); | ||||
|         } | ||||
| 
 | ||||
|         tier2 pure op(_POP_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, pop1, pop2 -- value)) { | ||||
|             PyStackRef_CLOSE(pop2); | ||||
|             PyStackRef_CLOSE(pop1); | ||||
|             value = PyStackRef_FromPyObjectImmortal(ptr); | ||||
|             value = PyStackRef_FromPyObjectBorrow(ptr); | ||||
|         } | ||||
| 
 | ||||
|         tier2 pure op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, pop1, pop2 -- value)) { | ||||
|  | @ -5348,7 +5299,7 @@ dummy_func( | |||
|             (void)null; // Silence compiler warnings about unused variables
 | ||||
|             DEAD(null); | ||||
|             PyStackRef_CLOSE(callable); | ||||
|             value = PyStackRef_FromPyObjectImmortal(ptr); | ||||
|             value = PyStackRef_FromPyObjectBorrow(ptr); | ||||
|         } | ||||
| 
 | ||||
|         tier2 op(_CHECK_FUNCTION, (func_version/2 -- )) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Shannon
						Mark Shannon