Skip to content

Commit

Permalink
gh-106608: make uop trace variable length (#107531)
Browse files Browse the repository at this point in the history
Executors are now more like tuples.
  • Loading branch information
rdrf2838 committed Aug 5, 2023
1 parent 05a824f commit 4e6fac7
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 15 deletions.
2 changes: 1 addition & 1 deletion Include/cpython/optimizer.h
Expand Up @@ -12,7 +12,7 @@ typedef struct {
} _PyVMData;

typedef struct _PyExecutorObject {
PyObject_HEAD
PyObject_VAR_HEAD
/* WARNING: execute consumes a reference to self. This is necessary to allow executors to tail call into each other. */
struct _PyInterpreterFrame *(*execute)(struct _PyExecutorObject *self, struct _PyInterpreterFrame *frame, PyObject **stack_pointer);
_PyVMData vm_data; /* Used by the VM, but opaque to the optimizer */
Expand Down
2 changes: 1 addition & 1 deletion Include/internal/pycore_uops.h
Expand Up @@ -18,7 +18,7 @@ typedef struct {

typedef struct {
_PyExecutorObject base;
_PyUOpInstruction trace[_Py_UOP_MAX_TRACE_LENGTH]; // TODO: variable length
_PyUOpInstruction trace[1];
} _PyUOpExecutorObject;

_PyInterpreterFrame *_PyUopExecute(
Expand Down
@@ -0,0 +1 @@
Make ``_PyUOpExecutorObject`` variable length.
17 changes: 4 additions & 13 deletions Python/optimizer.c
Expand Up @@ -320,13 +320,7 @@ uop_name(int index) {
static Py_ssize_t
uop_len(_PyUOpExecutorObject *self)
{
int count = 0;
for (; count < _Py_UOP_MAX_TRACE_LENGTH; count++) {
if (self->trace[count].opcode == 0) {
break;
}
}
return count;
return Py_SIZE(self);
}

static PyObject *
Expand Down Expand Up @@ -368,8 +362,8 @@ PySequenceMethods uop_as_sequence = {
static PyTypeObject UOpExecutor_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
.tp_name = "uop_executor",
.tp_basicsize = sizeof(_PyUOpExecutorObject),
.tp_itemsize = 0,
.tp_basicsize = sizeof(_PyUOpExecutorObject) - sizeof(_PyUOpInstruction),
.tp_itemsize = sizeof(_PyUOpInstruction),
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
.tp_dealloc = (destructor)uop_dealloc,
.tp_as_sequence = &uop_as_sequence,
Expand Down Expand Up @@ -699,15 +693,12 @@ uop_optimize(
return trace_length;
}
OBJECT_STAT_INC(optimization_traces_created);
_PyUOpExecutorObject *executor = PyObject_New(_PyUOpExecutorObject, &UOpExecutor_Type);
_PyUOpExecutorObject *executor = PyObject_NewVar(_PyUOpExecutorObject, &UOpExecutor_Type, trace_length);
if (executor == NULL) {
return -1;
}
executor->base.execute = _PyUopExecute;
memcpy(executor->trace, trace, trace_length * sizeof(_PyUOpInstruction));
if (trace_length < _Py_UOP_MAX_TRACE_LENGTH) {
executor->trace[trace_length].opcode = 0; // Sentinel
}
*exec_ptr = (_PyExecutorObject *)executor;
return 1;
}
Expand Down

0 comments on commit 4e6fac7

Please sign in to comment.