From cacd9579d48cb1e2acc3536c9701987b118edf8c Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 18 Oct 1993 11:44:47 +0000 Subject: [PATCH] * 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. --- Modules/config.c.in | 17 -------- Modules/stdwinmodule.c | 91 +++++++++++++++++++++++++++++++++++++++++- Python/import.c | 14 ++++--- 3 files changed, 98 insertions(+), 24 deletions(-) diff --git a/Modules/config.c.in b/Modules/config.c.in index f19655f73f5..fc803628033 100644 --- a/Modules/config.c.in +++ b/Modules/config.c.in @@ -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 diff --git a/Modules/stdwinmodule.c b/Modules/stdwinmodule.c index a6f6fba9bdd..1fff814a39f 100644 --- a/Modules/stdwinmodule.c +++ b/Modules/stdwinmodule.c @@ -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); diff --git a/Python/import.c b/Python/import.c index 284d881f208..4d01daf7a22 100644 --- a/Python/import.c +++ b/Python/import.c @@ -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,