📄 pythonrun.c
字号:
PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
{
return run_err_node(PyParser_SimpleParseString(str, start),
"<string>", globals, locals, NULL);
}
DL_EXPORT(PyObject *)
PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
PyObject *locals)
{
return PyRun_FileEx(fp, filename, start, globals, locals, 0);
}
DL_EXPORT(PyObject *)
PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
PyObject *locals, int closeit)
{
node *n = PyParser_SimpleParseFile(fp, filename, start);
if (closeit)
fclose(fp);
return run_err_node(n, filename, globals, locals, NULL);
}
DL_EXPORT(PyObject *)
PyRun_StringFlags(char *str, int start, PyObject *globals, PyObject *locals,
PyCompilerFlags *flags)
{
return run_err_node(PyParser_SimpleParseStringFlags(
str, start,
(flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
PyPARSE_YIELD_IS_KEYWORD : 0),
"<string>", globals, locals, flags);
}
DL_EXPORT(PyObject *)
PyRun_FileFlags(FILE *fp, char *filename, int start, PyObject *globals,
PyObject *locals, PyCompilerFlags *flags)
{
return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
flags);
}
DL_EXPORT(PyObject *)
PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals,
PyObject *locals, int closeit, PyCompilerFlags *flags)
{
node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
(flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
PyPARSE_YIELD_IS_KEYWORD : 0);
if (closeit)
fclose(fp);
return run_err_node(n, filename, globals, locals, flags);
}
static PyObject *
run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals,
PyCompilerFlags *flags)
{
if (n == NULL)
return NULL;
return run_node(n, filename, globals, locals, flags);
}
static PyObject *
run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
PyCompilerFlags *flags)
{
PyCodeObject *co;
PyObject *v;
co = PyNode_CompileFlags(n, filename, flags);
PyNode_Free(n);
if (co == NULL)
return NULL;
v = PyEval_EvalCode(co, globals, locals);
Py_DECREF(co);
return v;
}
static PyObject *
run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals,
PyCompilerFlags *flags)
{
PyCodeObject *co;
PyObject *v;
long magic;
long PyImport_GetMagicNumber(void);
magic = PyMarshal_ReadLongFromFile(fp);
if (magic != PyImport_GetMagicNumber()) {
PyErr_SetString(PyExc_RuntimeError,
"Bad magic number in .pyc file");
return NULL;
}
(void) PyMarshal_ReadLongFromFile(fp);
v = PyMarshal_ReadLastObjectFromFile(fp);
fclose(fp);
if (v == NULL || !PyCode_Check(v)) {
Py_XDECREF(v);
PyErr_SetString(PyExc_RuntimeError,
"Bad code object in .pyc file");
return NULL;
}
co = (PyCodeObject *)v;
v = PyEval_EvalCode(co, globals, locals);
if (v && flags)
flags->cf_flags |= (co->co_flags & PyCF_MASK);
Py_DECREF(co);
return v;
}
DL_EXPORT(PyObject *)
Py_CompileString(char *str, char *filename, int start)
{
return Py_CompileStringFlags(str, filename, start, NULL);
}
DL_EXPORT(PyObject *)
Py_CompileStringFlags(char *str, char *filename, int start,
PyCompilerFlags *flags)
{
node *n;
PyCodeObject *co;
n = PyParser_SimpleParseStringFlags(str, start,
(flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
PyPARSE_YIELD_IS_KEYWORD : 0);
if (n == NULL)
return NULL;
co = PyNode_CompileFlags(n, filename, flags);
PyNode_Free(n);
return (PyObject *)co;
}
DL_EXPORT(struct symtable *)
Py_SymtableString(char *str, char *filename, int start)
{
node *n;
struct symtable *st;
n = PyParser_SimpleParseString(str, start);
if (n == NULL)
return NULL;
st = PyNode_CompileSymtable(n, filename);
PyNode_Free(n);
return st;
}
/* Simplified interface to parsefile -- return node or set exception */
DL_EXPORT(node *)
PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
{
node *n;
perrdetail err;
// XXX:CW32
n = PyParser_ParseFileFlags(fp, filename, (grammar *)&_PyParser_Grammar, start,
(char *)0, (char *)0, &err, flags);
if (n == NULL)
err_input(&err);
return n;
}
DL_EXPORT(node *)
PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
{
return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
}
/* Simplified interface to parsestring -- return node or set exception */
DL_EXPORT(node *)
PyParser_SimpleParseStringFlags(char *str, int start, int flags)
{
node *n;
perrdetail err;
// XXX:CW32
n = PyParser_ParseStringFlags(str, (grammar *)&_PyParser_Grammar, start, &err,
flags);
if (n == NULL)
err_input(&err);
return n;
}
DL_EXPORT(node *)
PyParser_SimpleParseString(char *str, int start)
{
return PyParser_SimpleParseStringFlags(str, start, 0);
}
/* Set the error appropriate to the given input error code (see errcode.h) */
static void
err_input(perrdetail *err)
{
PyObject *v, *w, *errtype;
char *msg = NULL;
errtype = PyExc_SyntaxError;
v = Py_BuildValue("(ziiz)", err->filename,
err->lineno, err->offset, err->text);
if (err->text != NULL) {
PyMem_DEL(err->text);
err->text = NULL;
}
switch (err->error) {
case E_SYNTAX:
errtype = PyExc_IndentationError;
if (err->expected == INDENT)
msg = "expected an indented block";
else if (err->token == INDENT)
msg = "unexpected indent";
else if (err->token == DEDENT)
msg = "unexpected unindent";
else {
errtype = PyExc_SyntaxError;
msg = "invalid syntax";
}
break;
case E_TOKEN:
msg = "invalid token";
break;
case E_INTR:
PyErr_SetNone(PyExc_KeyboardInterrupt);
Py_XDECREF(v);
return;
case E_NOMEM:
PyErr_NoMemory();
Py_XDECREF(v);
return;
case E_EOF:
msg = "unexpected EOF while parsing";
break;
case E_TABSPACE:
errtype = PyExc_TabError;
msg = "inconsistent use of tabs and spaces in indentation";
break;
case E_OVERFLOW:
msg = "expression too long";
break;
case E_DEDENT:
errtype = PyExc_IndentationError;
msg = "unindent does not match any outer indentation level";
break;
case E_TOODEEP:
errtype = PyExc_IndentationError;
msg = "too many levels of indentation";
break;
default:
fprintf(stderr, "error=%d\n", err->error);
msg = "unknown parsing error";
break;
}
w = Py_BuildValue("(sO)", msg, v);
Py_XDECREF(v);
PyErr_SetObject(errtype, w);
Py_XDECREF(w);
}
/* Print fatal error message and abort */
DL_EXPORT(void)
Py_FatalError(char *msg)
{
fprintf(stderr, "Fatal Python error: %s\n", msg);
#ifdef macintosh
for (;;);
#endif
#ifdef MS_WIN32
OutputDebugString("Fatal Python error: ");
OutputDebugString(msg);
OutputDebugString("\n");
#ifdef _DEBUG
DebugBreak();
#endif
#endif /* MS_WIN32 */
abort();
}
/* Clean up and exit */
#ifdef WITH_THREAD
#include "pythread.h"
#ifndef SYMBIAN
int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
#else
#define _PyThread_Started (PYTHON_GLOBALS->_PyThread_Started)
#endif
#endif
#ifndef SYMBIAN
#define NEXITFUNCS 32
static void (*exitfuncs[NEXITFUNCS])(void);
static int nexitfuncs = 0;
#else
#define exitfuncs (PYTHON_GLOBALS->exitfuncs)
#define nexitfuncs (PYTHON_GLOBALS->nexitfuncs)
#endif
DL_EXPORT(int)
Py_AtExit(void (*func)(void))
{
if (nexitfuncs >= NEXITFUNCS)
return -1;
exitfuncs[nexitfuncs++] = func;
return 0;
}
#ifdef SYMBIAN
#undef exitfuncs
#undef nexitfuncs
#endif
static void
call_sys_exitfunc(void)
{
PyObject *exitfunc = PySys_GetObject("exitfunc");
if (exitfunc) {
PyObject *res;
Py_INCREF(exitfunc);
PySys_SetObject("exitfunc", (PyObject *)NULL);
res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
if (res == NULL) {
if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
PySys_WriteStderr("Error in sys.exitfunc:\n");
}
PyErr_Print();
}
Py_DECREF(exitfunc);
}
if (Py_FlushLine())
PyErr_Clear();
}
static void
call_ll_exitfuncs(void)
{
#ifdef SYMBIAN
SPy_Python_globals* pyglobals = PYTHON_GLOBALS; // avoid TLS reads
#define exitfuncs (pyglobals->exitfuncs)
#define nexitfuncs (pyglobals->nexitfuncs)
#endif
while (nexitfuncs > 0)
(*exitfuncs[--nexitfuncs])();
fflush(stdout);
fflush(stderr);
#ifdef SYMBIAN
#undef exitfuncs
#undef nexitfuncs
#endif
}
DL_EXPORT(void)
Py_Exit(int sts)
{
Py_Finalize();
#ifdef macintosh
PyMac_Exit(sts);
#else
exit(sts);
#endif
}
static void
initsigs(void)
{
#ifdef HAVE_SIGNAL_H
#ifdef SIGPIPE
signal(SIGPIPE, SIG_IGN);
#endif
#ifdef SIGXFZ
signal(SIGXFZ, SIG_IGN);
#endif
#endif /* HAVE_SIGNAL_H */
PyOS_InitInterrupts(); /* May imply initsignal() */
}
#ifdef Py_TRACE_REFS
/* Ask a yes/no question */
DL_EXPORT(int)
_Py_AskYesNo(char *prompt)
{
char buf[256];
fprintf(stderr, "%s [ny] ", prompt);
if (fgets(buf, sizeof buf, stdin) == NULL)
return 0;
return buf[0] == 'y' || buf[0] == 'Y';
}
#endif
#ifdef MPW
/* Check for file descriptor connected to interactive device.
Pretend that stdin is always interactive, other files never. */
int
isatty(int fd)
{
return fd == fileno(stdin);
}
#endif
/*
* The file descriptor fd is considered ``interactive'' if either
* a) isatty(fd) is TRUE, or
* b) the -i flag was given, and the filename associated with
* the descriptor is NULL or "<stdin>" or "???".
*/
DL_EXPORT(int)
Py_FdIsInteractive(FILE *fp, char *filename)
{
if (isatty((int)fileno(fp)))
return 1;
if (!Py_InteractiveFlag)
return 0;
return (filename == NULL) ||
(strcmp(filename, "<stdin>") == 0) ||
(strcmp(filename, "???") == 0);
}
#if defined(USE_STACKCHECK)
#if defined(WIN32) && defined(_MSC_VER)
/* Stack checking for Microsoft C */
#include <malloc.h>
#include <excpt.h>
/*
* Return non-zero when we run out of memory on the stack; zero otherwise.
*/
DL_EXPORT(int)
PyOS_CheckStack(void)
{
__try {
/* _alloca throws a stack overflow exception if there's
not enough space left on the stack */
_alloca(PYOS_STACK_MARGIN * sizeof(void*));
return 0;
} __except (EXCEPTION_EXECUTE_HANDLER) {
/* just ignore all errors */
}
return 1;
}
#endif /* WIN32 && _MSC_VER */
/* Alternate implementations can be added here... */
#ifdef SYMBIAN
extern int e32_check_stack(void);
DL_EXPORT(int)
PyOS_CheckStack(void)
{
return e32_check_stack();
}
#endif /* SYMBIAN */
#endif /* USE_STACKCHECK */
/* Wrappers around sigaction() or signal(). */
DL_EXPORT(PyOS_sighandler_t)
PyOS_getsig(int sig)
{
#ifdef HAVE_SIGACTION
struct sigaction context;
/* Initialize context.sa_handler to SIG_ERR which makes about as
* much sense as anything else. It should get overwritten if
* sigaction actually succeeds and otherwise we avoid an
* uninitialized memory read.
*/
context.sa_handler = SIG_ERR;
sigaction(sig, NULL, &context);
return context.sa_handler;
#else
#ifdef HAVE_SIGNAL_H
PyOS_sighandler_t handler;
handler = signal(sig, SIG_IGN);
signal(sig, handler);
return handler;
#else
return NULL;
#endif
#endif
}
DL_EXPORT(PyOS_sighandler_t)
PyOS_setsig(int sig, PyOS_sighandler_t handler)
{
#ifdef HAVE_SIGACTION
struct sigaction context;
PyOS_sighandler_t oldhandler;
/* Initialize context.sa_handler to SIG_ERR which makes about as
* much sense as anything else. It should get overwritten if
* sigaction actually succeeds and otherwise we avoid an
* uninitialized memory read.
*/
context.sa_handler = SIG_ERR;
sigaction(sig, NULL, &context);
oldhandler = context.sa_handler;
context.sa_handler = handler;
sigaction(sig, &context, NULL);
return oldhandler;
#else
#ifdef HAVE_SIGNAL_H
return signal(sig, handler);
#endif
#endif
return NULL; // No signal support on Symbian -- not much we can do.
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -