fix import related leaks
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index dbf201e..517aea1 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -47,14 +47,10 @@
object *args;
{
char *name;
- object *m;
if (!newgetargs(args, "s:__import__", &name))
return NULL;
- m = import_module(name);
- XINCREF(m);
-
- return m;
+ return import_module(name);
}
diff --git a/Python/import.c b/Python/import.c
index 302cc25..9219c36 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -110,8 +110,8 @@
/* Get the module object corresponding to a module name.
First check the modules dictionary if there's one there,
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
- 'new' reference! */
+ Because the former action is most common, THIS DOES NOT RETURN A
+ 'NEW' REFERENCE! */
object *
add_module(name)
@@ -135,7 +135,8 @@
}
-/* 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 *
exec_code_module(name, co)
@@ -247,7 +248,7 @@
/* Load a module from a compiled file, execute it, and return its
- module object */
+ module object WITH INCREMENTED REFERENCE COUNT */
static object *
load_compiled_module(name, cpathname, fp)
@@ -344,8 +345,8 @@
/* Load a source module from a given file and return its module
- object. If there's a matching byte-compiled file, use that
- instead. */
+ object WITH INCREMENTED REFERENCE COUNT. If there's a matching
+ byte-compiled file, use that instead. */
static object *
load_source_module(name, pathname, fp)
@@ -452,7 +453,7 @@
/* Load an external module using the default search path and return
- its module object */
+ its module object WITH INCREMENTED REFERENCE COUNT */
static object *
load_module(name)
@@ -461,7 +462,7 @@
char buf[MAXPATHLEN+1];
struct filedescr *fdp;
FILE *fp = NULL;
- object *m = NULL;
+ object *m;
fdp = find_module(name, (object *)NULL, buf, MAXPATHLEN+1, &fp);
if (fdp == NULL)
@@ -484,6 +485,7 @@
default:
err_setstr(SystemError,
"find_module returned unexpected result");
+ m = NULL;
}
fclose(fp);
@@ -556,12 +558,15 @@
}
m = exec_code_module(name, (codeobject *)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
- its module object */
+ its module object WITH INCREMENTED REFERENCE COUNT */
object *
import_module(name)
@@ -569,7 +574,10 @@
{
object *m;
- if ((m = dictlookup(import_modules, name)) == NULL) {
+ if ((m = dictlookup(import_modules, name)) != NULL) {
+ INCREF(m);
+ }
+ else {
int i;
if ((i = init_builtin(name)) || (i = init_frozen(name))) {
if (i < 0)
@@ -579,6 +587,8 @@
err_setstr(SystemError,
"built-in module not initialized properly");
}
+ else
+ INCREF(m);
}
else
m = load_module(name);
@@ -613,10 +623,10 @@
if ((i = init_builtin(name)) || (i = init_frozen(name))) {
if (i < 0)
return NULL;
+ INCREF(m);
}
else
m = load_module(name);
- XINCREF(m);
return m;
}