Issue 7994: Make object.__format__ with a non-empty format string a PendingDecprecationWarning. Still need to remove uses of this from various tests.
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 8d6f023..0b541ee 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -777,8 +777,9 @@
NULL);
Py_DECREF(bound_method);
} else {
- PyObject *self_as_str;
- PyObject *format_method;
+ PyObject *self_as_str = NULL;
+ PyObject *format_method = NULL;
+ Py_ssize_t format_len;
PyErr_Clear();
/* Per the PEP, convert to str (or unicode,
@@ -786,29 +787,53 @@
specifier). For new-style classes, this
logic is done by object.__format__(). */
#ifdef Py_USING_UNICODE
- if (spec_is_unicode)
+ if (spec_is_unicode) {
+ format_len = PyUnicode_GET_SIZE(format_spec);
self_as_str = PyObject_Unicode(obj);
- else
+ } else
#endif
+ {
+ format_len = PyString_GET_SIZE(format_spec);
self_as_str = PyObject_Str(obj);
+ }
if (self_as_str == NULL)
- goto done;
+ goto done1;
+
+ if (format_len > 0) {
+ /* See the almost identical code in
+ typeobject.c for new-style
+ classes. */
+ if (PyErr_WarnEx(
+ PyExc_PendingDeprecationWarning,
+ "object.__format__ with a non-empty "
+ "format string is deprecated", 1)
+ < 0) {
+ goto done1;
+ }
+ /* Eventually this will become an
+ error:
+ PyErr_Format(PyExc_TypeError,
+ "non-empty format string passed to "
+ "object.__format__");
+ goto done1;
+ */
+ }
/* Then call str.__format__ on that result */
format_method = PyObject_GetAttr(self_as_str,
str__format__);
if (format_method == NULL) {
- Py_DECREF(self_as_str);
- goto done;
+ goto done1;
}
- result = PyObject_CallFunctionObjArgs(format_method,
+ result = PyObject_CallFunctionObjArgs(format_method,
format_spec,
NULL);
- Py_DECREF(self_as_str);
- Py_DECREF(format_method);
+done1:
+ Py_XDECREF(self_as_str);
+ Py_XDECREF(format_method);
if (result == NULL)
goto done;
- }
+ }
} else {
/* Not an instance of a classic class, use the code
from py3k */