From e8ecb9ee6bec03d0c4490f3e7f1524e56e2f6a0f Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 5 Jun 2023 09:44:23 +0100 Subject: GH-104584: Allow optimizers to opt out of optimizing. (GH-105244) --- Include/cpython/optimizer.h | 3 ++- Python/optimizer.c | 29 ++++++++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Include/cpython/optimizer.h b/Include/cpython/optimizer.h index eb257d7..b2d173f 100644 --- a/Include/cpython/optimizer.h +++ b/Include/cpython/optimizer.h @@ -21,7 +21,8 @@ typedef struct _PyExecutorObject { 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 { PyObject_HEAD diff --git a/Python/optimizer.c b/Python/optimizer.c index f29e072..d721bfa 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -93,14 +93,15 @@ PyUnstable_Replace_Executor(PyCodeObject *code, _Py_CODEUNIT *instr, _PyExecutor return 0; } -static _PyExecutorObject * +static int error_optimize( _PyOptimizerObject* self, PyCodeObject *code, - _Py_CODEUNIT *instr) + _Py_CODEUNIT *instr, + _PyExecutorObject **exec) { PyErr_Format(PyExc_SystemError, "Should never call error_optimize"); - return NULL; + return -1; } static PyTypeObject DefaultOptimizer_Type = { @@ -154,15 +155,19 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI return frame; } _PyOptimizerObject *opt = interp->optimizer; - _PyExecutorObject *executor = opt->optimize(opt, frame->f_code, dest); - if (executor == NULL) { - return NULL; + _PyExecutorObject *executor; + int err = opt->optimize(opt, frame->f_code, dest, &executor); + if (err <= 0) { + if (err < 0) { + return NULL; + } + _PyFrame_SetStackPointer(frame, stack_pointer); + return frame; } insert_executor(frame->f_code, src, index, executor); return executor->execute(executor, frame, stack_pointer); } - /** Test support **/ @@ -202,21 +207,23 @@ counter_execute(_PyExecutorObject *self, _PyInterpreterFrame *frame, PyObject ** return frame; } -static _PyExecutorObject * +static int counter_optimize( _PyOptimizerObject* self, PyCodeObject *code, - _Py_CODEUNIT *instr) + _Py_CODEUNIT *instr, + _PyExecutorObject **exec_ptr) { _PyCounterExecutorObject *executor = (_PyCounterExecutorObject *)_PyObject_New(&CounterExecutor_Type); if (executor == NULL) { - return NULL; + return -1; } executor->executor.execute = counter_execute; Py_INCREF(self); executor->optimizer = (_PyCounterOptimizerObject *)self; executor->next_instr = instr; - return (_PyExecutorObject *)executor; + *exec_ptr = (_PyExecutorObject *)executor; + return 1; } static PyObject * -- cgit v0.12