mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	* stdwinmodule.c (stdwin_done): interface to shutdown stdwin (now this is
no longer done by config.c). * stdwinmodule.c (initstdwin), config.c (initall): get command line arguments from sys.argv instead of special-casing stdwin in config.c * import.c (get_module): fix core dump when foomodule.o does not define initfoo(). * ChangeLog: documented changes by Sjoerd.
This commit is contained in:
		
							parent
							
								
									842d2ccdcd
								
							
						
					
					
						commit
						cacd9579d4
					
				
					 3 changed files with 98 additions and 24 deletions
				
			
		|  | @ -70,14 +70,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| #define DATE ">= 29 Jul 1993" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef USE_STDWIN | ||||
| #ifdef macintosh | ||||
| #include ":::stdwin:H:stdwin.h" | ||||
| #else /* !macintosh */ | ||||
| #include "stdwin.h" | ||||
| #endif /* !macintosh */ | ||||
| #endif /* USE_STDWIN */ | ||||
| 
 | ||||
| char version[80]; | ||||
| 
 | ||||
| char *argv0; /* For dynamic loading in import.c */ | ||||
|  | @ -94,12 +86,6 @@ initargs(p_argc, p_argv) | |||
| 
 | ||||
| 	argv0 = **p_argv; | ||||
| 
 | ||||
