static PyObject * run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals, PyCompilerFlags *flags, PyArena *arena) { PyCodeObject *co; PyObject *v; co = PyAST_CompileObject(mod, filename, flags, -1, arena); if (co == NULL) return NULL; v = run_eval_code_obj(co, globals, locals); Py_DECREF(co); return v; }
/* parser_compilest(PyObject* self, PyObject* args) * * This function creates code objects from the parse tree represented by * the passed-in data object. An optional file name is passed in as well. * */ static PyObject* parser_compilest(PyST_Object *self, PyObject *args, PyObject *kw) { PyObject* res = NULL; PyArena* arena = NULL; mod_ty mod; PyObject* filename = NULL; int ok; static char *keywords[] = {"st", "filename", NULL}; if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|O&:compilest", keywords, &PyST_Type, &self, PyUnicode_FSDecoder, &filename); else ok = PyArg_ParseTupleAndKeywords(args, kw, "|O&:compile", &keywords[1], PyUnicode_FSDecoder, &filename); if (!ok) goto error; if (filename == NULL) { filename = PyUnicode_FromString("<syntax-tree>"); if (filename == NULL) goto error; } arena = PyArena_New(); if (!arena) goto error; mod = PyAST_FromNodeObject(self->st_node, &self->st_flags, filename, arena); if (!mod) goto error; res = (PyObject *)PyAST_CompileObject(mod, filename, &self->st_flags, -1, arena); error: Py_XDECREF(filename); if (arena != NULL) PyArena_Free(arena); return res; }
PyObject * Py_CompileStringObject(const char *str, PyObject *filename, int start, PyCompilerFlags *flags, int optimize) { PyCodeObject *co; mod_ty mod; PyArena *arena = PyArena_New(); if (arena == NULL) return NULL; mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); if (mod == NULL) { PyArena_Free(arena); return NULL; } if (flags && (flags->cf_flags & PyCF_ONLY_AST)) { PyObject *result = PyAST_mod2obj(mod); PyArena_Free(arena); return result; } co = PyAST_CompileObject(mod, filename, flags, optimize, arena); PyArena_Free(arena); return (PyObject *)co; }