From 14825e1b84944c9f443990c9793a919f41c08d7c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 8 Nov 2024 14:42:12 +0200 Subject: [PATCH] gh-126579: Convert sys.audit() to Argument Clinic --- Python/clinic/sysmodule.c.h | 51 ++++++++++++++++++++++++++++++++++- Python/sysmodule.c | 54 +++++++++---------------------------- 2 files changed, 63 insertions(+), 42 deletions(-) diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index 1777dbec11c39b..86c42ceffc5e31 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -7,6 +7,7 @@ preserve # include "pycore_runtime.h" // _Py_ID() #endif #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() +#include "pycore_tuple.h" // _PyTuple_FromArray() PyDoc_STRVAR(sys_addaudithook__doc__, "addaudithook($module, /, hook)\n" @@ -64,6 +65,54 @@ sys_addaudithook(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb return return_value; } +PyDoc_STRVAR(sys_audit__doc__, +"audit($module, event, /, *args)\n" +"--\n" +"\n" +"Passes the event to any audit hooks that are attached."); + +#define SYS_AUDIT_METHODDEF \ + {"audit", _PyCFunction_CAST(sys_audit), METH_FASTCALL, sys_audit__doc__}, + +static PyObject * +sys_audit_impl(PyObject *module, const char *event, PyObject *args); + +static PyObject * +sys_audit(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + const char *event; + PyObject *__clinic_args = NULL; + + if (!_PyArg_CheckPositional("audit", nargs, 1, PY_SSIZE_T_MAX)) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("audit", "argument 1", "str", args[0]); + goto exit; + } + Py_ssize_t event_length; + event = PyUnicode_AsUTF8AndSize(args[0], &event_length); + if (event == NULL) { + goto exit; + } + if (strlen(event) != (size_t)event_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + __clinic_args = _PyTuple_FromArray(args + 1, nargs - 1); + if (__clinic_args == NULL) { + goto exit; + } + return_value = sys_audit_impl(module, event, __clinic_args); + +exit: + /* Cleanup for args */ + Py_XDECREF(__clinic_args); + + return return_value; +} + PyDoc_STRVAR(sys_displayhook__doc__, "displayhook($module, object, /)\n" "--\n" @@ -1619,4 +1668,4 @@ sys__is_gil_enabled(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=cf24c260a269a5d2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6d4f6cd20419b675 input=a9049054013a1b77]*/ diff --git a/Python/sysmodule.c b/Python/sysmodule.c index a086bb979efa9c..aaef5aa532412b 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -499,56 +499,28 @@ sys_addaudithook_impl(PyObject *module, PyObject *hook) Py_RETURN_NONE; } -PyDoc_STRVAR(audit_doc, -"audit($module, event, /, *args)\n\ ---\n\ -\n\ -Passes the event to any audit hooks that are attached."); +/*[clinic input] +sys.audit + + event: str + / + *args: tuple + +Passes the event to any audit hooks that are attached. +[clinic start generated code]*/ static PyObject * -sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) +sys_audit_impl(PyObject *module, const char *event, PyObject *args) +/*[clinic end generated code: output=1d0fc82da768f49d input=ec3b688527945109]*/ { PyThreadState *tstate = _PyThreadState_GET(); _Py_EnsureTstateNotNULL(tstate); - if (argc == 0) { - _PyErr_SetString(tstate, PyExc_TypeError, - "audit() missing 1 required positional argument: " - "'event'"); - return NULL; - } - - assert(args[0] != NULL); - if (!should_audit(tstate->interp)) { Py_RETURN_NONE; } - PyObject *auditEvent = args[0]; - if (!auditEvent) { - _PyErr_SetString(tstate, PyExc_TypeError, - "expected str for argument 'event'"); - return NULL; - } - if (!PyUnicode_Check(auditEvent)) { - _PyErr_Format(tstate, PyExc_TypeError, - "expected str for argument 'event', not %.200s", - Py_TYPE(auditEvent)->tp_name); - return NULL; - } - const char *event = PyUnicode_AsUTF8(auditEvent); - if (!event) { - return NULL; - } - - PyObject *auditArgs = _PyTuple_FromArray(args + 1, argc - 1); - if (!auditArgs) { - return NULL; - } - - int res = _PySys_Audit(tstate, event, "O", auditArgs); - Py_DECREF(auditArgs); - + int res = _PySys_Audit(tstate, event, "O", args); if (res < 0) { return NULL; } @@ -2564,7 +2536,7 @@ PyAPI_FUNC(int) PyUnstable_CopyPerfMapFile(const char* parent_filename) { static PyMethodDef sys_methods[] = { /* Might as well keep this in alphabetic order */ SYS_ADDAUDITHOOK_METHODDEF - {"audit", _PyCFunction_CAST(sys_audit), METH_FASTCALL, audit_doc }, + SYS_AUDIT_METHODDEF {"breakpointhook", _PyCFunction_CAST(sys_breakpointhook), METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc}, SYS__CLEAR_INTERNAL_CACHES_METHODDEF