mirror of
https://github.com/python/cpython.git
synced 2025-07-09 20:35:26 +00:00
"Compiling" version
This commit is contained in:
parent
226d79eb4a
commit
3f5da24ea3
72 changed files with 3363 additions and 2061 deletions
|
@ -3,31 +3,31 @@
|
|||
/*
|
||||
Various bits of information used by the interpreter are collected in
|
||||
module 'sys'.
|
||||
Function member:
|
||||
- exit(sts): call (C, POSIX) exit(sts)
|
||||
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()
|
||||
- path: module search path (list of strings)
|
||||
- argv: script arguments (list of strings)
|
||||
- ps1, ps2: optional primary and secondary prompts (strings)
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "allobjects.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"
|
||||
|
||||
/* Define delimiter used in $PYTHONPATH */
|
||||
|
||||
#ifdef THINK_C
|
||||
#define DELIM ' '
|
||||
#endif
|
||||
|
||||
#ifndef DELIM
|
||||
#define DELIM ':'
|
||||
#endif
|
||||
|
||||
static object *sysdict;
|
||||
|
||||
|
@ -63,34 +63,6 @@ sysset(name, v)
|
|||
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;
|
||||
|
@ -104,88 +76,115 @@ sys_exit(self, args)
|
|||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
static struct methodlist sys_methods[] = {
|
||||
{"exit", sys_exit},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
static object *sysin, *sysout, *syserr;
|
||||
|
||||
void
|
||||
initsys(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
initsys()
|
||||
{
|
||||
object *v;
|
||||
object *exit;
|
||||
if ((sysdict = newdictobject()) == NULL)
|
||||
fatal("can't create sys dict");
|
||||
object *m = initmodule("sys", sys_methods);
|
||||
sysdict = getmoduledict(m);
|
||||
INCREF(sysdict);
|
||||
/* NB keep an extra ref to the std files to avoid closing them
|
||||
when the user deletes them */
|
||||
/* XXX File objects should have a "don't close" flag instead */
|
||||
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");
|
||||
fatal("can't create sys.std* file objects");
|
||||
dictinsert(sysdict, "stdin", sysin);
|
||||
dictinsert(sysdict, "stdout", sysout);
|
||||
dictinsert(sysdict, "stderr", syserr);
|
||||
dictinsert(sysdict, "argv", v);
|
||||
dictinsert(sysdict, "exit", exit);
|
||||
dictinsert(sysdict, "modules", get_modules());
|
||||
if (err_occurred())
|
||||
fatal("can't insert sys.* objects in sys dict");
|
||||
DECREF(exit);
|
||||
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");
|
||||
DECREF(v);
|
||||
}
|
||||
|
||||
static void
|
||||
cleardict(d)
|
||||
object *d;
|
||||
static object *
|
||||
makepathobject(path, delim)
|
||||
char *path;
|
||||
int delim;
|
||||
{
|
||||
int i;
|
||||
for (i = getdictsize(d); --i >= 0; ) {
|
||||
char *k;
|
||||
k = getdictkey(d, i);
|
||||
if (k != NULL) {
|
||||
(void) dictremove(d, k);
|
||||
}
|
||||
int i, n;
|
||||
char *p;
|
||||
object *v, *w;
|
||||
|
||||
n = 1;
|
||||
p = path;
|
||||
while ((p = strchr(p, delim)) != NULL) {
|
||||
n++;
|
||||
p++;
|
||||
}
|
||||
v = newlistobject(n);
|
||||
if (v == NULL)
|
||||
return NULL;
|
||||
for (i = 0; ; i++) {
|
||||
p = strchr(path, delim);
|
||||
if (p == NULL)
|
||||
p = strchr(path, '\0'); /* End of string */
|
||||
w = newsizedstringobject(path, (int) (p - path));
|
||||
if (w == NULL) {
|
||||
DECREF(v);
|
||||
return NULL;
|
||||
}
|
||||
setlistitem(v, i, w);
|
||||
if (*p == '\0')
|
||||
break;
|
||||
path = p+1;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
void
|
||||
closesys()
|
||||
setpythonpath(path)
|
||||
char *path;
|
||||
{
|
||||
object *modules;
|
||||
modules = sysget("modules");
|
||||
if (modules != NULL && is_dictobject(modules)) {
|
||||
int i;
|
||||
/* Explicitly erase all modules; this is the safest way
|
||||
to get rid of at least *some* circular dependencies */
|
||||
INCREF(modules);
|
||||
for (i = getdictsize(modules); --i >= 0; ) {
|
||||
char *k;
|
||||
k = getdictkey(modules, i);
|
||||
if (k != NULL) {
|
||||
object *m;
|
||||
m = dictlookup(modules, k);
|
||||
if (m != NULL && is_moduleobject(m)) {
|
||||
object *d;
|
||||
d = getmoduledict(m);
|
||||
if (d != NULL && is_dictobject(d)) {
|
||||
cleardict(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cleardict(modules);
|
||||
DECREF(modules);
|
||||
}
|
||||
DECREF(sysdict);
|
||||
object *v;
|
||||
if ((v = makepathobject(path, DELIM)) == NULL)
|
||||
fatal("can't create sys.path");
|
||||
if (sysset("path", v) != 0)
|
||||
fatal("can't assign sys.path");
|
||||
DECREF(v);
|
||||
}
|
||||
|
||||
static object *
|
||||
makeargvobject(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
object *av;
|
||||
if (argc < 0 || argv == NULL)
|
||||
argc = 0;
|
||||
av = newlistobject(argc);
|
||||
if (av != NULL) {
|
||||
int i;
|
||||
for (i = 0; i < argc; i++) {
|
||||
object *v = newstringobject(argv[i]);
|
||||
if (v == NULL) {
|
||||
DECREF(av);
|
||||
av = NULL;
|
||||
break;
|
||||
}
|
||||
setlistitem(av, i, v);
|
||||
}
|
||||
}
|
||||
return av;
|
||||
}
|
||||
|
||||
void
|
||||
setpythonargv(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
object *av = makeargvobject(argc, argv);
|
||||
if (av == NULL)
|
||||
fatal("no mem for sys.argv");
|
||||
if (sysset("argv", av) != 0)
|
||||
fatal("can't assign sys.argv");
|
||||
DECREF(av);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue