mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Issue #20185: Convert _warnings.warn() to Argument Clinic
Fix warn_explicit(): interpret source=None as source=NULL.
This commit is contained in:
		
							parent
							
								
									0ca246c5e7
								
							
						
					
					
						commit
						22f18750a5
					
				
					 2 changed files with 59 additions and 16 deletions
				
			
		|  | @ -1,5 +1,6 @@ | |||
| #include "Python.h" | ||||
| #include "frameobject.h" | ||||
| #include "clinic/_warnings.c.h" | ||||
| 
 | ||||
| #define MODULE_NAME "_warnings" | ||||
| 
 | ||||
|  | @ -485,6 +486,10 @@ warn_explicit(PyObject *category, PyObject *message, | |||
|     if (lineno_obj == NULL) | ||||
|         goto cleanup; | ||||
| 
 | ||||
|     if (source == Py_None) { | ||||
|         source = NULL; | ||||
|     } | ||||
| 
 | ||||
|     /* Create key. */ | ||||
|     key = PyTuple_Pack(3, text, category, lineno_obj); | ||||
|     if (key == NULL) | ||||
|  | @ -805,22 +810,26 @@ do_warn(PyObject *message, PyObject *category, Py_ssize_t stack_level, | |||
|     return res; | ||||
| } | ||||
| 
 | ||||
| /*[clinic input]
 | ||||
| warn as warnings_warn | ||||
| 
 | ||||
|     message: object | ||||
|     category: object = None | ||||
|     stacklevel: Py_ssize_t = 1 | ||||
|     source: object = None | ||||
| 
 | ||||
| Issue a warning, or maybe ignore it or raise an exception. | ||||
| [clinic start generated code]*/ | ||||
| 
 | ||||
| static PyObject * | ||||
| warnings_warn(PyObject *self, PyObject *args, PyObject *kwds) | ||||
| warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category, | ||||
|                    Py_ssize_t stacklevel, PyObject *source) | ||||
| /*[clinic end generated code: output=31ed5ab7d8d760b2 input=bfdf5cf99f6c4edd]*/ | ||||
| { | ||||
|     static char *kw_list[] = {"message", "category", "stacklevel", | ||||
|                               "source", NULL}; | ||||
|     PyObject *message, *category = NULL, *source = NULL; | ||||
|     Py_ssize_t stack_level = 1; | ||||
| 
 | ||||
|     if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OnO:warn", kw_list, | ||||
|                                      &message, &category, &stack_level, &source)) | ||||
|         return NULL; | ||||
| 
 | ||||
|     category = get_category(message, category); | ||||
|     if (category == NULL) | ||||
|         return NULL; | ||||
|     return do_warn(message, category, stack_level, source); | ||||
|     return do_warn(message, category, stacklevel, source); | ||||
| } | ||||
| 
 | ||||
| static PyObject * | ||||
|  | @ -1098,15 +1107,11 @@ PyErr_WarnExplicitFormat(PyObject *category, | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| PyDoc_STRVAR(warn_doc, | ||||
| "Issue a warning, or maybe ignore it or raise an exception."); | ||||
| 
 | ||||
| PyDoc_STRVAR(warn_explicit_doc, | ||||
| "Low-level inferface to warnings functionality."); | ||||
| 
 | ||||
| static PyMethodDef warnings_functions[] = { | ||||
|     {"warn", (PyCFunction)warnings_warn, METH_VARARGS | METH_KEYWORDS, | ||||
|         warn_doc}, | ||||
|     WARNINGS_WARN_METHODDEF | ||||
|     {"warn_explicit", (PyCFunction)warnings_warn_explicit, | ||||
|         METH_VARARGS | METH_KEYWORDS, warn_explicit_doc}, | ||||
|     {"_filters_mutated", (PyCFunction)warnings_filters_mutated, METH_NOARGS, | ||||
|  |  | |||
							
								
								
									
										38
									
								
								Python/clinic/_warnings.c.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Python/clinic/_warnings.c.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | |||
| /*[clinic input]
 | ||||
| preserve | ||||
| [clinic start generated code]*/ | ||||
| 
 | ||||
| PyDoc_STRVAR(warnings_warn__doc__, | ||||
| "warn($module, /, message, category=None, stacklevel=1, source=None)\n" | ||||
| "--\n" | ||||
| "\n" | ||||
| "Issue a warning, or maybe ignore it or raise an exception."); | ||||
| 
 | ||||
| #define WARNINGS_WARN_METHODDEF    \ | ||||
|     {"warn", (PyCFunction)warnings_warn, METH_FASTCALL, warnings_warn__doc__}, | ||||
| 
 | ||||
| static PyObject * | ||||
| warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category, | ||||
|                    Py_ssize_t stacklevel, PyObject *source); | ||||
| 
 | ||||
| static PyObject * | ||||
| warnings_warn(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) | ||||
| { | ||||
|     PyObject *return_value = NULL; | ||||
|     static const char * const _keywords[] = {"message", "category", "stacklevel", "source", NULL}; | ||||
|     static _PyArg_Parser _parser = {"O|OnO:warn", _keywords, 0}; | ||||
|     PyObject *message; | ||||
|     PyObject *category = Py_None; | ||||
|     Py_ssize_t stacklevel = 1; | ||||
|     PyObject *source = Py_None; | ||||
| 
 | ||||
|     if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser, | ||||
|         &message, &category, &stacklevel, &source)) { | ||||
|         goto exit; | ||||
|     } | ||||
|     return_value = warnings_warn_impl(module, message, category, stacklevel, source); | ||||
| 
 | ||||
| exit: | ||||
|     return return_value; | ||||
| } | ||||
| /*[clinic end generated code: output=b3c5297c2c55778c input=a9049054013a1b77]*/ | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner