@@ -1781,30 +1781,33 @@ code_richcompare(PyObject *self, PyObject *other, int op)
1781
1781
for (int i = 0 ; i < Py_SIZE (co ); i ++ ) {
1782
1782
_Py_CODEUNIT co_instr = _PyCode_CODE (co )[i ];
1783
1783
_Py_CODEUNIT cp_instr = _PyCode_CODE (cp )[i ];
1784
+ uint8_t co_code = co_instr .op .code ;
1785
+ uint8_t co_arg = co_instr .op .arg ;
1786
+ uint8_t cp_code = cp_instr .op .code ;
1787
+ uint8_t cp_arg = cp_instr .op .arg ;
1784
1788
1785
- if (co_instr . op . code == ENTER_EXECUTOR ) {
1786
- const int exec_index = co_instr . op . arg ;
1789
+ if (co_code == ENTER_EXECUTOR ) {
1790
+ const int exec_index = co_arg ;
1787
1791
_PyExecutorObject * exec = co -> co_executors -> executors [exec_index ];
1788
- co_instr . op . code = exec -> vm_data .opcode ;
1789
- co_instr . op . arg = exec -> vm_data .oparg ;
1792
+ co_code = exec -> vm_data .opcode ;
1793
+ co_arg = exec -> vm_data .oparg ;
1790
1794
}
1791
- assert (co_instr . op . code != ENTER_EXECUTOR );
1792
- co_instr . op . code = _PyOpcode_Deopt [co_instr . op . code ];
1795
+ assert (co_code != ENTER_EXECUTOR );
1796
+ co_code = _PyOpcode_Deopt [co_code ];
1793
1797
1794
- if (cp_instr . op . code == ENTER_EXECUTOR ) {
1795
- const int exec_index = cp_instr . op . arg ;
1798
+ if (cp_code == ENTER_EXECUTOR ) {
1799
+ const int exec_index = cp_arg ;
1796
1800
_PyExecutorObject * exec = cp -> co_executors -> executors [exec_index ];
1797
- cp_instr . op . code = exec -> vm_data .opcode ;
1798
- cp_instr . op . arg = exec -> vm_data .oparg ;
1801
+ cp_code = exec -> vm_data .opcode ;
1802
+ cp_arg = exec -> vm_data .oparg ;
1799
1803
}
1800
- assert (cp_instr . op . code != ENTER_EXECUTOR );
1801
- cp_instr . op . code = _PyOpcode_Deopt [cp_instr . op . code ];
1804
+ assert (cp_code != ENTER_EXECUTOR );
1805
+ cp_code = _PyOpcode_Deopt [cp_code ];
1802
1806
1803
- eq = co_instr .cache == cp_instr .cache ;
1804
- if (!eq ) {
1807
+ if (co_code != cp_code || co_arg != cp_arg ) {
1805
1808
goto unequal ;
1806
1809
}
1807
- i += _PyOpcode_Caches [co_instr . op . code ];
1810
+ i += _PyOpcode_Caches [co_code ];
1808
1811
}
1809
1812
1810
1813
/* compare constants */
@@ -1883,10 +1886,22 @@ code_hash(PyCodeObject *co)
1883
1886
SCRAMBLE_IN (co -> co_firstlineno );
1884
1887
SCRAMBLE_IN (Py_SIZE (co ));
1885
1888
for (int i = 0 ; i < Py_SIZE (co ); i ++ ) {
1886
- int deop = _Py_GetBaseOpcode (co , i );
1887
- SCRAMBLE_IN (deop );
1888
- SCRAMBLE_IN (_PyCode_CODE (co )[i ].op .arg );
1889
- i += _PyOpcode_Caches [deop ];
1889
+ _Py_CODEUNIT co_instr = _PyCode_CODE (co )[i ];
1890
+ uint8_t co_code = co_instr .op .code ;
1891
+ uint8_t co_arg = co_instr .op .arg ;
1892
+ if (co_code == ENTER_EXECUTOR ) {
1893
+ _PyExecutorObject * exec = co -> co_executors -> executors [co_arg ];
1894
+ assert (exec != NULL );
1895
+ assert (exec -> vm_data .opcode != ENTER_EXECUTOR );
1896
+ co_code = _PyOpcode_Deopt [exec -> vm_data .opcode ];
1897
+ co_arg = exec -> vm_data .oparg ;
1898
+ }
1899
+ else {
1900
+ co_code = _Py_GetBaseOpcode (co , i );
1901
+ }
1902
+ SCRAMBLE_IN (co_code );
1903
+ SCRAMBLE_IN (co_arg );
1904
+ i += _PyOpcode_Caches [co_code ];
1890
1905
}
1891
1906
if ((Py_hash_t )uhash == -1 ) {
1892
1907
return -2 ;
0 commit comments