From b9b5b802a91dbfbd81e9da42a703dc4281f8173a Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Sat, 28 Oct 2023 21:08:08 +0000 Subject: [PATCH 1/5] Refactor to move types to object.c --- Include/internal/pycore_optimizer.h | 10 ++++++++++ Objects/object.c | 6 ++++++ Python/optimizer.c | 24 ++++++++++-------------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index f9f16c48cbc21c..2ac30875388872 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -13,6 +13,16 @@ extern "C" { int _Py_uop_analyze_and_optimize(PyCodeObject *code, _PyUOpInstruction *trace, int trace_len, int curr_stackentries); +extern PyTypeObject _PyCounterExecutor_Type; +#define _PyCounterExecutor_Check(op) Py_IS_TYPE((op), &_PyCounterExecutor_Type) +extern PyTypeObject _PyCounterOptimizer_Type; +#define _PyCounterOptimizer_Check(op) Py_IS_TYPE((op), &_PyCounterOptimizer_Type) +extern PyTypeObject _PyDefaultOptimizer_Type; +#define _PyDefaultOptimizer_Check(op) Py_IS_TYPE((op), &_PyDefaultOptimizer_Type) +extern PyTypeObject _PyUOpExecutor_Type; +#define _PyUOpExecutor_Check(op) Py_IS_TYPE((op), &_PyUOpExecutor_Type) +extern PyTypeObject _PyUOpOptimizer_Type; +#define _PyUOpOptimizer_Check(op) Py_IS_TYPE((op), &_PyUOpOptimizer_Type) #ifdef __cplusplus } diff --git a/Objects/object.c b/Objects/object.c index 3ed272afdced7c..8654328f22c903 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -13,6 +13,7 @@ #include "pycore_memoryobject.h" // _PyManagedBuffer_Type #include "pycore_namespace.h" // _PyNamespace_Type #include "pycore_object.h" // PyAPI_DATA() _Py_SwappedOp definition +#include "pycore_optimizer.h" // _Py_uop_analyze_and_optimize() #include "pycore_pyerrors.h" // _PyErr_Occurred() #include "pycore_pymem.h" // _PyMem_IsPtrFreed() #include "pycore_pystate.h" // _PyThreadState_GET() @@ -2157,6 +2158,9 @@ static PyTypeObject* static_types[] = { &_PyBufferWrapper_Type, &_PyContextTokenMissing_Type, &_PyCoroWrapper_Type, + &_PyCounterExecutor_Type, + &_PyCounterOptimizer_Type, + &_PyDefaultOptimizer_Type, &_Py_GenericAliasIterType, &_PyHamtItems_Type, &_PyHamtKeys_Type, @@ -2176,6 +2180,8 @@ static PyTypeObject* static_types[] = { &_PyPositionsIterator, &_PyUnicodeASCIIIter_Type, &_PyUnion_Type, + &_PyUOpExecutor_Type, + &_PyUOpOptimizer_Type, &_PyWeakref_CallableProxyType, &_PyWeakref_ProxyType, &_PyWeakref_RefType, diff --git a/Python/optimizer.c b/Python/optimizer.c index 6402287a412a35..c239b03053a896 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -111,7 +111,7 @@ error_optimize( return -1; } -static PyTypeObject DefaultOptimizer_Type = { +PyTypeObject _PyDefaultOptimizer_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "noop_optimizer", .tp_basicsize = sizeof(_PyOptimizerObject), @@ -120,7 +120,7 @@ static PyTypeObject DefaultOptimizer_Type = { }; _PyOptimizerObject _PyOptimizer_Default = { - PyObject_HEAD_INIT(&DefaultOptimizer_Type) + PyObject_HEAD_INIT(&_PyDefaultOptimizer_Type) .optimize = error_optimize, .resume_threshold = UINT16_MAX, .backedge_threshold = UINT16_MAX, @@ -236,7 +236,7 @@ static PyMethodDef executor_methods[] = { { NULL, NULL }, }; -static PyTypeObject CounterExecutor_Type = { +PyTypeObject _PyCounterExecutor_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "counting_executor", .tp_basicsize = sizeof(_PyCounterExecutorObject), @@ -265,7 +265,7 @@ counter_optimize( int Py_UNUSED(curr_stackentries) ) { - _PyCounterExecutorObject *executor = (_PyCounterExecutorObject *)_PyObject_New(&CounterExecutor_Type); + _PyCounterExecutorObject *executor = (_PyCounterExecutorObject *)_PyObject_New(&_PyCounterExecutor_Type); if (executor == NULL) { return -1; } @@ -291,7 +291,7 @@ static PyMethodDef counter_optimizer_methods[] = { { NULL, NULL }, }; -static PyTypeObject CounterOptimizer_Type = { +PyTypeObject _PyCounterOptimizer_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "Counter optimizer", .tp_basicsize = sizeof(_PyCounterOptimizerObject), @@ -304,9 +304,7 @@ static PyTypeObject CounterOptimizer_Type = { PyObject * PyUnstable_Optimizer_NewCounter(void) { - PyType_Ready(&CounterExecutor_Type); - PyType_Ready(&CounterOptimizer_Type); - _PyCounterOptimizerObject *opt = (_PyCounterOptimizerObject *)_PyObject_New(&CounterOptimizer_Type); + _PyCounterOptimizerObject *opt = (_PyCounterOptimizerObject *)_PyObject_New(&_PyCounterOptimizer_Type); if (opt == NULL) { return NULL; } @@ -375,7 +373,7 @@ PySequenceMethods uop_as_sequence = { .sq_item = (ssizeargfunc)uop_item, }; -static PyTypeObject UOpExecutor_Type = { +PyTypeObject _PyUOpExecutor_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "uop_executor", .tp_basicsize = sizeof(_PyUOpExecutorObject) - sizeof(_PyUOpInstruction), @@ -929,7 +927,7 @@ uop_optimize( trace_length = _Py_uop_analyze_and_optimize(code, trace, trace_length, curr_stackentries); } trace_length = remove_unneeded_uops(trace, trace_length); - _PyUOpExecutorObject *executor = PyObject_NewVar(_PyUOpExecutorObject, &UOpExecutor_Type, trace_length); + _PyUOpExecutorObject *executor = PyObject_NewVar(_PyUOpExecutorObject, &_PyUOpExecutor_Type, trace_length); if (executor == NULL) { return -1; } @@ -946,7 +944,7 @@ uop_opt_dealloc(PyObject *self) { PyObject_Free(self); } -static PyTypeObject UOpOptimizer_Type = { +PyTypeObject _PyUOpOptimizer_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "uop_optimizer", .tp_basicsize = sizeof(_PyOptimizerObject), @@ -958,9 +956,7 @@ static PyTypeObject UOpOptimizer_Type = { PyObject * PyUnstable_Optimizer_NewUOpOptimizer(void) { - PyType_Ready(&UOpExecutor_Type); - PyType_Ready(&UOpOptimizer_Type); - _PyOptimizerObject *opt = PyObject_New(_PyOptimizerObject, &UOpOptimizer_Type); + _PyOptimizerObject *opt = PyObject_New(_PyOptimizerObject, &_PyUOpOptimizer_Type); if (opt == NULL) { return NULL; } From 993fdb41695db26de772442fd899f0c7d05e8466 Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Sat, 28 Oct 2023 21:22:41 +0000 Subject: [PATCH 2/5] Update comment --- Objects/object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/object.c b/Objects/object.c index 8654328f22c903..31dbf7151414e8 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -13,7 +13,7 @@ #include "pycore_memoryobject.h" // _PyManagedBuffer_Type #include "pycore_namespace.h" // _PyNamespace_Type #include "pycore_object.h" // PyAPI_DATA() _Py_SwappedOp definition -#include "pycore_optimizer.h" // _Py_uop_analyze_and_optimize() +#include "pycore_optimizer.h" // _PyCounterExecutor_Type, _PyCounterOptimizer_Type, _PyDefaultOptimizer_Type, _PyUOpExecutor_Type, _PyUOpOptimizer_Type #include "pycore_pyerrors.h" // _PyErr_Occurred() #include "pycore_pymem.h" // _PyMem_IsPtrFreed() #include "pycore_pystate.h" // _PyThreadState_GET() From e1921409d7fc007f4be5da909fba4a6fb7e21247 Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Sat, 28 Oct 2023 19:58:37 -0700 Subject: [PATCH 3/5] Update object.c Co-authored-by: Brandt Bucher --- Objects/object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/object.c b/Objects/object.c index 31dbf7151414e8..791db755663e68 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -13,7 +13,7 @@ #include "pycore_memoryobject.h" // _PyManagedBuffer_Type #include "pycore_namespace.h" // _PyNamespace_Type #include "pycore_object.h" // PyAPI_DATA() _Py_SwappedOp definition -#include "pycore_optimizer.h" // _PyCounterExecutor_Type, _PyCounterOptimizer_Type, _PyDefaultOptimizer_Type, _PyUOpExecutor_Type, _PyUOpOptimizer_Type +#include "pycore_optimizer.h" // _PyUOpExecutor_Type, _PyUOpOptimizer_Type, ... #include "pycore_pyerrors.h" // _PyErr_Occurred() #include "pycore_pymem.h" // _PyMem_IsPtrFreed() #include "pycore_pystate.h" // _PyThreadState_GET() From a65aefff640b82c9b9d5a7861b54d2d040176fb1 Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Sat, 28 Oct 2023 19:58:43 -0700 Subject: [PATCH 4/5] Update pycore_optimizer.h Co-authored-by: Brandt Bucher --- Include/internal/pycore_optimizer.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index 2ac30875388872..b052460b44b791 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -14,15 +14,10 @@ int _Py_uop_analyze_and_optimize(PyCodeObject *code, _PyUOpInstruction *trace, int trace_len, int curr_stackentries); extern PyTypeObject _PyCounterExecutor_Type; -#define _PyCounterExecutor_Check(op) Py_IS_TYPE((op), &_PyCounterExecutor_Type) extern PyTypeObject _PyCounterOptimizer_Type; -#define _PyCounterOptimizer_Check(op) Py_IS_TYPE((op), &_PyCounterOptimizer_Type) extern PyTypeObject _PyDefaultOptimizer_Type; -#define _PyDefaultOptimizer_Check(op) Py_IS_TYPE((op), &_PyDefaultOptimizer_Type) extern PyTypeObject _PyUOpExecutor_Type; -#define _PyUOpExecutor_Check(op) Py_IS_TYPE((op), &_PyUOpExecutor_Type) extern PyTypeObject _PyUOpOptimizer_Type; -#define _PyUOpOptimizer_Check(op) Py_IS_TYPE((op), &_PyUOpOptimizer_Type) #ifdef __cplusplus } From f064a53f6df2c9bc155ef02ad20085b1ec2312ec Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Sun, 29 Oct 2023 15:37:01 +0000 Subject: [PATCH 5/5] Update types in ignored.tsv --- Tools/c-analyzer/cpython/ignored.tsv | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index d436886fe73d99..eea633a15056dd 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -374,11 +374,11 @@ Python/sysmodule.c - perf_map_state - Python/sysmodule.c - _PySys_ImplCacheTag - Python/sysmodule.c - _PySys_ImplName - Python/sysmodule.c - whatstrings - -Python/optimizer.c - DefaultOptimizer_Type - -Python/optimizer.c - CounterExecutor_Type - -Python/optimizer.c - CounterOptimizer_Type - -Python/optimizer.c - UOpExecutor_Type - -Python/optimizer.c - UOpOptimizer_Type - +Python/optimizer.c - _PyDefaultOptimizer_Type - +Python/optimizer.c - _PyCounterExecutor_Type - +Python/optimizer.c - _PyCounterOptimizer_Type - +Python/optimizer.c - _PyUOpExecutor_Type - +Python/optimizer.c - _PyUOpOptimizer_Type - Python/optimizer.c - _PyOptimizer_Default - ##-----------------------