view Python/sysmodule.c @ 73:3028acaa56b0 legacy-trunk

Compile class definitions. Document and fix code generation for try statements. Use two bytes for all arguments. Avoid duplicate entries in lists of constants and names.
author Guido van Rossum <guido@python.org>
date Sun, 18 Nov 1990 17:35:03 +0000
parents fc6fcd7df4f7
children f6bcf3c1d714
line wrap: on
line source

/* System module */

/*
Various bits of information used by the interpreter are collected in
module 'sys'.
Data members:
- stdin, stdout, stderr: standard file objects
- ps1, ps2: primary and secondary prompts (strings)
- path: module search path (list of strings)
- modules: the table of modules (dictionary)
Function members:
- exit(sts): call exit()
*/

#include <stdio.h>

#include "PROTO.h"
#include "object.h"
#include "stringobject.h"
#include "listobject.h"
#include "dictobject.h"
#include "fileobject.h"
#include "moduleobject.h"
#include "sysmodule.h"
#include "node.h" /* For context.h */
#include "context.h" /* For import.h */
#include "import.h"
#include "methodobject.h"
#include "modsupport.h"
#include "errors.h"

static object *sysdict;

object *
sysget(name)
	char *name;
{
	return dictlookup(sysdict, name);
}

FILE *
sysgetfile(name, def)
	char *name;
	FILE *def;
{
	FILE *fp = NULL;
	object *v = sysget(name);
	if (v != NULL)
		fp = getfilefile(v);
	if (fp == NULL)
		fp = def;
	return fp;
}

int
sysset(name, v)
	char *name;
	object *v;
{
	if (v == NULL)
		return dictremove(sysdict, name);
	else
		return dictinsert(sysdict, name, v);
}

static object *
makeargv(argc, argv)
	int argc;
	char **argv;
{
	int i;
	object *av, *v;
	if (argc < 0 || argv == NULL)
		argc = 0;
	av = newlistobject(argc);
	if (av != NULL) {
		for (i = 0; i < argc; i++) {
			v = newstringobject(argv[i]);
			if (v == NULL) {
				DECREF(av);
				av = NULL;
				break;
			}
			setlistitem(av, i, v);
		}
	}
	if (av == NULL)
		fatal("no mem for sys.argv");
	return av;
}

/* sys.exit method */

static object *
sys_exit(self, args)
	object *self;
	object *args;
{
	int sts;
	if (!getintarg(args, &sts))
		return NULL;
	goaway(sts);
	exit(sts); /* Just in case */
	/* NOTREACHED */
}

static object *sysin, *sysout, *syserr;

void
initsys(argc, argv)
	int argc;
	char **argv;
{
	object *v;
	object *exit;
	if ((sysdict = newdictobject()) == NULL)
		fatal("can't create sys dict");
	/* NB keep an extra ref to the std files to avoid closing them
	   when the user deletes them */
	sysin = newopenfileobject(stdin, "<stdin>", "r");
	sysout = newopenfileobject(stdout, "<stdout>", "w");
	syserr = newopenfileobject(stderr, "<stderr>", "w");
	v = makeargv(argc, argv);
	exit = newmethodobject("exit", sys_exit, (object *)NULL);
	if (err_occurred())
		fatal("can't create sys.* objects");
	dictinsert(sysdict, "stdin", sysin);
	dictinsert(sysdict, "stdout", sysout);
	dictinsert(sysdict, "stderr", syserr);
	dictinsert(sysdict, "argv", v);
	dictinsert(sysdict, "exit", exit);
	if (err_occurred())
		fatal("can't insert sys.* objects in sys dict");
	DECREF(v);
	/* The other symbols are added elsewhere */
	
	/* Only now can we initialize the import stuff, after which
	   we can turn ourselves into a module */
	initimport();
	if ((v = new_module("sys")) == NULL)
		fatal("can't create sys module");
	if (setmoduledict(v, sysdict) != 0)
		fatal("can't assign sys dict to sys module");
}

void
closesys()
{
	object *mtab;
	mtab = sysget("modules");
	if (mtab != NULL && is_dictobject(mtab))
		dictremove(mtab, "sys"); /* Get rid of recursion */
	else
		fprintf(stderr, "[module sys not found]\n");
	DECREF(sysdict);
}