| #ifdef USE_STDWIN | ||||
| #ifdef THINK_C_3_0 | ||||
| 	wsetstdio(1); | ||||
| #endif | ||||
| 	wargs(p_argc, p_argv); | ||||
| #endif /* USE_STDWIN */ | ||||
| #ifdef USE_FROZEN | ||||
| 	if (verbose) | ||||
| #else | ||||
|  | @ -120,9 +106,6 @@ initcalls() | |||
| void | ||||
| donecalls() | ||||
| { | ||||
| #ifdef USE_STDWIN | ||||
| 	wdone(); | ||||
| #endif | ||||
| #ifdef USE_AUDIO | ||||
| 	asa_done(); | ||||
| #endif | ||||
|  |  | |||
|  | @ -66,6 +66,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| #include "allobjects.h" | ||||
| #include "modsupport.h" | ||||
| #include "ceval.h" | ||||
| #include "sysmodule.h" | ||||
| 
 | ||||
| #ifdef macintosh | ||||
| #include ":::stdwin:H:stdwin.h" | ||||
|  | @ -1942,6 +1943,21 @@ typeobject Windowtype = { | |||
| 
 | ||||
| /* Stdwin methods */ | ||||
| 
 | ||||
| static object * | ||||
| stdwin_done(sw, args) | ||||
| 	object *sw; | ||||
| 	object *args; | ||||
| { | ||||
| 	if (!getnoarg(args)) | ||||
| 		return NULL; | ||||
| 	wdone(); | ||||
| 	/* XXX There is no protection against continued use of
 | ||||
| 	   XXX stdwin functions or objects after this call is made. | ||||
| 	   XXX Use at own risk */ | ||||
| 	INCREF(None); | ||||
| 	return None; | ||||
| } | ||||
| 
 | ||||
| static object * | ||||
| stdwin_open(sw, args) | ||||
| 	object *sw; | ||||
|  | @ -2467,6 +2483,7 @@ static struct methodlist stdwin_methods[] = { | |||
| 	{"askfile",		stdwin_askfile}, | ||||
| 	{"askstr",		stdwin_askstr}, | ||||
| 	{"askync",		stdwin_askync}, | ||||
| 	{"done",		stdwin_done}, | ||||
| 	{"fetchcolor",		stdwin_fetchcolor}, | ||||
| #ifdef unix | ||||
| 	{"fileno",		stdwin_connectionnumber}, | ||||
|  | @ -2515,6 +2532,67 @@ static struct methodlist stdwin_methods[] = { | |||
| 	{NULL,			NULL}		/* sentinel */ | ||||
| }; | ||||
| 
 | ||||
| static int | ||||
| checkstringlist(args, ps, pn) | ||||
| 	object *args; | ||||
| 	char ***ps; | ||||
| 	int *pn; | ||||
| { | ||||
| 	int i, n; | ||||
| 	char **s; | ||||
| 	if (!is_listobject(args)) { | ||||
| 		err_setstr(TypeError, "list of strings expected"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	n = getlistsize(args); | ||||
| 	s = NEW(char *, n+1); | ||||
| 	if (s == NULL) { | ||||
| 		err_nomem(); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	for (i = 0; i < n; i++) { | ||||
| 		object *item = getlistitem(args, i); | ||||
| 		if (!is_stringobject(item)) { | ||||
| 			err_setstr(TypeError, "list of strings expected"); | ||||
| 			return 0; | ||||
| 		} | ||||
| 		s[i] = getstringvalue(item); | ||||
| 	} | ||||
| 	s[n] = NULL; /* In case caller wants a NULL-terminated list */ | ||||
| 	*ps = s; | ||||
| 	*pn = n; | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| putbackstringlist(list, s, n) | ||||
| 	object *list; | ||||
| 	char **s; | ||||
| 	int n; | ||||
| { | ||||
| 	int oldsize = getlistsize(list); | ||||
| 	object *newlist; | ||||
| 	int i; | ||||
| 	if (n == oldsize) | ||||
| 		return 1; | ||||
| 	newlist = newlistobject(n); | ||||
| 	for (i = 0; i < n && newlist != NULL; i++) { | ||||
| 		object *item = newstringobject(s[i]); | ||||
| 		if (item == NULL) { | ||||
| 			DECREF(newlist); | ||||
| 			newlist = NULL; | ||||
| 		} | ||||
| 		else | ||||
| 			setlistitem(newlist, i, item); | ||||
| 	} | ||||
| 	if (newlist == NULL) | ||||
| 		return 0; | ||||
| 	(*list->ob_type->tp_as_sequence->sq_ass_slice) | ||||
| 		(list, 0, oldsize, newlist); | ||||
| 	DECREF(newlist); | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| initstdwin() | ||||
| { | ||||
|  | @ -2522,7 +2600,18 @@ initstdwin() | |||
| 	static int inited = 0; | ||||
| 
 | ||||
| 	if (!inited) { | ||||
| 		winit(); | ||||
| 		int argc = 0; | ||||
| 		char **argv = NULL; | ||||
| 		object *sys_argv = sysget("argv"); | ||||
| 		if (sys_argv != NULL) { | ||||
| 			if (!checkstringlist(sys_argv, &argv, &argc)) | ||||
| 				err_clear(); | ||||
| 		} | ||||
| 		winitargs(&argc, &argv); | ||||
| 		if (argv != NULL) { | ||||
| 			if (!putbackstringlist(sys_argv, argv, argc)) | ||||
| 				err_clear(); | ||||
| 		} | ||||
| 		inited = 1; | ||||
| 	} | ||||
| 	m = initmodule("stdwin", stdwin_methods); | ||||
|  |  | |||
|  | @ -191,20 +191,22 @@ get_module(m, name, m_ret) | |||
| 		  p = (dl_funcptr) dlsym(handle, funcname); | ||||
| 		} | ||||
| #else | ||||
| 		if (verbose) | ||||
| 			fprintf(stderr, | ||||
| 				"import %s # dynamically loaded from \"%s\"\n", | ||||
| 				name, namebuf); | ||||
| 		p =  dl_loadmod(argv0, namebuf, funcname); | ||||
| #endif /* SUN_SHLIB */ | ||||
| 		if (p == NULL) { | ||||
| 			D(fprintf(stderr, "dl_loadmod failed\n")); | ||||
| 			err_setstr(SystemError, | ||||
| 			   "dynamic module does not define init function"); | ||||
| 			return NULL; | ||||
| 		} else { | ||||
| 			if (verbose) | ||||
| 				fprintf(stderr, | ||||
| 			"import %s # dynamically loaded from \"%s\"\n", | ||||
| 					name, namebuf); | ||||
| 			(*p)(); | ||||
| 			*m_ret = m = dictlookup(modules, name); | ||||
| 			if (m == NULL) { | ||||
| 				err_setstr(SystemError, | ||||
| 					   "dynamic module missing"); | ||||
| 				   "dynamic module not initialized properly"); | ||||
| 				return NULL; | ||||
| 			} else { | ||||
| 				D(fprintf(stderr, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum