mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	All the exception building related stuff has been moved out of this
module and into _exceptions.c. This includes all the PyExc_* globals, the bltin_exc table, init_class_exc(), fini_instances(), finierrors(). Renamed _PyBuiltin_Init_1() to _PyBuiltin_Init() since the two phase initializations are necessary any more. Removed as obsolete _PyBuiltin_Init_2(), _PyBuiltin_Fini_1() and _PyBuiltin_Fini_2().
This commit is contained in:
		
							parent
							
								
									cfa2dba720
								
							
						
					
					
						commit
						78e6c671db
					
				
					 1 changed files with 1 additions and 190 deletions
				
			
		|  | @ -2356,178 +2356,13 @@ static PyMethodDef builtin_methods[] = { | ||||||
| 	{NULL,		NULL}, | 	{NULL,		NULL}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* Predefined exceptions */ |  | ||||||
| 
 |  | ||||||
| PyObject *PyExc_Exception; |  | ||||||
| PyObject *PyExc_StandardError; |  | ||||||
| PyObject *PyExc_ArithmeticError; |  | ||||||
| PyObject *PyExc_LookupError; |  | ||||||
| 
 |  | ||||||
| PyObject *PyExc_AssertionError; |  | ||||||
| PyObject *PyExc_AttributeError; |  | ||||||
| PyObject *PyExc_EOFError; |  | ||||||
| PyObject *PyExc_FloatingPointError; |  | ||||||
| PyObject *PyExc_EnvironmentError; |  | ||||||
| PyObject *PyExc_IOError; |  | ||||||
| PyObject *PyExc_OSError; |  | ||||||
| PyObject *PyExc_ImportError; |  | ||||||
| PyObject *PyExc_IndexError; |  | ||||||
| PyObject *PyExc_KeyError; |  | ||||||
| PyObject *PyExc_KeyboardInterrupt; |  | ||||||
| PyObject *PyExc_MemoryError; |  | ||||||
| PyObject *PyExc_NameError; |  | ||||||
| PyObject *PyExc_OverflowError; |  | ||||||
| PyObject *PyExc_RuntimeError; |  | ||||||
| PyObject *PyExc_NotImplementedError; |  | ||||||
| PyObject *PyExc_SyntaxError; |  | ||||||
| PyObject *PyExc_SystemError; |  | ||||||
| PyObject *PyExc_SystemExit; |  | ||||||
| PyObject *PyExc_UnboundLocalError; |  | ||||||
| PyObject *PyExc_UnicodeError; |  | ||||||
| PyObject *PyExc_TypeError; |  | ||||||
| PyObject *PyExc_ValueError; |  | ||||||
| PyObject *PyExc_ZeroDivisionError; |  | ||||||
| #ifdef MS_WINDOWS |  | ||||||
| PyObject *PyExc_WindowsError; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| PyObject *PyExc_MemoryErrorInst; |  | ||||||
| 
 |  | ||||||
| static struct |  | ||||||
| { |  | ||||||
| 	char* name; |  | ||||||
| 	PyObject** exc; |  | ||||||
| } |  | ||||||
| bltin_exc[] = { |  | ||||||
| 	{"Exception",          &PyExc_Exception}, |  | ||||||
| 	{"StandardError",      &PyExc_StandardError}, |  | ||||||
| 	{"ArithmeticError",    &PyExc_ArithmeticError}, |  | ||||||
| 	{"LookupError",        &PyExc_LookupError}, |  | ||||||
| 	{"AssertionError",     &PyExc_AssertionError}, |  | ||||||
| 	{"AttributeError",     &PyExc_AttributeError}, |  | ||||||
| 	{"EOFError",           &PyExc_EOFError}, |  | ||||||
| 	{"FloatingPointError", &PyExc_FloatingPointError}, |  | ||||||
| 	{"EnvironmentError",   &PyExc_EnvironmentError}, |  | ||||||
| 	{"IOError",            &PyExc_IOError}, |  | ||||||
| 	{"OSError",            &PyExc_OSError}, |  | ||||||
| 	{"ImportError",        &PyExc_ImportError}, |  | ||||||
| 	{"IndexError",         &PyExc_IndexError}, |  | ||||||
| 	{"KeyError",           &PyExc_KeyError}, |  | ||||||
| 	{"KeyboardInterrupt",  &PyExc_KeyboardInterrupt}, |  | ||||||
| 	{"MemoryError",        &PyExc_MemoryError}, |  | ||||||
| 	{"NameError",          &PyExc_NameError}, |  | ||||||
| 	{"OverflowError",      &PyExc_OverflowError}, |  | ||||||
| 	{"RuntimeError",       &PyExc_RuntimeError}, |  | ||||||
|  	{"NotImplementedError",&PyExc_NotImplementedError}, |  | ||||||
| 	{"SyntaxError",        &PyExc_SyntaxError}, |  | ||||||
| 	{"SystemError",        &PyExc_SystemError}, |  | ||||||
| 	{"SystemExit",         &PyExc_SystemExit}, |  | ||||||
| 	{"UnboundLocalError",  &PyExc_UnboundLocalError}, |  | ||||||
| 	{"UnicodeError",       &PyExc_UnicodeError}, |  | ||||||
| 	{"TypeError",          &PyExc_TypeError}, |  | ||||||
| 	{"ValueError",         &PyExc_ValueError}, |  | ||||||
| #ifdef MS_WINDOWS |  | ||||||
| 	{"WindowsError",       &PyExc_WindowsError}, |  | ||||||
| #endif |  | ||||||
| 	{"ZeroDivisionError",  &PyExc_ZeroDivisionError}, |  | ||||||
| 	{NULL, NULL} |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /* Import exceptions module to extract class exceptions.  On success,
 |  | ||||||
|  * return 1.  On failure return 0 which signals _PyBuiltin_Init_2 to |  | ||||||
|  * issue a fatal error. |  | ||||||
|  */ |  | ||||||
| static int |  | ||||||
| init_class_exc(dict) |  | ||||||
| 	PyObject *dict; |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 	PyObject *m = PyImport_ImportModule("exceptions"); |  | ||||||
| 	PyObject *args = NULL; |  | ||||||
| 	PyObject *d = NULL; |  | ||||||
| 
 |  | ||||||
| 	/* make sure we got the module and its dictionary */ |  | ||||||
| 	if (m == NULL || |  | ||||||
| 	    (d = PyModule_GetDict(m)) == NULL) |  | ||||||
| 	{ |  | ||||||
| 		PySys_WriteStderr("'import exceptions' failed\n"); |  | ||||||
| 		goto finally; |  | ||||||
| 	} |  | ||||||
| 	for (i = 0; bltin_exc[i].name; i++) { |  | ||||||
| 		/* dig the exception out of the module */ |  | ||||||
| 		PyObject *exc = PyDict_GetItemString(d, bltin_exc[i].name); |  | ||||||
| 		if (!exc) { |  | ||||||
| 			PySys_WriteStderr( |  | ||||||
| 		"Built-in exception class not found: %s.  Library mismatch?\n", |  | ||||||
| 		bltin_exc[i].name); |  | ||||||
| 			goto finally; |  | ||||||
| 		} |  | ||||||
| 		/* free the old-style exception string object */ |  | ||||||
| 		Py_XDECREF(*bltin_exc[i].exc); |  | ||||||
| 
 |  | ||||||
| 		/* squirrel away a pointer to the exception */ |  | ||||||
| 		Py_INCREF(exc); |  | ||||||
| 		*bltin_exc[i].exc = exc; |  | ||||||
| 
 |  | ||||||
| 		/* and insert the name in the __builtin__ module */ |  | ||||||
| 		if (PyDict_SetItemString(dict, bltin_exc[i].name, exc)) { |  | ||||||
| 			PySys_WriteStderr( |  | ||||||
| 			      "Cannot insert exception into __builtin__: %s\n", |  | ||||||
| 			      bltin_exc[i].name); |  | ||||||
| 			goto finally; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* we need one pre-allocated instance */ |  | ||||||
| 	args = Py_BuildValue("()"); |  | ||||||
| 	if (!args || |  | ||||||
| 	    !(PyExc_MemoryErrorInst = |  | ||||||
| 	      PyEval_CallObject(PyExc_MemoryError, args))) |  | ||||||
| 	{ |  | ||||||
| 	       PySys_WriteStderr("Cannot pre-allocate MemoryError instance\n"); |  | ||||||
| 	       goto finally; |  | ||||||
| 	} |  | ||||||
| 	Py_DECREF(args); |  | ||||||
| 
 |  | ||||||
| 	/* we're done with the exceptions module */ |  | ||||||
| 	Py_DECREF(m); |  | ||||||
| 	return 1; |  | ||||||
| 
 |  | ||||||
|   finally: |  | ||||||
| 	Py_XDECREF(m); |  | ||||||
| 	Py_XDECREF(args); |  | ||||||
| 	PyErr_Clear(); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| static void |  | ||||||
| fini_instances() |  | ||||||
| { |  | ||||||
| 	Py_XDECREF(PyExc_MemoryErrorInst); |  | ||||||
| 	PyExc_MemoryErrorInst = NULL; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| static void |  | ||||||
| finierrors() |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 	for (i = 0; bltin_exc[i].name; i++) { |  | ||||||
| 		PyObject *exc = *bltin_exc[i].exc; |  | ||||||
| 		Py_XDECREF(exc); |  | ||||||
| 		*bltin_exc[i].exc = NULL; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static char builtin_doc[] = | static char builtin_doc[] = | ||||||
| "Built-in functions, exceptions, and other objects.\n\
 | "Built-in functions, exceptions, and other objects.\n\
 | ||||||
| \n\ | \n\ | ||||||
| Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices."; | Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices."; | ||||||
| 
 | 
 | ||||||
| PyObject * | PyObject * | ||||||
| _PyBuiltin_Init_1() | _PyBuiltin_Init() | ||||||
| { | { | ||||||
| 	PyObject *mod, *dict; | 	PyObject *mod, *dict; | ||||||
| 	mod = Py_InitModule4("__builtin__", builtin_methods, | 	mod = Py_InitModule4("__builtin__", builtin_methods, | ||||||
|  | @ -2547,30 +2382,6 @@ _PyBuiltin_Init_1() | ||||||
| 	return mod; | 	return mod; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void |  | ||||||
| _PyBuiltin_Init_2(dict) |  | ||||||
| 	PyObject *dict; |  | ||||||
| { |  | ||||||
| 	if (!init_class_exc(dict)) |  | ||||||
| 		/* class based exceptions could not be initialized. */ |  | ||||||
| 		Py_FatalError("Standard exceptions could not be initialized."); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| _PyBuiltin_Fini_1() |  | ||||||
| { |  | ||||||
| 	fini_instances(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| _PyBuiltin_Fini_2() |  | ||||||
| { |  | ||||||
| 	finierrors(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /* Helper for filter(): filter a tuple through a function */ | /* Helper for filter(): filter a tuple through a function */ | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Barry Warsaw
						Barry Warsaw