mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Fix #14600. Correct reference handling and naming of ImportError convenience function
This commit is contained in:
		
							parent
							
								
									fba807ac44
								
							
						
					
					
						commit
						09b86d1196
					
				
					 5 changed files with 37 additions and 59 deletions
				
			
		|  | @ -229,27 +229,12 @@ in various ways.  There is a separate error indicator for each thread. | ||||||
|    Similar to :c:func:`PyErr_SetFromWindowsErrWithFilename`, with an additional |    Similar to :c:func:`PyErr_SetFromWindowsErrWithFilename`, with an additional | ||||||
|    parameter specifying the exception type to be raised. Availability: Windows. |    parameter specifying the exception type to be raised. Availability: Windows. | ||||||
| 
 | 
 | ||||||
| .. c:function:: PyObject* PyErr_SetExcWithArgsKwargs(PyObject *exc, PyObject *args, PyObject *kwargs) | .. c:function:: PyObject* PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) | ||||||
| 
 |  | ||||||
|    This is a convenience function to set an *exc* with the given *args* and |  | ||||||
|    *kwargs* values. If *args* is ``NULL``, an empty :func:`tuple` will be |  | ||||||
|    created when *exc* is created via :c:func:`PyObject_Call`. |  | ||||||
| 
 |  | ||||||
|    .. versionadded:: 3.3 |  | ||||||
| 
 |  | ||||||
| .. c:function:: PyObject* PyErr_SetFromImportErrorWithName(PyObject *msg, PyObject *name) |  | ||||||
| 
 | 
 | ||||||
|    This is a convenience function to raise :exc:`ImportError`. *msg* will be |    This is a convenience function to raise :exc:`ImportError`. *msg* will be | ||||||
|    set as the exception's message string, and *name* will be set as the |    set as the exception's message string. *name* and *path*, both of which can | ||||||
|    :exc:`ImportError`'s ``name`` attribute. |    be ``NULL``, will be set as the :exc:`ImportError`'s respective ``name`` | ||||||
| 
 |    and ``path`` attributes. | ||||||
|    .. versionadded:: 3.3 |  | ||||||
| 
 |  | ||||||
| .. c:function:: PyObject* PyErr_SetFromImportErrorWithNameAndPath(PyObject *msg, PyObject *name, PyObject *path) |  | ||||||
| 
 |  | ||||||
|    This is a convenience function to raise :exc:`ImportError`. *msg* will be |  | ||||||
|    set as the exception's message string. Both *name* and *path* will be set |  | ||||||
|    as the :exc:`ImportError`'s respective ``name`` and ``path`` attributes. |  | ||||||
| 
 | 
 | ||||||
|    .. versionadded:: 3.3 |    .. versionadded:: 3.3 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -265,9 +265,8 @@ PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int); | ||||||
| 
 | 
 | ||||||
| PyAPI_FUNC(PyObject *) PyErr_SetExcWithArgsKwargs(PyObject *, PyObject *, | PyAPI_FUNC(PyObject *) PyErr_SetExcWithArgsKwargs(PyObject *, PyObject *, | ||||||
|     PyObject *); |     PyObject *); | ||||||
| PyAPI_FUNC(PyObject *) PyErr_SetFromImportErrorWithNameAndPath(PyObject *, | PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *, | ||||||
|         PyObject *, PyObject *); |     PyObject *); | ||||||
| PyAPI_FUNC(PyObject *) PyErr_SetFromImportErrorWithName(PyObject *, PyObject *); |  | ||||||
| 
 | 
 | ||||||
| /* Export the old function so that the existing API remains available: */ | /* Export the old function so that the existing API remains available: */ | ||||||
| PyAPI_FUNC(void) PyErr_BadInternalCall(void); | PyAPI_FUNC(void) PyErr_BadInternalCall(void); | ||||||
|  |  | ||||||
|  | @ -254,9 +254,9 @@ dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname, | ||||||
|                         theLength)); |                         theLength)); | ||||||
|             } |             } | ||||||
|             if (message != NULL) { |             if (message != NULL) { | ||||||
|                 PyErr_SetFromImportErrorWithNameAndPath(message, |                 PyErr_SetImportError(message, PyUnicode_FromString(shortname), | ||||||
|                                         PyUnicode_FromString(shortname), |                                      pathname); | ||||||
|                                         pathname); |                 Py_DECREF(message); | ||||||
|             } |             } | ||||||
|             return NULL; |             return NULL; | ||||||
|         } else { |         } else { | ||||||
|  |  | ||||||
|  | @ -586,50 +586,43 @@ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename( | ||||||
| #endif /* MS_WINDOWS */ | #endif /* MS_WINDOWS */ | ||||||
| 
 | 
 | ||||||
| PyObject * | PyObject * | ||||||
| PyErr_SetExcWithArgsKwargs(PyObject *exc, PyObject *args, PyObject *kwargs) | PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) | ||||||
| { | { | ||||||
|     PyObject *val; |     PyObject *args, *kwargs, *error; | ||||||
|  | 
 | ||||||
|  |     args = PyTuple_New(1); | ||||||
|  |     if (args == NULL) | ||||||
|  |         return NULL; | ||||||
|  | 
 | ||||||
|  |     kwargs = PyDict_New(); | ||||||
|  |     if (args == NULL) | ||||||
|  |         return NULL; | ||||||
|  | 
 | ||||||
|  |     if (name == NULL) | ||||||
|  |         name = Py_None; | ||||||
|  | 
 | ||||||
|  |     if (path == NULL) | ||||||
|  |         path = Py_None; | ||||||
|  | 
 | ||||||
|  |     Py_INCREF(msg); | ||||||
|  |     PyTuple_SetItem(args, 0, msg); | ||||||
|  |     PyDict_SetItemString(kwargs, "name", name); | ||||||
|  |     PyDict_SetItemString(kwargs, "path", path); | ||||||
| 
 | 
 | ||||||
|     /* args must at least be an empty tuple */ |     /* args must at least be an empty tuple */ | ||||||
|     if (args == NULL) |     if (args == NULL) | ||||||
|         args = PyTuple_New(0); |         args = PyTuple_New(0); | ||||||
| 
 | 
 | ||||||
|     val = PyObject_Call(exc, args, kwargs); |     error = PyObject_Call(PyExc_ImportError, args, kwargs); | ||||||
|     if (val != NULL) { |     if (error!= NULL) { | ||||||
|         PyErr_SetObject((PyObject *) Py_TYPE(val), val); |         PyErr_SetObject((PyObject *) Py_TYPE(error), error); | ||||||
|         Py_DECREF(val); |         Py_DECREF(error); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return NULL; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| PyObject * |  | ||||||
| PyErr_SetFromImportErrorWithNameAndPath(PyObject *msg, |  | ||||||
|                                         PyObject *name, PyObject *path) |  | ||||||
| { |  | ||||||
|     PyObject *args = PyTuple_New(1); |  | ||||||
|     PyObject *kwargs = PyDict_New(); |  | ||||||
|     PyObject *result; |  | ||||||
| 
 |  | ||||||
|     if (path == NULL) |  | ||||||
|         path = Py_None; |  | ||||||
| 
 |  | ||||||
|     PyTuple_SetItem(args, 0, msg); |  | ||||||
|     PyDict_SetItemString(kwargs, "name", name); |  | ||||||
|     PyDict_SetItemString(kwargs, "path", path); |  | ||||||
| 
 |  | ||||||
|     result = PyErr_SetExcWithArgsKwargs(PyExc_ImportError, args, kwargs); |  | ||||||
| 
 |  | ||||||
|     Py_DECREF(args); |     Py_DECREF(args); | ||||||
|     Py_DECREF(kwargs); |     Py_DECREF(kwargs); | ||||||
| 
 | 
 | ||||||
|     return result; |     return NULL; | ||||||
| } |  | ||||||
| 
 |  | ||||||
| PyObject * |  | ||||||
| PyErr_SetFromImportErrorWithName(PyObject *msg, PyObject *name) |  | ||||||
| { |  | ||||||
|     return PyErr_SetFromImportErrorWithNameAndPath(msg, name, NULL); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  |  | ||||||
|  | @ -2460,7 +2460,8 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, | ||||||
|         PyObject *msg = PyUnicode_FromFormat("import of %R halted; " |         PyObject *msg = PyUnicode_FromFormat("import of %R halted; " | ||||||
|                                              "None in sys.modules", abs_name); |                                              "None in sys.modules", abs_name); | ||||||
|         if (msg != NULL) { |         if (msg != NULL) { | ||||||
|             PyErr_SetFromImportErrorWithName(msg, abs_name); |             PyErr_SetImportError(msg, abs_name, NULL); | ||||||
|  |             Py_DECREF(msg); | ||||||
|         } |         } | ||||||
|         mod = NULL; |         mod = NULL; | ||||||
|         goto error_with_unlock; |         goto error_with_unlock; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Brian Curtin
						Brian Curtin