mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	fix import related leaks
This commit is contained in:
		
							parent
							
								
									855d0b3602
								
							
						
					
					
						commit
						7f9fa97ca2
					
				
					 2 changed files with 23 additions and 17 deletions
				
			
		|  | @ -47,14 +47,10 @@ builtin___import__(self, args) | ||||||
| 	object *args; | 	object *args; | ||||||
| { | { | ||||||
| 	char *name; | 	char *name; | ||||||
| 	object *m; |  | ||||||
| 
 | 
 | ||||||
| 	if (!newgetargs(args, "s:__import__", &name)) | 	if (!newgetargs(args, "s:__import__", &name)) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	m = import_module(name); | 	return import_module(name); | ||||||
| 	XINCREF(m); |  | ||||||
| 
 |  | ||||||
| 	return m; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -110,8 +110,8 @@ get_modules() | ||||||
| /* Get the module object corresponding to a module name.
 | /* Get the module object corresponding to a module name.
 | ||||||
|    First check the modules dictionary if there's one there, |    First check the modules dictionary if there's one there, | ||||||
|    if not, create a new one and insert in in the modules dictionary. |    if not, create a new one and insert in in the modules dictionary. | ||||||
|    Because the former action is most common, this does not return a |    Because the former action is most common, THIS DOES NOT RETURN A | ||||||
|    'new' reference! */ |    'NEW' REFERENCE! */ | ||||||
| 
 | 
 | ||||||
| object * | object * | ||||||
| add_module(name) | add_module(name) | ||||||
|  | @ -135,7 +135,8 @@ add_module(name) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Execute a code object in a module and return its module object */ | /* Execute a code object in a module and return the module object
 | ||||||
|  |    WITH INCREMENTED REFERENCE COUNT */ | ||||||
| 
 | 
 | ||||||
| static object * | static object * | ||||||
| exec_code_module(name, co) | exec_code_module(name, co) | ||||||
|  | @ -247,7 +248,7 @@ read_compiled_module(fp) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Load a module from a compiled file, execute it, and return its
 | /* Load a module from a compiled file, execute it, and return its
 | ||||||
|    module object */ |    module object WITH INCREMENTED REFERENCE COUNT */ | ||||||
| 
 | 
 | ||||||
| static object * | static object * | ||||||
| load_compiled_module(name, cpathname, fp) | load_compiled_module(name, cpathname, fp) | ||||||
|  | @ -344,8 +345,8 @@ write_compiled_module(co, cpathname, mtime) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Load a source module from a given file and return its module
 | /* Load a source module from a given file and return its module
 | ||||||
|    object.  If there's a matching byte-compiled file, use that |    object WITH INCREMENTED REFERENCE COUNT.  If there's a matching | ||||||
|    instead. */ |    byte-compiled file, use that instead. */ | ||||||
| 
 | 
 | ||||||
| static object * | static object * | ||||||
| load_source_module(name, pathname, fp) | load_source_module(name, pathname, fp) | ||||||
|  | @ -452,7 +453,7 @@ find_module(name, path, buf, buflen, p_fp) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Load an external module using the default search path and return
 | /* Load an external module using the default search path and return
 | ||||||
|    its module object */ |    its module object WITH INCREMENTED REFERENCE COUNT */ | ||||||
| 
 | 
 | ||||||
| static object * | static object * | ||||||
| load_module(name) | load_module(name) | ||||||
|  | @ -461,7 +462,7 @@ load_module(name) | ||||||
| 	char buf[MAXPATHLEN+1]; | 	char buf[MAXPATHLEN+1]; | ||||||
| 	struct filedescr *fdp; | 	struct filedescr *fdp; | ||||||
| 	FILE *fp = NULL; | 	FILE *fp = NULL; | ||||||
| 	object *m = NULL; | 	object *m; | ||||||
| 
 | 
 | ||||||
| 	fdp = find_module(name, (object *)NULL, buf, MAXPATHLEN+1, &fp); | 	fdp = find_module(name, (object *)NULL, buf, MAXPATHLEN+1, &fp); | ||||||
| 	if (fdp == NULL) | 	if (fdp == NULL) | ||||||
|  | @ -484,6 +485,7 @@ load_module(name) | ||||||
| 	default: | 	default: | ||||||
| 		err_setstr(SystemError, | 		err_setstr(SystemError, | ||||||
| 			   "find_module returned unexpected result"); | 			   "find_module returned unexpected result"); | ||||||
|  | 		m = NULL; | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
| 	fclose(fp); | 	fclose(fp); | ||||||
|  | @ -556,12 +558,15 @@ init_frozen(name) | ||||||
| 	} | 	} | ||||||
| 	m = exec_code_module(name, (codeobject *)co); | 	m = exec_code_module(name, (codeobject *)co); | ||||||
| 	DECREF(co); | 	DECREF(co); | ||||||
| 	return m == NULL ? -1 : 1; | 	if (m == NULL) | ||||||
|  | 		return -1; | ||||||
|  | 	DECREF(m); | ||||||
|  | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Import a module, either built-in, frozen, or external, and return
 | /* Import a module, either built-in, frozen, or external, and return
 | ||||||
|    its module object */ |    its module object WITH INCREMENTED REFERENCE COUNT */ | ||||||
| 
 | 
 | ||||||
| object * | object * | ||||||
| import_module(name) | import_module(name) | ||||||
|  | @ -569,7 +574,10 @@ import_module(name) | ||||||
| { | { | ||||||
| 	object *m; | 	object *m; | ||||||
| 
 | 
 | ||||||
| 	if ((m = dictlookup(import_modules, name)) == NULL) { | 	if ((m = dictlookup(import_modules, name)) != NULL) { | ||||||
|  | 		INCREF(m); | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
| 		int i; | 		int i; | ||||||
| 		if ((i = init_builtin(name)) || (i = init_frozen(name))) { | 		if ((i = init_builtin(name)) || (i = init_frozen(name))) { | ||||||
| 			if (i < 0) | 			if (i < 0) | ||||||
|  | @ -579,6 +587,8 @@ import_module(name) | ||||||
| 			        err_setstr(SystemError, | 			        err_setstr(SystemError, | ||||||
| 				 "built-in module not initialized properly"); | 				 "built-in module not initialized properly"); | ||||||
| 			} | 			} | ||||||
|  | 			else | ||||||
|  | 				INCREF(m); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 			m = load_module(name); | 			m = load_module(name); | ||||||
|  | @ -613,10 +623,10 @@ reload_module(m) | ||||||
| 	if ((i = init_builtin(name)) || (i = init_frozen(name))) { | 	if ((i = init_builtin(name)) || (i = init_frozen(name))) { | ||||||
| 		if (i < 0) | 		if (i < 0) | ||||||
| 			return NULL; | 			return NULL; | ||||||
|  | 		INCREF(m); | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 		m = load_module(name); | 		m = load_module(name); | ||||||
| 	XINCREF(m); |  | ||||||
| 	return m; | 	return m; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum