mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-36842: Implement PEP 578 (GH-12613)
Adds sys.audit, sys.addaudithook, io.open_code, and associated C APIs.
This commit is contained in:
parent
e788057a91
commit
b82e17e626
70 changed files with 3565 additions and 1816 deletions
|
@ -250,6 +250,10 @@ static PyMemberDef func_memberlist[] = {
|
|||
static PyObject *
|
||||
func_get_code(PyFunctionObject *op, void *Py_UNUSED(ignored))
|
||||
{
|
||||
if (PySys_Audit("object.__getattr__", "Os", op, "__code__") < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_INCREF(op->func_code);
|
||||
return op->func_code;
|
||||
}
|
||||
|
@ -266,6 +270,12 @@ func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
|
|||
"__code__ must be set to a code object");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (PySys_Audit("object.__setattr__", "OsO",
|
||||
op, "__code__", value) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
nfree = PyCode_GetNumFree((PyCodeObject *)value);
|
||||
nclosure = (op->func_closure == NULL ? 0 :
|
||||
PyTuple_GET_SIZE(op->func_closure));
|
||||
|
@ -329,6 +339,9 @@ func_set_qualname(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored
|
|||
static PyObject *
|
||||
func_get_defaults(PyFunctionObject *op, void *Py_UNUSED(ignored))
|
||||
{
|
||||
if (PySys_Audit("object.__getattr__", "Os", op, "__defaults__") < 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (op->func_defaults == NULL) {
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
@ -348,6 +361,16 @@ func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored
|
|||
"__defaults__ must be set to a tuple object");
|
||||
return -1;
|
||||
}
|
||||
if (value) {
|
||||
if (PySys_Audit("object.__setattr__", "OsO",
|
||||
op, "__defaults__", value) < 0) {
|
||||
return -1;
|
||||
}
|
||||
} else if (PySys_Audit("object.__delattr__", "Os",
|
||||
op, "__defaults__") < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_XINCREF(value);
|
||||
Py_XSETREF(op->func_defaults, value);
|
||||
return 0;
|
||||
|
@ -356,6 +379,10 @@ func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored
|
|||
static PyObject *
|
||||
func_get_kwdefaults(PyFunctionObject *op, void *Py_UNUSED(ignored))
|
||||
{
|
||||
if (PySys_Audit("object.__getattr__", "Os",
|
||||
op, "__kwdefaults__") < 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (op->func_kwdefaults == NULL) {
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
@ -375,6 +402,16 @@ func_set_kwdefaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignor
|
|||
"__kwdefaults__ must be set to a dict object");
|
||||
return -1;
|
||||
}
|
||||
if (value) {
|
||||
if (PySys_Audit("object.__setattr__", "OsO",
|
||||
op, "__kwdefaults__", value) < 0) {
|
||||
return -1;
|
||||
}
|
||||
} else if (PySys_Audit("object.__delattr__", "Os",
|
||||
op, "__kwdefaults__") < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_XINCREF(value);
|
||||
Py_XSETREF(op->func_kwdefaults, value);
|
||||
return 0;
|
||||
|
@ -507,6 +544,9 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals,
|
|||
}
|
||||
}
|
||||
}
|
||||
if (PySys_Audit("function.__new__", "O", code) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
|
||||
globals);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue