GH-104584: Allow optimizers to opt out of optimizing. (GH-105244)

This commit is contained in:
Mark Shannon 2023-06-05 09:44:23 +01:00 committed by GitHub
parent 9efaff5fd3
commit e8ecb9ee6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 12 deletions

View File

@ -21,7 +21,8 @@ typedef struct _PyExecutorObject {
typedef struct _PyOptimizerObject _PyOptimizerObject; typedef struct _PyOptimizerObject _PyOptimizerObject;
typedef _PyExecutorObject *(*optimize_func)(_PyOptimizerObject* self, PyCodeObject *code, _Py_CODEUNIT *instr); /* Should return > 0 if a new executor is created. O if no executor is produced and < 0 if an error occurred. */
typedef int (*optimize_func)(_PyOptimizerObject* self, PyCodeObject *code, _Py_CODEUNIT *instr, _PyExecutorObject **);
typedef struct _PyOptimizerObject { typedef struct _PyOptimizerObject {
PyObject_HEAD PyObject_HEAD

View File

@ -93,14 +93,15 @@ PyUnstable_Replace_Executor(PyCodeObject *code, _Py_CODEUNIT *instr, _PyExecutor
return 0; return 0;
} }
static _PyExecutorObject * static int
error_optimize( error_optimize(
_PyOptimizerObject* self, _PyOptimizerObject* self,
PyCodeObject *code, PyCodeObject *code,
_Py_CODEUNIT *instr) _Py_CODEUNIT *instr,
_PyExecutorObject **exec)
{ {
PyErr_Format(PyExc_SystemError, "Should never call error_optimize"); PyErr_Format(PyExc_SystemError, "Should never call error_optimize");
return NULL; return -1;
} }
static PyTypeObject DefaultOptimizer_Type = { static PyTypeObject DefaultOptimizer_Type = {
@ -154,15 +155,19 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI
return frame; return frame;
} }
_PyOptimizerObject *opt = interp->optimizer; _PyOptimizerObject *opt = interp->optimizer;
_PyExecutorObject *executor = opt->optimize(opt, frame->f_code, dest); _PyExecutorObject *executor;
if (executor == NULL) { int err = opt->optimize(opt, frame->f_code, dest, &executor);
if (err <= 0) {
if (err < 0) {
return NULL; return NULL;
} }
_PyFrame_SetStackPointer(frame, stack_pointer);
return frame;
}
insert_executor(frame->f_code, src, index, executor); insert_executor(frame->f_code, src, index, executor);
return executor->execute(executor, frame, stack_pointer); return executor->execute(executor, frame, stack_pointer);
} }
/** Test support **/ /** Test support **/
@ -202,21 +207,23 @@ counter_execute(_PyExecutorObject *self, _PyInterpreterFrame *frame, PyObject **
return frame; return frame;
} }
static _PyExecutorObject * static int
counter_optimize( counter_optimize(
_PyOptimizerObject* self, _PyOptimizerObject* self,
PyCodeObject *code, PyCodeObject *code,
_Py_CODEUNIT *instr) _Py_CODEUNIT *instr,
_PyExecutorObject **exec_ptr)
{ {
_PyCounterExecutorObject *executor = (_PyCounterExecutorObject *)_PyObject_New(&CounterExecutor_Type); _PyCounterExecutorObject *executor = (_PyCounterExecutorObject *)_PyObject_New(&CounterExecutor_Type);
if (executor == NULL) { if (executor == NULL) {
return NULL; return -1;
} }
executor->executor.execute = counter_execute; executor->executor.execute = counter_execute;
Py_INCREF(self); Py_INCREF(self);
executor->optimizer = (_PyCounterOptimizerObject *)self; executor->optimizer = (_PyCounterOptimizerObject *)self;
executor->next_instr = instr; executor->next_instr = instr;
return (_PyExecutorObject *)executor; *exec_ptr = (_PyExecutorObject *)executor;
return 1;
} }
static PyObject * static PyObject *