summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/data/stable_abi.dat2
-rw-r--r--Include/abstract.h6
-rw-r--r--Include/object.h2
-rw-r--r--Lib/test/test_stable_abi_ctypes.py2
-rw-r--r--Misc/NEWS.d/next/C API/2023-07-11-01-07-39.gh-issue-106572.y1b35X.rst2
-rw-r--r--Misc/stable_abi.toml4
-rw-r--r--Objects/object.c12
-rwxr-xr-xPC/python3dll.c2
-rw-r--r--Python/bltinmodule.c3
-rw-r--r--Python/bytecodes.c2
-rw-r--r--Python/executor_cases.c.h2
-rw-r--r--Python/generated_cases.c.h2
12 files changed, 33 insertions, 8 deletions
diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat
index 7fb002c..9a61ddc 100644
--- a/Doc/data/stable_abi.dat
+++ b/Doc/data/stable_abi.dat
@@ -490,6 +490,8 @@ function,PyObject_Calloc,3.7,,
function,PyObject_CheckBuffer,3.11,,
function,PyObject_ClearWeakRefs,3.2,,
function,PyObject_CopyData,3.11,,
+function,PyObject_DelAttr,3.13,,
+function,PyObject_DelAttrString,3.13,,
function,PyObject_DelItem,3.2,,
function,PyObject_DelItemString,3.2,,
function,PyObject_Dir,3.2,,
diff --git a/Include/abstract.h b/Include/abstract.h
index 016ace9..c84d2c7 100644
--- a/Include/abstract.h
+++ b/Include/abstract.h
@@ -80,7 +80,7 @@ extern "C" {
This is the equivalent of the Python statement o.attr_name=v. */
-/* Implemented as a macro:
+/* Implemented elsewhere:
int PyObject_DelAttrString(PyObject *o, const char *attr_name);
@@ -88,17 +88,15 @@ extern "C" {
-1 on failure.
This is the equivalent of the Python statement: del o.attr_name. */
-#define PyObject_DelAttrString(O, A) PyObject_SetAttrString((O), (A), NULL)
-/* Implemented as a macro:
+/* Implemented elsewhere:
int PyObject_DelAttr(PyObject *o, PyObject *attr_name);
Delete attribute named attr_name, for object o. Returns -1
on failure. This is the equivalent of the Python
statement: del o.attr_name. */
-#define PyObject_DelAttr(O, A) PyObject_SetAttr((O), (A), NULL)
/* Implemented elsewhere:
diff --git a/Include/object.h b/Include/object.h
index 3ef6451..dccab07 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -391,9 +391,11 @@ PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int);
PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int);
PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *);
PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *);
+PyAPI_FUNC(int) PyObject_DelAttrString(PyObject *v, const char *name);
PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *);
PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *);
PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *);
+PyAPI_FUNC(int) PyObject_DelAttr(PyObject *v, PyObject *name);
PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *);
PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *);
PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *);
diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py
index 038c978..20bc262 100644
--- a/Lib/test/test_stable_abi_ctypes.py
+++ b/Lib/test/test_stable_abi_ctypes.py
@@ -509,6 +509,8 @@ SYMBOL_NAMES = (
"PyObject_CheckReadBuffer",
"PyObject_ClearWeakRefs",
"PyObject_CopyData",
+ "PyObject_DelAttr",
+ "PyObject_DelAttrString",
"PyObject_DelItem",
"PyObject_DelItemString",
"PyObject_Dir",
diff --git a/Misc/NEWS.d/next/C API/2023-07-11-01-07-39.gh-issue-106572.y1b35X.rst b/Misc/NEWS.d/next/C API/2023-07-11-01-07-39.gh-issue-106572.y1b35X.rst
new file mode 100644
index 0000000..140e9fe
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2023-07-11-01-07-39.gh-issue-106572.y1b35X.rst
@@ -0,0 +1,2 @@
+Convert :c:func:`PyObject_DelAttr` and :c:func:`PyObject_DelAttrString`
+macros to functions. Patch by Victor Stinner.
diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml
index bc7259f..c61fedf 100644
--- a/Misc/stable_abi.toml
+++ b/Misc/stable_abi.toml
@@ -2432,3 +2432,7 @@
added = '3.13'
[function.PyWeakref_GetRef]
added = '3.13'
+[function.PyObject_DelAttr]
+ added = '3.13'
+[function.PyObject_DelAttrString]
+ added = '3.13'
diff --git a/Objects/object.c b/Objects/object.c
index c27b13e..540ba5d 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -943,6 +943,12 @@ PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
}
int
+PyObject_DelAttrString(PyObject *v, const char *name)
+{
+ return PyObject_SetAttrString(v, name, NULL);
+}
+
+int
_PyObject_IsAbstract(PyObject *obj)
{
int res;
@@ -1185,6 +1191,12 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
return -1;
}
+int
+PyObject_DelAttr(PyObject *v, PyObject *name)
+{
+ return PyObject_SetAttr(v, name, NULL);
+}
+
PyObject **
_PyObject_ComputedDictPointer(PyObject *obj)
{
diff --git a/PC/python3dll.c b/PC/python3dll.c
index 65bdf32..a717391 100755
--- a/PC/python3dll.c
+++ b/PC/python3dll.c
@@ -447,6 +447,8 @@ EXPORT_FUNC(PyObject_CheckBuffer)
EXPORT_FUNC(PyObject_CheckReadBuffer)
EXPORT_FUNC(PyObject_ClearWeakRefs)
EXPORT_FUNC(PyObject_CopyData)
+EXPORT_FUNC(PyObject_DelAttr)
+EXPORT_FUNC(PyObject_DelAttrString)
EXPORT_FUNC(PyObject_DelItem)
EXPORT_FUNC(PyObject_DelItemString)
EXPORT_FUNC(PyObject_Dir)
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 49efafc..20a86fc 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1567,8 +1567,9 @@ static PyObject *
builtin_delattr_impl(PyObject *module, PyObject *obj, PyObject *name)
/*[clinic end generated code: output=85134bc58dff79fa input=164865623abe7216]*/
{
- if (PyObject_SetAttr(obj, name, (PyObject *)NULL) != 0)
+ if (PyObject_DelAttr(obj, name) < 0) {
return NULL;
+ }
Py_RETURN_NONE;
}
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 0848bbf..8844429 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1240,7 +1240,7 @@ dummy_func(
inst(DELETE_ATTR, (owner --)) {
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
- int err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
+ int err = PyObject_DelAttr(owner, name);
DECREF_INPUTS();
ERROR_IF(err, error);
}
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index eccb303..030d7ac 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -1018,7 +1018,7 @@
PyObject *owner = stack_pointer[-1];
#line 1242 "Python/bytecodes.c"
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
- int err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
+ int err = PyObject_DelAttr(owner, name);
#line 1023 "Python/executor_cases.c.h"
Py_DECREF(owner);
#line 1245 "Python/bytecodes.c"
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 11823cf..ecbf8ee 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -1696,7 +1696,7 @@
PyObject *owner = stack_pointer[-1];
#line 1242 "Python/bytecodes.c"
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
- int err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
+ int err = PyObject_DelAttr(owner, name);
#line 1701 "Python/generated_cases.c.h"
Py_DECREF(owner);
#line 1245 "Python/bytecodes.c"