@@ -1350,23 +1350,29 @@ _PyCode_GetFreevars(PyCodeObject *co)
13501350 return get_localsplus_names (co , CO_FAST_FREE , co -> co_nfreevars );
13511351}
13521352
1353- PyObject *
1354- _PyCode_GetCode ( PyCodeObject * co )
1353+ static void
1354+ deopt_code ( _Py_CODEUNIT * instructions , Py_ssize_t len )
13551355{
1356- PyObject * code = PyBytes_FromStringAndSize (NULL , _PyCode_NBYTES (co ));
1357- if (code == NULL ) {
1358- return NULL ;
1359- }
1360- _Py_CODEUNIT * instructions = (_Py_CODEUNIT * )PyBytes_AS_STRING (code );
1361- for (int i = 0 ; i < Py_SIZE (co ); i ++ ) {
1362- _Py_CODEUNIT instruction = _PyCode_CODE (co )[i ];
1363- int opcode = _PyOpcode_Deopt [_Py_OPCODE (instruction )];
1356+ for (int i = 0 ; i < len ; i ++ ) {
1357+ _Py_CODEUNIT instruction = instructions [i ];
1358+ int opcode = _PyOpcode_Original [_Py_OPCODE (instruction )];
13641359 int caches = _PyOpcode_Caches [opcode ];
13651360 instructions [i ] = _Py_MAKECODEUNIT (opcode , _Py_OPARG (instruction ));
13661361 while (caches -- ) {
13671362 instructions [++ i ] = _Py_MAKECODEUNIT (CACHE , 0 );
13681363 }
13691364 }
1365+ }
1366+
1367+ PyObject *
1368+ _PyCode_GetCode (PyCodeObject * co )
1369+ {
1370+ PyObject * code = PyBytes_FromStringAndSize ((const char * )_PyCode_CODE (co ),
1371+ _PyCode_NBYTES (co ));
1372+ if (code == NULL ) {
1373+ return NULL ;
1374+ }
1375+ deopt_code ((_Py_CODEUNIT * )PyBytes_AS_STRING (code ), Py_SIZE (co ));
13701376 return code ;
13711377}
13721378
@@ -2076,6 +2082,7 @@ _PyStaticCode_Dealloc(PyCodeObject *co)
20762082 if (co -> co_warmup == 0 ) {
20772083 _Py_QuickenedCount -- ;
20782084 }
2085+ deopt_code (_PyCode_CODE (co ), Py_SIZE (co ));
20792086 co -> co_warmup = QUICKENING_INITIAL_WARMUP_VALUE ;
20802087 PyMem_Free (co -> co_extra );
20812088 co -> co_extra = NULL ;
0 commit comments