mirror of
https://github.com/python/cpython.git
synced 2025-11-02 19:12:55 +00:00
Add PyErr_WarnEx() so C code can pass the stacklevel to warnings.warn().
This provides the proper warning for struct.pack(). PyErr_Warn() is now deprecated in favor of PyErr_WarnEx(). As mentioned by Tim Peters on python-dev.
This commit is contained in:
parent
0d62a06206
commit
07aadb14f3
4 changed files with 28 additions and 7 deletions
|
|
@ -225,10 +225,14 @@ PyAPI_FUNC(PyObject *) PyErr_NewException(char *name, PyObject *base,
|
||||||
PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *);
|
PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *);
|
||||||
|
|
||||||
/* Issue a warning or exception */
|
/* Issue a warning or exception */
|
||||||
PyAPI_FUNC(int) PyErr_Warn(PyObject *, char *);
|
PyAPI_FUNC(int) PyErr_WarnEx(PyObject *category, const char *msg,
|
||||||
|
Py_ssize_t stack_level);
|
||||||
PyAPI_FUNC(int) PyErr_WarnExplicit(PyObject *, const char *,
|
PyAPI_FUNC(int) PyErr_WarnExplicit(PyObject *, const char *,
|
||||||
const char *, int,
|
const char *, int,
|
||||||
const char *, PyObject *);
|
const char *, PyObject *);
|
||||||
|
/* PyErr_Warn is only for backwards compatability and will be removed.
|
||||||
|
Use PyErr_WarnEx instead. */
|
||||||
|
#define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1)
|
||||||
|
|
||||||
/* In sigcheck.c or signalmodule.c */
|
/* In sigcheck.c or signalmodule.c */
|
||||||
PyAPI_FUNC(int) PyErr_CheckSignals(void);
|
PyAPI_FUNC(int) PyErr_CheckSignals(void);
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,10 @@ What's New in Python 2.5 beta 3?
|
||||||
Core and builtins
|
Core and builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Add PyErr_WarnEx() so C code can pass the stacklevel to warnings.warn().
|
||||||
|
This provides the proper warning for struct.pack().
|
||||||
|
PyErr_Warn() is now deprecated in favor of PyErr_WarnEx().
|
||||||
|
|
||||||
- Patch #1531113: Fix augmented assignment with yield expressions.
|
- Patch #1531113: Fix augmented assignment with yield expressions.
|
||||||
Also fix a SystemError when trying to assign to yield expressions.
|
Also fix a SystemError when trying to assign to yield expressions.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -214,6 +214,8 @@ get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
|
||||||
/* Helper routine to get a Python integer and raise the appropriate error
|
/* Helper routine to get a Python integer and raise the appropriate error
|
||||||
if it isn't one */
|
if it isn't one */
|
||||||
|
|
||||||
|
#define INT_OVERFLOW "struct integer overflow masking is deprecated"
|
||||||
|
|
||||||
static int
|
static int
|
||||||
get_wrapped_long(PyObject *v, long *p)
|
get_wrapped_long(PyObject *v, long *p)
|
||||||
{
|
{
|
||||||
|
|
@ -223,7 +225,7 @@ get_wrapped_long(PyObject *v, long *p)
|
||||||
PyObject *wrapped;
|
PyObject *wrapped;
|
||||||
long x;
|
long x;
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
if (PyErr_Warn(PyExc_DeprecationWarning, "struct integer overflow masking is deprecated") < 0)
|
if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 2) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
wrapped = PyNumber_And(v, pylong_ulong_mask);
|
wrapped = PyNumber_And(v, pylong_ulong_mask);
|
||||||
if (wrapped == NULL)
|
if (wrapped == NULL)
|
||||||
|
|
@ -250,7 +252,7 @@ get_wrapped_ulong(PyObject *v, unsigned long *p)
|
||||||
wrapped = PyNumber_And(v, pylong_ulong_mask);
|
wrapped = PyNumber_And(v, pylong_ulong_mask);
|
||||||
if (wrapped == NULL)
|
if (wrapped == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
if (PyErr_Warn(PyExc_DeprecationWarning, "struct integer overflow masking is deprecated") < 0) {
|
if (PyErr_WarnEx(PyExc_DeprecationWarning, INT_OVERFLOW, 2) < 0) {
|
||||||
Py_DECREF(wrapped);
|
Py_DECREF(wrapped);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -345,8 +347,8 @@ _range_error(const formatdef *f, int is_unsigned)
|
||||||
Py_XDECREF(ptraceback);
|
Py_XDECREF(ptraceback);
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
rval = PyErr_Warn(PyExc_DeprecationWarning,
|
rval = PyErr_WarnEx(PyExc_DeprecationWarning,
|
||||||
PyString_AS_STRING(msg));
|
PyString_AS_STRING(msg), 2);
|
||||||
Py_DECREF(msg);
|
Py_DECREF(msg);
|
||||||
if (rval == 0)
|
if (rval == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -632,7 +632,7 @@ extern PyObject *PyModule_GetWarningsModule(void);
|
||||||
|
|
||||||
/* Function to issue a warning message; may raise an exception. */
|
/* Function to issue a warning message; may raise an exception. */
|
||||||
int
|
int
|
||||||
PyErr_Warn(PyObject *category, char *message)
|
PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)
|
||||||
{
|
{
|
||||||
PyObject *dict, *func = NULL;
|
PyObject *dict, *func = NULL;
|
||||||
PyObject *warnings_module = PyModule_GetWarningsModule();
|
PyObject *warnings_module = PyModule_GetWarningsModule();
|
||||||
|
|
@ -650,7 +650,8 @@ PyErr_Warn(PyObject *category, char *message)
|
||||||
|
|
||||||
if (category == NULL)
|
if (category == NULL)
|
||||||
category = PyExc_RuntimeWarning;
|
category = PyExc_RuntimeWarning;
|
||||||
res = PyObject_CallFunction(func, "sO", message, category);
|
res = PyObject_CallFunction(func, "sOn",
|
||||||
|
message, category, stack_level);
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
Py_DECREF(res);
|
Py_DECREF(res);
|
||||||
|
|
@ -658,6 +659,16 @@ PyErr_Warn(PyObject *category, char *message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* PyErr_Warn is only for backwards compatability and will be removed.
|
||||||
|
Use PyErr_WarnEx instead. */
|
||||||
|
|
||||||
|
#undef PyErr_Warn
|
||||||
|
|
||||||
|
int
|
||||||
|
PyErr_Warn(PyObject *category, char *message)
|
||||||
|
{
|
||||||
|
return PyErr_WarnEx(category, message, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Warning with explicit origin */
|
/* Warning with explicit origin */
|
||||||
int
|
int
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue