summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1993-10-18 11:44:47 (GMT)
committerGuido van Rossum <guido@python.org>1993-10-18 11:44:47 (GMT)
commitcacd9579d48cb1e2acc3536c9701987b118edf8c (patch)
treea3d31a150228428d44866f8a5e6fe496c5c9dbff
parent842d2ccdcd540399501a918b9724d2eaf5599f39 (diff)
downloadcpython-cacd9579d48cb1e2acc3536c9701987b118edf8c.zip
cpython-cacd9579d48cb1e2acc3536c9701987b118edf8c.tar.gz
cpython-cacd9579d48cb1e2acc3536c9701987b118edf8c.tar.bz2
* 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.
-rw-r--r--Modules/config.c.in17
-rw-r--r--Modules/stdwinmodule.c91
-rw-r--r--Python/import.c14
3 files changed, 98 insertions, 24 deletions
diff --git a/Modules/config.c.in b/Modules/config.c.in
index f19655f..fc80362 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 a6f6fba..1fff814 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"
@@ -1943,6 +1944,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;
object *args;
@@ -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 284d881..4d01daf 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,