| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							|  |  |  | Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The | 
					
						
							|  |  |  | Netherlands. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         All Rights Reserved | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Permission to use, copy, modify, and distribute this software and its  | 
					
						
							|  |  |  | documentation for any purpose and without fee is hereby granted,  | 
					
						
							|  |  |  | provided that the above copyright notice appear in all copies and that | 
					
						
							|  |  |  | both that copyright notice and this permission notice appear in  | 
					
						
							|  |  |  | supporting documentation, and that the names of Stichting Mathematisch | 
					
						
							|  |  |  | Centrum or CWI not be used in advertising or publicity pertaining to | 
					
						
							|  |  |  | distribution of the software without specific, written prior permission. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO | 
					
						
							|  |  |  | THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | 
					
						
							|  |  |  | FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE | 
					
						
							|  |  |  | FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | 
					
						
							|  |  |  | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | 
					
						
							|  |  |  | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | 
					
						
							|  |  |  | OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ******************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | /* Module definition and import implementation */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | #include "allobjects.h"
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "node.h"
 | 
					
						
							|  |  |  | #include "token.h"
 | 
					
						
							|  |  |  | #include "graminit.h"
 | 
					
						
							|  |  |  | #include "import.h"
 | 
					
						
							|  |  |  | #include "errcode.h"
 | 
					
						
							|  |  |  | #include "sysmodule.h"
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | #include "pythonrun.h"
 | 
					
						
							| 
									
										
										
										
											1991-06-04 19:39:42 +00:00
										 |  |  | #include "marshal.h"
 | 
					
						
							|  |  |  | #include "compile.h"
 | 
					
						
							|  |  |  | #include "ceval.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1991-12-16 13:06:34 +00:00
										 |  |  | /* Magic word to reject pre-0.9.4 .pyc files */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MAGIC 0x949494L
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | /* Define pathname separator used in file names */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1991-06-24 22:30:42 +00:00
										 |  |  | #ifdef macintosh
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | #define SEP ':'
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1991-05-05 20:07:59 +00:00
										 |  |  | #ifdef MSDOS
 | 
					
						
							|  |  |  | #define SEP '\\'
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | #ifndef SEP
 | 
					
						
							|  |  |  | #define SEP '/'
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | static object *modules; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1991-04-03 19:03:52 +00:00
										 |  |  | /* Forward */ | 
					
						
							|  |  |  | static int init_builtin PROTO((char *)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | /* Initialization */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | initimport() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	if ((modules = newdictobject()) == NULL) | 
					
						
							|  |  |  | 		fatal("no mem for dictionary of modules"); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | object * | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | get_modules() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return modules; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | object * | 
					
						
							|  |  |  | add_module(name) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	char *name; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	object *m; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m)) | 
					
						
							|  |  |  | 		return m; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	m = newmoduleobject(name); | 
					
						
							|  |  |  | 	if (m == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	if (dictinsert(modules, name, m) != 0) { | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 		DECREF(m); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	DECREF(m); /* Yes, it still exists, in modules! */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	return m; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static FILE * | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | open_module(name, suffix, namebuf) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	char *name; | 
					
						
							|  |  |  | 	char *suffix; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	char *namebuf; /* XXX No buffer overflow checks! */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	object *path; | 
					
						
							|  |  |  | 	FILE *fp; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	path = sysget("path"); | 
					
						
							|  |  |  | 	if (path == NULL || !is_listobject(path)) { | 
					
						
							|  |  |  | 		strcpy(namebuf, name); | 
					
						
							|  |  |  | 		strcat(namebuf, suffix); | 
					
						
							|  |  |  | 		fp = fopen(namebuf, "r"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		int npath = getlistsize(path); | 
					
						
							|  |  |  | 		int i; | 
					
						
							|  |  |  | 		fp = NULL; | 
					
						
							|  |  |  | 		for (i = 0; i < npath; i++) { | 
					
						
							|  |  |  | 			object *v = getlistitem(path, i); | 
					
						
							|  |  |  | 			int len; | 
					
						
							|  |  |  | 			if (!is_stringobject(v)) | 
					
						
							|  |  |  | 				continue; | 
					
						
							|  |  |  | 			strcpy(namebuf, getstringvalue(v)); | 
					
						
							|  |  |  | 			len = getstringsize(v); | 
					
						
							|  |  |  | 			if (len > 0 && namebuf[len-1] != SEP) | 
					
						
							|  |  |  | 				namebuf[len++] = SEP; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			strcpy(namebuf+len, name); | 
					
						
							|  |  |  | 			strcat(namebuf, suffix); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 			fp = fopen(namebuf, "r"); | 
					
						
							|  |  |  | 			if (fp != NULL) | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return fp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static object * | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | get_module(m, name, m_ret) | 
					
						
							|  |  |  | 	/*module*/object *m; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	char *name; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	object **m_ret; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1991-06-04 19:39:42 +00:00
										 |  |  | 	codeobject *co = NULL; | 
					
						
							|  |  |  | 	object *v, *d; | 
					
						
							|  |  |  | 	FILE *fp, *fpc; | 
					
						
							| 
									
										
										
										
											1990-10-26 14:58:58 +00:00
										 |  |  | 	node *n; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	int err; | 
					
						
							| 
									
										
										
										
											1991-06-04 19:39:42 +00:00
										 |  |  | 	char namebuf[258]; | 
					
						
							|  |  |  | 	int namelen; | 
					
						
							|  |  |  | 	long mtime; | 
					
						
							|  |  |  | 	extern long getmtime(); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	fp = open_module(name, ".py", namebuf); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	if (fp == NULL) { | 
					
						
							| 
									
										
										
										
											1991-12-24 13:26:56 +00:00
										 |  |  | 		if (m == NULL) { | 
					
						
							|  |  |  | 			sprintf(namebuf, "no module named %.200s", name); | 
					
						
							|  |  |  | 			err_setstr(ImportError, namebuf); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			sprintf(namebuf, "no source for module %.200s", name); | 
					
						
							|  |  |  | 			err_setstr(ImportError, namebuf); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1991-06-04 19:39:42 +00:00
										 |  |  | 	/* Get mtime -- always useful */ | 
					
						
							|  |  |  | 	mtime = getmtime(namebuf); | 
					
						
							|  |  |  | 	/* Check ".pyc" file first */ | 
					
						
							|  |  |  | 	namelen = strlen(namebuf); | 
					
						
							|  |  |  | 	namebuf[namelen] = 'c'; | 
					
						
							|  |  |  | 	namebuf[namelen+1] = '\0'; | 
					
						
							|  |  |  | 	fpc = fopen(namebuf, "rb"); | 
					
						
							|  |  |  | 	if (fpc != NULL) { | 
					
						
							|  |  |  | 		long pyc_mtime; | 
					
						
							| 
									
										
										
										
											1991-12-16 13:06:34 +00:00
										 |  |  | 		long magic; | 
					
						
							|  |  |  | 		magic = rd_long(fpc); | 
					
						
							| 
									
										
										
										
											1991-06-04 19:39:42 +00:00
										 |  |  | 		pyc_mtime = rd_long(fpc); | 
					
						
							| 
									
										
										
										
											1991-12-16 13:06:34 +00:00
										 |  |  | 		if (magic == MAGIC && pyc_mtime == mtime && mtime != 0 && mtime != -1) { | 
					
						
							| 
									
										
										
										
											1991-06-04 19:39:42 +00:00
										 |  |  | 			v = rd_object(fpc); | 
					
						
							|  |  |  | 			if (v == NULL || err_occurred() || !is_codeobject(v)) { | 
					
						
							|  |  |  | 				err_clear(); | 
					
						
							|  |  |  | 				XDECREF(v); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				co = (codeobject *)v; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		fclose(fpc); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	namebuf[namelen] = '\0'; | 
					
						
							|  |  |  | 	if (co == NULL) | 
					
						
							|  |  |  | 		err = parse_file(fp, namebuf, file_input, &n); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		err = E_DONE; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	fclose(fp); | 
					
						
							|  |  |  | 	if (err != E_DONE) { | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 		err_input(err); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (m == NULL) { | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 		m = add_module(name); | 
					
						
							|  |  |  | 		if (m == NULL) { | 
					
						
							|  |  |  | 			freetree(n); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		*m_ret = m; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	d = getmoduledict(m); | 
					
						
							| 
									
										
										
										
											1991-06-04 19:39:42 +00:00
										 |  |  | 	if (co == NULL) { | 
					
						
							|  |  |  | 		co = compile(n, namebuf); | 
					
						
							|  |  |  | 		freetree(n); | 
					
						
							|  |  |  | 		if (co == NULL) | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		/* Now write the code object to the ".pyc" file */ | 
					
						
							|  |  |  | 		namebuf[namelen] = 'c'; | 
					
						
							|  |  |  | 		namebuf[namelen+1] = '\0'; | 
					
						
							|  |  |  | 		fpc = fopen(namebuf, "wb"); | 
					
						
							|  |  |  | 		if (fpc != NULL) { | 
					
						
							| 
									
										
										
										
											1991-12-16 13:06:34 +00:00
										 |  |  | 			wr_long(MAGIC, fpc); | 
					
						
							| 
									
										
										
										
											1991-06-04 19:39:42 +00:00
										 |  |  | 			/* First write a 0 for mtime */ | 
					
						
							|  |  |  | 			wr_long(0L, fpc); | 
					
						
							|  |  |  | 			wr_object((object *)co, fpc); | 
					
						
							|  |  |  | 			if (ferror(fpc)) { | 
					
						
							|  |  |  | 				/* Don't keep partial file */ | 
					
						
							|  |  |  | 				fclose(fpc); | 
					
						
							|  |  |  | 				(void) unlink(namebuf); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							|  |  |  | 				/* Now write the true mtime */ | 
					
						
							|  |  |  | 				fseek(fpc, 4L, 0); | 
					
						
							|  |  |  | 				wr_long(mtime, fpc); | 
					
						
							|  |  |  | 				fflush(fpc); | 
					
						
							|  |  |  | 				fclose(fpc); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	v = eval_code(co, d, d, (object *)NULL); | 
					
						
							|  |  |  | 	DECREF(co); | 
					
						
							|  |  |  | 	return v; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static object * | 
					
						
							|  |  |  | load_module(name) | 
					
						
							|  |  |  | 	char *name; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	object *m, *v; | 
					
						
							|  |  |  | 	v = get_module((object *)NULL, name, &m); | 
					
						
							|  |  |  | 	if (v == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	DECREF(v); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	return m; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | object * | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | import_module(name) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	char *name; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	object *m; | 
					
						
							| 
									
										
										
										
											1991-02-19 12:23:57 +00:00
										 |  |  | 	if ((m = dictlookup(modules, name)) == NULL) { | 
					
						
							|  |  |  | 		if (init_builtin(name)) { | 
					
						
							|  |  |  | 			if ((m = dictlookup(modules, name)) == NULL) | 
					
						
							|  |  |  | 				err_setstr(SystemError, "builtin module missing"); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			m = load_module(name); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	return m; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1990-10-26 14:58:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | object * | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | reload_module(m) | 
					
						
							| 
									
										
										
										
											1990-10-26 14:58:58 +00:00
										 |  |  | 	object *m; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (m == NULL || !is_moduleobject(m)) { | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 		err_setstr(TypeError, "reload() argument must be module"); | 
					
						
							| 
									
										
										
										
											1990-10-26 14:58:58 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	/* XXX Ought to check for builtin modules -- can't reload these... */ | 
					
						
							|  |  |  | 	return get_module(m, getmodulename(m), (object **)NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | cleardict(d) | 
					
						
							|  |  |  | 	object *d; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	for (i = getdictsize(d); --i >= 0; ) { | 
					
						
							|  |  |  | 		char *k; | 
					
						
							|  |  |  | 		k = getdictkey(d, i); | 
					
						
							|  |  |  | 		if (k != NULL) | 
					
						
							|  |  |  | 			(void) dictremove(d, k); | 
					
						
							| 
									
										
										
										
											1990-10-26 14:58:58 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | doneimport() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (modules != NULL) { | 
					
						
							|  |  |  | 		int i; | 
					
						
							|  |  |  | 		/* Explicitly erase all modules; this is the safest way
 | 
					
						
							|  |  |  | 		   to get rid of at least *some* circular dependencies */ | 
					
						
							|  |  |  | 		for (i = getdictsize(modules); --i >= 0; ) { | 
					
						
							| 
									
										
										
										
											1991-08-16 09:01:08 +00:00
										 |  |  | 			object *k; | 
					
						
							|  |  |  | 			k = getdict2key(modules, i); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			if (k != NULL) { | 
					
						
							|  |  |  | 				object *m; | 
					
						
							| 
									
										
										
										
											1991-08-16 09:01:08 +00:00
										 |  |  | 				m = dict2lookup(modules, k); | 
					
						
							|  |  |  | 				if (m == NULL) | 
					
						
							|  |  |  | 					err_clear(); | 
					
						
							|  |  |  | 				else if (is_moduleobject(m)) { | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 					object *d; | 
					
						
							|  |  |  | 					d = getmoduledict(m); | 
					
						
							|  |  |  | 					if (d != NULL && is_dictobject(d)) { | 
					
						
							|  |  |  | 						cleardict(d); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		cleardict(modules); | 
					
						
							| 
									
										
										
										
											1990-10-26 14:58:58 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	DECREF(modules); | 
					
						
							| 
									
										
										
										
											1990-10-26 14:58:58 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1991-02-19 12:23:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Initialize built-in modules when first imported */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern struct { | 
					
						
							|  |  |  | 	char *name; | 
					
						
							|  |  |  | 	void (*initfunc)(); | 
					
						
							|  |  |  | } inittab[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | init_builtin(name) | 
					
						
							|  |  |  | 	char *name; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	for (i = 0; inittab[i].name != NULL; i++) { | 
					
						
							|  |  |  | 		if (strcmp(name, inittab[i].name) == 0) { | 
					
						
							|  |  |  | 			(*inittab[i].initfunc)(); | 
					
						
							|  |  |  | 			return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } |