blob: 56d1e6d1028caf32f920d8aaeca158d4c2358231 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* System module */
26
27/*
28Various bits of information used by the interpreter are collected in
29module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +000030Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +000031- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032Data members:
33- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000035- path: module search path (list of strings)
36- argv: script arguments (list of strings)
37- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038*/
39
Guido van Rossum3f5da241990-12-20 15:06:42 +000040#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042#include "sysmodule.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044#include "modsupport.h"
Guido van Rossume2437a11992-03-23 18:20:18 +000045#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000046
Guido van Rossume2437a11992-03-23 18:20:18 +000047object *sys_trace, *sys_profile;
Guido van Rossum9a1f3881995-03-30 11:01:58 +000048int sys_checkinterval = 10;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049
50static object *sysdict;
51
Guido van Rossumc606fe11996-04-09 02:37:57 +000052#ifdef NT
53extern void *PyWin_DLLhModule;
54#endif
55
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056object *
57sysget(name)
58 char *name;
59{
60 return dictlookup(sysdict, name);
61}
62
63FILE *
64sysgetfile(name, def)
65 char *name;
66 FILE *def;
67{
68 FILE *fp = NULL;
69 object *v = sysget(name);
Guido van Rossum3165fe61992-09-25 21:59:05 +000070 if (v != NULL && is_fileobject(v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071 fp = getfilefile(v);
72 if (fp == NULL)
73 fp = def;
74 return fp;
75}
76
77int
78sysset(name, v)
79 char *name;
80 object *v;
81{
Guido van Rossum5ad58c61992-01-26 18:15:48 +000082 if (v == NULL) {
83 if (dictlookup(sysdict, name) == NULL)
84 return 0;
85 else
86 return dictremove(sysdict, name);
87 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 else
89 return dictinsert(sysdict, name, v);
90}
91
92static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093sys_exit(self, args)
94 object *self;
95 object *args;
96{
Guido van Rossum6a468bf1991-12-31 13:15:35 +000097 /* Raise SystemExit so callers may catch it or clean up. */
98 err_setval(SystemExit, args);
99 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100}
101
Guido van Rossume2437a11992-03-23 18:20:18 +0000102static object *
103sys_settrace(self, args)
104 object *self;
105 object *args;
106{
107 if (args == None)
108 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000109 else
Guido van Rossum5dc8eb01992-06-19 13:57:27 +0000110 XINCREF(args);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000111 XDECREF(sys_trace);
Guido van Rossume2437a11992-03-23 18:20:18 +0000112 sys_trace = args;
113 INCREF(None);
114 return None;
115}
116
117static object *
118sys_setprofile(self, args)
119 object *self;
120 object *args;
121{
122 if (args == None)
123 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000124 else
Guido van Rossum5dc8eb01992-06-19 13:57:27 +0000125 XINCREF(args);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000126 XDECREF(sys_profile);
Guido van Rossume2437a11992-03-23 18:20:18 +0000127 sys_profile = args;
128 INCREF(None);
129 return None;
130}
131
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000132static object *
133sys_setcheckinterval(self, args)
134 object *self;
135 object *args;
136{
137 if (!newgetargs(args, "i", &sys_checkinterval))
138 return NULL;
139 INCREF(None);
140 return None;
141}
142
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000143#ifdef USE_MALLOPT
144/* Link with -lmalloc (or -lmpc) on an SGI */
145#include <malloc.h>
146
147static object *
148sys_mdebug(self, args)
149 object *self;
150 object *args;
151{
152 int flag;
153 if (!getargs(args, "i", &flag))
154 return NULL;
155 mallopt(M_DEBUG, flag);
156 INCREF(None);
157 return None;
158}
159#endif /* USE_MALLOPT */
160
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000161static object *
162sys_getrefcount(self, args)
163 object *self;
164 object *args;
165{
166 object *arg;
167 if (!getargs(args, "O", &arg))
168 return NULL;
169 return newintobject((long) arg->ob_refcnt);
170}
171
172#ifdef COUNT_ALLOCS
173static PyObject *
174sys_getcounts(self, args)
175 PyObject *self, *args;
176{
177 extern PyObject *get_counts Py_PROTO((void));
178
179 if (!PyArg_Parse(args, ""))
180 return NULL;
181 return get_counts();
182}
183#endif
184
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000185#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000186/* Defined in objects.c because it uses static globals if that file */
187extern PyObject *_Py_GetObjects Py_PROTO((PyObject *, PyObject *));
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000188#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000189
Guido van Rossum3f5da241990-12-20 15:06:42 +0000190static struct methodlist sys_methods[] = {
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000191 {"exit", sys_exit, 0},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000192 {"getrefcount", sys_getrefcount, 0},
193#ifdef COUNT_ALLOCS
194 {"getcounts", sys_getcounts, 0},
195#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000196#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000197 {"getobjects", _Py_GetObjects, 1},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000198#endif
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000199#ifdef USE_MALLOPT
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000200 {"mdebug", sys_mdebug, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000201#endif
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000202 {"setprofile", sys_setprofile, 0},
203 {"settrace", sys_settrace, 0},
Guido van Rossumb0352fa1996-01-12 01:15:01 +0000204 {"setcheckinterval", sys_setcheckinterval, 1},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000205 {NULL, NULL} /* sentinel */
206};
207
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208static object *sysin, *sysout, *syserr;
209
Guido van Rossum34679b71993-01-26 13:33:44 +0000210static object *
211list_builtin_module_names()
212{
213 object *list = newlistobject(0);
214 int i;
215 if (list == NULL)
216 return NULL;
217 for (i = 0; inittab[i].name != NULL; i++) {
218 object *name = newstringobject(inittab[i].name);
219 if (name == NULL)
220 break;
221 addlistitem(list, name);
222 DECREF(name);
223 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000224 if (sortlist(list) != 0) {
225 DECREF(list);
226 list = NULL;
227 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000228 return list;
229}
230
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232initsys()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000234 extern long getmaxint PROTO((void));
235 extern char *getversion PROTO((void));
236 extern char *getcopyright PROTO((void));
Guido van Rossumaaf18391995-07-07 22:45:02 +0000237 extern char *getplatform PROTO((void));
Guido van Rossum8fa9b6f1996-06-17 17:02:48 +0000238 extern char *Py_GetPrefix PROTO((void));
239 extern char *Py_GetExecPrefix PROTO((void));
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000240 extern int fclose PROTO((FILE *));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000241 object *m = initmodule("sys", sys_methods);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000242 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000243 sysdict = getmoduledict(m);
244 INCREF(sysdict);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 /* NB keep an extra ref to the std files to avoid closing them
246 when the user deletes them */
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000247 sysin = newopenfileobject(stdin, "<stdin>", "r", fclose);
248 sysout = newopenfileobject(stdout, "<stdout>", "w", fclose);
249 syserr = newopenfileobject(stderr, "<stderr>", "w", fclose);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 if (err_occurred())
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000251 fatal("can't initialize sys.std{in,out,err}");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252 dictinsert(sysdict, "stdin", sysin);
253 dictinsert(sysdict, "stdout", sysout);
254 dictinsert(sysdict, "stderr", syserr);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000255 dictinsert(sysdict, "version", v = newstringobject(getversion()));
256 XDECREF(v);
257 dictinsert(sysdict, "copyright", v = newstringobject(getcopyright()));
258 XDECREF(v);
Guido van Rossumaaf18391995-07-07 22:45:02 +0000259 dictinsert(sysdict, "platform", v = newstringobject(getplatform()));
260 XDECREF(v);
Guido van Rossum8fa9b6f1996-06-17 17:02:48 +0000261 dictinsert(sysdict, "prefix", v = newstringobject(Py_GetPrefix()));
262 XDECREF(v);
263 dictinsert(sysdict, "exec_prefix",
264 v = newstringobject(Py_GetExecPrefix()));
265 XDECREF(v);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000266 dictinsert(sysdict, "maxint", v = newintobject(getmaxint()));
267 XDECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268 dictinsert(sysdict, "modules", get_modules());
Guido van Rossum34679b71993-01-26 13:33:44 +0000269 dictinsert(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000270 v = list_builtin_module_names());
271 XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000272#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +0000273 dictinsert(sysdict, "dllhandle", v = newintobject((int)PyWin_DLLhModule));
274 XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000275 dictinsert(sysdict, "winver", v = newstringobject(MS_DLL_ID));
Guido van Rossumc606fe11996-04-09 02:37:57 +0000276 XDECREF(v);
277#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278 if (err_occurred())
279 fatal("can't insert sys.* objects in sys dict");
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000280}
281
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282static object *
283makepathobject(path, delim)
284 char *path;
285 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000286{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000287 int i, n;
288 char *p;
289 object *v, *w;
290
291 n = 1;
292 p = path;
293 while ((p = strchr(p, delim)) != NULL) {
294 n++;
295 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000296 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000297 v = newlistobject(n);
298 if (v == NULL)
299 return NULL;
300 for (i = 0; ; i++) {
301 p = strchr(path, delim);
302 if (p == NULL)
303 p = strchr(path, '\0'); /* End of string */
304 w = newsizedstringobject(path, (int) (p - path));
305 if (w == NULL) {
306 DECREF(v);
307 return NULL;
308 }
309 setlistitem(v, i, w);
310 if (*p == '\0')
311 break;
312 path = p+1;
313 }
314 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315}
316
317void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000318setpythonpath(path)
319 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000321 object *v;
322 if ((v = makepathobject(path, DELIM)) == NULL)
323 fatal("can't create sys.path");
324 if (sysset("path", v) != 0)
325 fatal("can't assign sys.path");
326 DECREF(v);
327}
328
329static object *
330makeargvobject(argc, argv)
331 int argc;
332 char **argv;
333{
334 object *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000335 if (argc <= 0 || argv == NULL) {
336 /* Ensure at least one (empty) argument is seen */
337 static char *empty_argv[1] = {""};
338 argv = empty_argv;
339 argc = 1;
340 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 av = newlistobject(argc);
342 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000343 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000344 for (i = 0; i < argc; i++) {
345 object *v = newstringobject(argv[i]);
346 if (v == NULL) {
347 DECREF(av);
348 av = NULL;
349 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000350 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 setlistitem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000352 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000353 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354 return av;
355}
356
357void
358setpythonargv(argc, argv)
359 int argc;
360 char **argv;
361{
362 object *av = makeargvobject(argc, argv);
Guido van Rossum94a96671996-07-30 20:35:50 +0000363 object *path = sysget("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000364 if (av == NULL)
365 fatal("no mem for sys.argv");
366 if (sysset("argv", av) != 0)
367 fatal("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000368 if (path != NULL) {
369 char *p = NULL;
370 int n;
371 object *a;
372 if (argc > 0 && argv[0] != NULL)
373 p = strrchr(argv[0], SEP);
374 if (p == NULL)
375 n = 0;
376 else
377 n = p + 1 - argv[0];
378 a = newsizedstringobject(argv[0], n);
379 if (a == NULL)
380 fatal("no mem for sys.path insertion");
381 if (inslistitem(path, 0, a) < 0)
382 fatal("sys.path.insert(0) failed");
383 DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000384 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386}