@@ -33,16 +33,28 @@ typedef struct {
3333typedef struct {
3434 uint16_t opcode ;
3535 uint16_t oparg ;
36- uint32_t target ;
36+ union {
37+ uint32_t target ;
38+ uint32_t exit_index ;
39+ };
3740 uint64_t operand ; // A cache entry
3841} _PyUOpInstruction ;
3942
43+ typedef struct _exit_data {
44+ uint32_t target ;
45+ int16_t temperature ;
46+ const struct _PyExecutorObject * executor ;
47+ } _PyExitData ;
48+
4049typedef struct _PyExecutorObject {
4150 PyObject_VAR_HEAD
51+ const _PyUOpInstruction * trace ;
4252 _PyVMData vm_data ; /* Used by the VM, but opaque to the optimizer */
43- void * jit_code ;
53+ uint32_t exit_count ;
54+ uint32_t code_size ;
4455 size_t jit_size ;
45- _PyUOpInstruction trace [1 ];
56+ void * jit_code ;
57+ _PyExitData exits [1 ];
4658} _PyExecutorObject ;
4759
4860typedef struct _PyOptimizerObject _PyOptimizerObject ;
@@ -59,6 +71,7 @@ typedef struct _PyOptimizerObject {
5971 /* These thresholds are treated as signed so do not exceed INT16_MAX
6072 * Use INT16_MAX to indicate that the optimizer should never be called */
6173 uint16_t resume_threshold ;
74+ uint16_t side_threshold ;
6275 uint16_t backedge_threshold ;
6376 /* Data needed by the optimizer goes here, but is opaque to the VM */
6477} _PyOptimizerObject ;
@@ -73,16 +86,16 @@ PyAPI_FUNC(int) PyUnstable_Replace_Executor(PyCodeObject *code, _Py_CODEUNIT *in
7386
7487_PyOptimizerObject * _Py_SetOptimizer (PyInterpreterState * interp , _PyOptimizerObject * optimizer );
7588
76- PyAPI_FUNC (void ) PyUnstable_SetOptimizer (_PyOptimizerObject * optimizer );
89+ PyAPI_FUNC (int ) PyUnstable_SetOptimizer (_PyOptimizerObject * optimizer );
7790
7891PyAPI_FUNC (_PyOptimizerObject * ) PyUnstable_GetOptimizer (void );
7992
8093PyAPI_FUNC (_PyExecutorObject * ) PyUnstable_GetExecutor (PyCodeObject * code , int offset );
8194
8295int
83- _PyOptimizer_Optimize (struct _PyInterpreterFrame * frame , _Py_CODEUNIT * start , PyObject * * stack_pointer );
96+ _PyOptimizer_Optimize (struct _PyInterpreterFrame * frame , _Py_CODEUNIT * start , PyObject * * stack_pointer , _PyExecutorObject * * exec_ptr );
8497
85- void _Py_ExecutorInit (_PyExecutorObject * , _PyBloomFilter * );
98+ void _Py_ExecutorInit (_PyExecutorObject * , const _PyBloomFilter * );
8699void _Py_ExecutorClear (_PyExecutorObject * );
87100void _Py_BloomFilter_Init (_PyBloomFilter * );
88101void _Py_BloomFilter_Add (_PyBloomFilter * bloom , void * obj );
0 commit comments