mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +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