* 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:
Guido van Rossum 1993-10-18 11:44:47 +00:00
parent 842d2ccdcd
commit cacd9579d4
3 changed files with 98 additions and 24 deletions

View File

@ -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

View File

@ -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);

View File

@ -191,20 +191,22 @@ get_module(m, name, m_ret)
p = (dl_funcptr) dlsym(handle, funcname);
}
#else
p = dl_loadmod(argv0, namebuf, funcname);
#endif /* SUN_SHLIB */
if (p == NULL) {
D(fprintf(stderr, "dl_loadmod failed\n"));
} 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) {
err_setstr(SystemError,
"dynamic module does not define init function");
return NULL;
} else {
(*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,