summaryrefslogtreecommitdiffstats
path: root/Objects/funcobject.c
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2019-05-23 15:45:22 (GMT)
committerGitHub <noreply@github.com>2019-05-23 15:45:22 (GMT)
commitb82e17e626f7b1cd98aada0b1ebb65cb9f8fb184 (patch)
tree5370a2a075707cb0b37ce135cad6ffe23da424c4 /Objects/funcobject.c
parente788057a9188ff37e232729815dfda2529079420 (diff)
downloadcpython-b82e17e626f7b1cd98aada0b1ebb65cb9f8fb184.zip
cpython-b82e17e626f7b1cd98aada0b1ebb65cb9f8fb184.tar.gz
cpython-b82e17e626f7b1cd98aada0b1ebb65cb9f8fb184.tar.bz2
bpo-36842: Implement PEP 578 (GH-12613)
Adds sys.audit, sys.addaudithook, io.open_code, and associated C APIs.
Diffstat (limited to 'Objects/funcobject.c')
-rw-r--r--Objects/funcobject.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index e8e2d2e..09b94c2 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -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);