Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cacd957

Browse files
committed
* 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.
1 parent 842d2cc commit cacd957

3 files changed

Lines changed: 98 additions & 24 deletions

File tree

Modules/config.c.in

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7070
#define DATE ">= 29 Jul 1993"
7171
#endif
7272

73-
#ifdef USE_STDWIN
74-
#ifdef macintosh
75-
#include ":::stdwin:H:stdwin.h"
76-
#else /* !macintosh */
77-
#include "stdwin.h"
78-
#endif /* !macintosh */
79-
#endif /* USE_STDWIN */
80-
8173
char version[80];
8274

8375
char *argv0; /* For dynamic loading in import.c */
@@ -94,12 +86,6 @@ initargs(p_argc, p_argv)
9486

9587
argv0 = **p_argv;
9688

97-
#ifdef USE_STDWIN
98-
#ifdef THINK_C_3_0
99-
wsetstdio(1);
100-
#endif
101-
wargs(p_argc, p_argv);
102-
#endif /* USE_STDWIN */
10389
#ifdef USE_FROZEN
10490
if (verbose)
10591
#else
@@ -120,9 +106,6 @@ initcalls()
120106
void
121107
donecalls()
122108
{
123-
#ifdef USE_STDWIN
124-
wdone();
125-
#endif
126109
#ifdef USE_AUDIO
127110
asa_done();
128111
#endif

Modules/stdwinmodule.c

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
6666
#include "allobjects.h"
6767
#include "modsupport.h"
6868
#include "ceval.h"
69+
#include "sysmodule.h"
6970

7071
#ifdef macintosh
7172
#include ":::stdwin:H:stdwin.h"
@@ -1942,6 +1943,21 @@ typeobject Windowtype = {
19421943

19431944
/* Stdwin methods */
19441945

1946+
static object *
1947+
stdwin_done(sw, args)
1948+
object *sw;
1949+
object *args;
1950+
{
1951+
if (!getnoarg(args))
1952+
return NULL;
1953+
wdone();
1954+
/* XXX There is no protection against continued use of
1955+
XXX stdwin functions or objects after this call is made.
1956+
XXX Use at own risk */
1957+
INCREF(None);
1958+
return None;
1959+
}
1960+
19451961
static object *
19461962
stdwin_open(sw, args)
19471963
object *sw;
@@ -2467,6 +2483,7 @@ static struct methodlist stdwin_methods[] = {
24672483
{"askfile", stdwin_askfile},
24682484
{"askstr", stdwin_askstr},
24692485
{"askync", stdwin_askync},
2486+
{"done", stdwin_done},
24702487
{"fetchcolor", stdwin_fetchcolor},
24712488
#ifdef unix
24722489
{"fileno", stdwin_connectionnumber},
@@ -2515,14 +2532,86 @@ static struct methodlist stdwin_methods[] = {
25152532
{NULL, NULL} /* sentinel */
25162533
};
25172534

2535+
static int
2536+
checkstringlist(args, ps, pn)
2537+
object *args;
2538+
char ***ps;
2539+
int *pn;
2540+
{
2541+
int i, n;
2542+
char **s;
2543+
if (!is_listobject(args)) {
2544+
err_setstr(TypeError, "list of strings expected");
2545+
return 0;
2546+
}
2547+
n = getlistsize(args);
2548+
s = NEW(char *, n+1);
2549+
if (s == NULL) {
2550+
err_nomem();
2551+
return 0;
2552+
}
2553+
for (i = 0; i < n; i++) {
2554+
object *item = getlistitem(args, i);
2555+
if (!is_stringobject(item)) {
2556+
err_setstr(TypeError, "list of strings expected");
2557+
return 0;
2558+
}
2559+
s[i] = getstringvalue(item);
2560+
}
2561+
s[n] = NULL; /* In case caller wants a NULL-terminated list */
2562+
*ps = s;
2563+
*pn = n;
2564+
return 1;
2565+
}
2566+
2567+
static int
2568+
putbackstringlist(list, s, n)
2569+
object *list;
2570+
char **s;
2571+
int n;
2572+
{
2573+
int oldsize = getlistsize(list);
2574+
object *newlist;
2575+
int i;
2576+
if (n == oldsize)
2577+
return 1;
2578+
newlist = newlistobject(n);
2579+
for (i = 0; i < n && newlist != NULL; i++) {
2580+
object *item = newstringobject(s[i]);
2581+
if (item == NULL) {
2582+
DECREF(newlist);
2583+
newlist = NULL;
2584+
}
2585+
else
2586+
setlistitem(newlist, i, item);
2587+
}
2588+
if (newlist == NULL)
2589+
return 0;
2590+
(*list->ob_type->tp_as_sequence->sq_ass_slice)
2591+
(list, 0, oldsize, newlist);
2592+
DECREF(newlist);
2593+
return 1;
2594+
}
2595+
25182596
void
25192597
initstdwin()
25202598
{
25212599
object *m, *d;
25222600
static int inited = 0;
25232601

25242602
if (!inited) {
2525-
winit();
2603+
int argc = 0;
2604+
char **argv = NULL;
2605+
object *sys_argv = sysget("argv");
2606+
if (sys_argv != NULL) {
2607+
if (!checkstringlist(sys_argv, &argv, &argc))
2608+
err_clear();
2609+
}
2610+
winitargs(&argc, &argv);
2611+
if (argv != NULL) {
2612+
if (!putbackstringlist(sys_argv, argv, argc))
2613+
err_clear();
2614+
}
25262615
inited = 1;
25272616
}
25282617
m = initmodule("stdwin", stdwin_methods);

Python/import.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,20 +191,22 @@ get_module(m, name, m_ret)
191191
p = (dl_funcptr) dlsym(handle, funcname);
192192
}
193193
#else
194+
if (verbose)
195+
fprintf(stderr,
196+
"import %s # dynamically loaded from \"%s\"\n",
197+
name, namebuf);
194198
p = dl_loadmod(argv0, namebuf, funcname);
195199
#endif /* SUN_SHLIB */
196200
if (p == NULL) {
197-
D(fprintf(stderr, "dl_loadmod failed\n"));
201+
err_setstr(SystemError,
202+
"dynamic module does not define init function");
203+
return NULL;
198204
} else {
199-
if (verbose)
200-
fprintf(stderr,
201-
"import %s # dynamically loaded from \"%s\"\n",
202-
name, namebuf);
203205
(*p)();
204206
*m_ret = m = dictlookup(modules, name);
205207
if (m == NULL) {
206208
err_setstr(SystemError,
207-
"dynamic module missing");
209+
"dynamic module not initialized properly");
208210
return NULL;
209211
} else {
210212
D(fprintf(stderr,

0 commit comments

Comments
 (0)