/
githubmirror
/
cpython
Обзор
Документация
Войти
/
githubmirror
/
cpython
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
Modules/_testcapi/run.c
823 строки
20 KB
Victor Stinner
gh-152132: Test Py_CompileString() in test_capi.test_run (#153470)
10 июл 2026, 04:36
Не верифицирован
10 июл 2026, 04:36
d83d267
Код
Авторство
О чём код?
#define PYTESTCAPI_NEED_INTERNAL_API #include "parts.h" #include "util.h" #include "pycore_fileutils.h" // _Py_IsValidFD() #include <stdio.h> #include <errno.h> // Test functions, not macros #undef PyRun_AnyFile #undef PyRun_AnyFileEx #undef PyRun_AnyFileFlags #undef PyRun_File #undef PyRun_FileEx #undef PyRun_FileFlags #undef PyRun_SimpleFile #undef PyRun_SimpleFileEx #undef PyRun_String #undef PyRun_SimpleString #undef Py_CompileString #undef Py_CompileStringFlags #undef PyRun_InteractiveOne #undef PyRun_InteractiveLoop // Test PyRun_String() static PyObject* run_string(PyObject *mod, PyObject *args) { const char *str; int start; PyObject *globals = NULL; PyObject *locals = NULL; if (!PyArg_ParseTuple(args, "yi|OO", &str, &start, &globals, &locals)) { return NULL; } NULLABLE(globals); NULLABLE(locals); return PyRun_String(str, start, globals, locals); } // Test PyRun_StringFlags() static PyObject* run_stringflags(PyObject *mod, PyObject *args) { const char *str; Py_ssize_t size; int start; PyObject *globals = NULL; PyObject *locals = NULL; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; int cf_feature_version = 0; if (!PyArg_ParseTuple(args, "z#iO|Oii", &str, &size, &start, &globals, &locals, &cf_flags, &cf_feature_version)) { return NULL; } NULLABLE(globals); NULLABLE(locals); if (cf_flags || cf_feature_version) { flags.cf_flags = cf_flags; flags.cf_feature_version = cf_feature_version; pflags = &flags; } return PyRun_StringFlags(str, start, globals, locals, pflags); } static FILE* open_file(PyObject *filename, int *closeit) { if (PyUnicode_EqualToUTF8(filename, "<stdin>")) { if (closeit) { // override closeit *closeit = 0; } return stdin; } return Py_fopen(filename, "r"); } // Test PyRun_SimpleFile() static PyObject* run_simplefile(PyObject *mod, PyObject *args) { PyObject *open_filename; const char *filename; if (!PyArg_ParseTuple(args, "Oy", &open_filename, &filename)) { return NULL; } FILE *fp = open_file(open_filename, NULL); if (fp == NULL) { return NULL; } int fd = fileno(fp); int res = PyRun_SimpleFile(fp, filename); assert(_Py_IsValidFD(fd)); fclose(fp); assert(!PyErr_Occurred()); return PyLong_FromLong(res); } static int close_fd(FILE *fp, int fd, int closeit) { if (closeit && _Py_IsValidFD(fd)) { PyErr_SetString(PyExc_AssertionError, "File was not closed after execution"); fclose(fp); return -1; } if (!closeit && !_Py_IsValidFD(fd)) { PyErr_SetString(PyExc_AssertionError, "Bad file descriptor after execution"); return -1; } if (!closeit) { fclose(fp); } return 0; } static int close_fd_result(FILE *fp, int fd, int closeit, PyObject *result) { if (closeit && result && _Py_IsValidFD(fd)) { PyErr_SetString(PyExc_AssertionError, "File was not closed after execution"); Py_DECREF(result); fclose(fp); return -1; } if (!closeit && !_Py_IsValidFD(fd)) { PyErr_SetString(PyExc_AssertionError, "Bad file descriptor after execution"); Py_XDECREF(result); return -1; } if (!closeit) { fclose(fp); } return 0; } // Test PyRun_SimpleFileEx() static PyObject* run_simplefileex(PyObject *mod, PyObject *args) { PyObject *open_filename; const char *filename; int closeit = 0; if (!PyArg_ParseTuple(args, "Oy|i", &open_filename, &filename, &closeit)) { return NULL; } FILE *fp = open_file(open_filename, &closeit); if (fp == NULL) { return NULL; } int fd = fileno(fp); int res = PyRun_SimpleFileEx(fp, filename, closeit); if (close_fd(fp, fd, closeit) < 0) { return NULL; } assert(!PyErr_Occurred()); return PyLong_FromLong(res); } // Test PyRun_SimpleFileExFlags() static PyObject* run_simplefileexflags(PyObject *mod, PyObject *args) { PyObject *open_filename; const char *filename; int closeit = 0; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; if (!PyArg_ParseTuple(args, "Oy|ii", &open_filename, &filename, &closeit, &cf_flags)) { return NULL; } FILE *fp = open_file(open_filename, &closeit); if (fp == NULL) { return NULL; } int fd = fileno(fp); if (cf_flags) { flags.cf_flags = cf_flags; pflags = &flags; } int res = PyRun_SimpleFileExFlags(fp, filename, closeit, pflags); if (close_fd(fp, fd, closeit) < 0) { return NULL; } assert(!PyErr_Occurred()); return PyLong_FromLong(res); } // Test PyRun_AnyFile() static PyObject* run_anyfile(PyObject *mod, PyObject *args) { PyObject *open_filename; const char *filename; if (!PyArg_ParseTuple(args, "Oy", &open_filename, &filename)) { return NULL; } FILE *fp = open_file(open_filename, NULL); if (fp == NULL) { return NULL; } int fd = fileno(fp); int res = PyRun_AnyFile(fp, filename); assert(_Py_IsValidFD(fd)); fclose(fp); assert(!PyErr_Occurred()); return PyLong_FromLong(res); } // Test PyRun_AnyFileFlags() static PyObject* run_anyfileflags(PyObject *mod, PyObject *args) { PyObject *open_filename; const char *filename; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; if (!PyArg_ParseTuple(args, "Oy|i", &open_filename, &filename, &cf_flags)) { return NULL; } FILE *fp = open_file(open_filename, NULL); if (fp == NULL) { return NULL; } int fd = fileno(fp); if (cf_flags) { flags.cf_flags = cf_flags; pflags = &flags; } int res = PyRun_AnyFileFlags(fp, filename, pflags); assert(_Py_IsValidFD(fd)); fclose(fp); assert(!PyErr_Occurred()); return PyLong_FromLong(res); } // Test PyRun_AnyFileEx() static PyObject* run_anyfileex(PyObject *mod, PyObject *args) { PyObject *open_filename; const char *filename; int closeit = 0; if (!PyArg_ParseTuple(args, "Oy|i", &open_filename, &filename, &closeit)) { return NULL; } FILE *fp = open_file(open_filename, &closeit); if (fp == NULL) { return NULL; } int fd = fileno(fp); int res = PyRun_AnyFileEx(fp, filename, closeit); if (close_fd(fp, fd, closeit) < 0) { return NULL; } assert(!PyErr_Occurred()); return PyLong_FromLong(res); } // Test PyRun_AnyFileExFlags() static PyObject* run_anyfileexflags(PyObject *mod, PyObject *args) { PyObject *open_filename; const char *filename; int closeit = 0; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; if (!PyArg_ParseTuple(args, "Oy|ii", &open_filename, &filename, &closeit, &cf_flags)) { return NULL; } FILE *fp = open_file(open_filename, &closeit); if (fp == NULL) { return NULL; } int fd = fileno(fp); if (cf_flags) { flags.cf_flags = cf_flags; pflags = &flags; } int res = PyRun_AnyFileExFlags(fp, filename, closeit, pflags); if (close_fd(fp, fd, closeit) < 0) { return NULL; } assert(!PyErr_Occurred()); return PyLong_FromLong(res); } // Test PyRun_InteractiveOne() static PyObject* run_interactiveone(PyObject *mod, PyObject *args) { PyObject *open_filename; char *filename; if (!PyArg_ParseTuple(args, "Oy", &open_filename, &filename)) { return NULL; } FILE *fp = open_file(open_filename, NULL); if (fp == NULL) { return NULL; } int fd = fileno(fp); int res = PyRun_InteractiveOne(fp, filename); assert(!PyErr_Occurred()); assert(_Py_IsValidFD(fd)); fclose(fp); return PyLong_FromLong(res); } // Test PyRun_InteractiveOneFlags() static PyObject* run_interactiveoneflags(PyObject *mod, PyObject *args) { PyObject *open_filename; char *filename; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; if (!PyArg_ParseTuple(args, "Oy|i", &open_filename, &filename, &cf_flags)) { return NULL; } FILE *fp = open_file(open_filename, NULL); if (fp == NULL) { return NULL; } int fd = fileno(fp); if (cf_flags) { flags.cf_flags = cf_flags; pflags = &flags; } int res = PyRun_InteractiveOneFlags(fp, filename, pflags); assert(!PyErr_Occurred()); assert(_Py_IsValidFD(fd)); fclose(fp); return PyLong_FromLong(res); } // Test PyRun_InteractiveOneObject() static PyObject* run_interactiveoneobject(PyObject *mod, PyObject *args) { PyObject *open_filename; PyObject *filename; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; if (!PyArg_ParseTuple(args, "OO|i", &open_filename, &filename, &cf_flags)) { return NULL; } FILE *fp = open_file(open_filename, NULL); if (fp == NULL) { return NULL; } int fd = fileno(fp); if (cf_flags) { flags.cf_flags = cf_flags; pflags = &flags; } int res = PyRun_InteractiveOneObject(fp, filename, pflags); assert(!PyErr_Occurred()); assert(_Py_IsValidFD(fd)); fclose(fp); return PyLong_FromLong(res); } // Test PyRun_File() static PyObject* run_file(PyObject *mod, PyObject *args) { PyObject *result = NULL; const char *filename = NULL; Py_ssize_t filename_size; int start; PyObject *globals = NULL; PyObject *locals = NULL; if (!PyArg_ParseTuple(args, "z#iO|O", &filename, &filename_size, &start, &globals, &locals)) { return NULL; } NULLABLE(globals); NULLABLE(locals); FILE *fp = fopen(filename, "r"); if (fp == NULL) { PyErr_SetFromErrnoWithFilename(PyExc_OSError, filename); return NULL; } int fd = fileno(fp); result = PyRun_File(fp, filename, start, globals, locals); assert(_Py_IsValidFD(fd)); fclose(fp); return result; } // Test PyRun_FileEx() static PyObject* run_fileex(PyObject *mod, PyObject *args) { const char *filename = NULL; Py_ssize_t filename_size; int start; PyObject *globals = NULL; PyObject *locals = NULL; int closeit = 0; if (!PyArg_ParseTuple(args, "z#iO|Oi", &filename, &filename_size, &start, &globals, &locals, &closeit)) { return NULL; } NULLABLE(globals); NULLABLE(locals); FILE *fp = fopen(filename, "r"); if (fp == NULL) { PyErr_SetFromErrnoWithFilename(PyExc_OSError, filename); return NULL; } int fd = fileno(fp); PyObject *result = PyRun_FileEx(fp, filename, start, globals, locals, closeit); if (close_fd_result(fp, fd, closeit, result) < 0) { return NULL; } return result; } // Test PyRun_FileFlags static PyObject* run_fileflags(PyObject *mod, PyObject *args) { const char *filename = NULL; Py_ssize_t filename_size; int start; PyObject *globals = NULL; PyObject *locals = NULL; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; int cf_feature_version = 0; if (!PyArg_ParseTuple(args, "z#iO|Oii", &filename, &filename_size, &start, &globals, &locals, &cf_flags, &cf_feature_version)) { return NULL; } NULLABLE(globals); NULLABLE(locals); if (cf_flags || cf_feature_version) { flags.cf_flags = cf_flags; flags.cf_feature_version = cf_feature_version; pflags = &flags; } FILE *fp = fopen(filename, "r"); if (fp == NULL) { PyErr_SetFromErrnoWithFilename(PyExc_OSError, filename); return NULL; } int fd = fileno(fp); PyObject *result = PyRun_FileFlags(fp, filename, start, globals, locals, pflags); assert(_Py_IsValidFD(fd)); fclose(fp); return result; } static PyObject* run_fileexflags(PyObject *mod, PyObject *args) { const char *filename = NULL; Py_ssize_t filename_size; int start; PyObject *globals = NULL; PyObject *locals = NULL; int closeit = 0; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; int cf_feature_version = 0; if (!PyArg_ParseTuple(args, "z#iO|Oiii", &filename, &filename_size, &start, &globals, &locals, &closeit, &cf_flags, &cf_feature_version)) { return NULL; } NULLABLE(globals); NULLABLE(locals); if (cf_flags || cf_feature_version) { flags.cf_flags = cf_flags; flags.cf_feature_version = cf_feature_version; pflags = &flags; } FILE *fp = fopen(filename, "r"); if (fp == NULL) { PyErr_SetFromErrnoWithFilename(PyExc_OSError, filename); return NULL; } int fd = fileno(fp); PyObject *result = PyRun_FileExFlags(fp, filename, start, globals, locals, closeit, pflags); if (close_fd_result(fp, fd, closeit, result) < 0) { return NULL; } return result; } static PyObject* run_simplestring(PyObject *mod, PyObject *args) { const char *str; if (!PyArg_ParseTuple(args, "y", &str)) { return NULL; } int res = PyRun_SimpleString(str); assert(!PyErr_Occurred()); return PyLong_FromLong(res); } static PyObject* run_simplestringflags(PyObject *mod, PyObject *args) { const char *str; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; if (!PyArg_ParseTuple(args, "y|i", &str, &flags)) { return NULL; } if (cf_flags) { flags.cf_flags = cf_flags; pflags = &flags; } int res = PyRun_SimpleStringFlags(str, pflags); assert(!PyErr_Occurred()); return PyLong_FromLong(res); } // Test PyRun_InteractiveLoop() static PyObject* run_interactiveloop(PyObject *mod, PyObject *args) { PyObject *open_filename; char *filename; if (!PyArg_ParseTuple(args, "Oy|i", &open_filename, &filename)) { return NULL; } FILE *fp = open_file(open_filename, NULL); if (fp == NULL) { return NULL; } int fd = fileno(fp); int res = PyRun_InteractiveLoop(fp, filename); assert(!PyErr_Occurred()); assert(_Py_IsValidFD(fd)); fclose(fp); return PyLong_FromLong(res); } // Test PyRun_InteractiveLoopFlags() static PyObject* run_interactiveloopflags(PyObject *mod, PyObject *args) { PyObject *open_filename; char *filename; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; if (!PyArg_ParseTuple(args, "Oy|i", &open_filename, &filename, &cf_flags)) { return NULL; } FILE *fp = open_file(open_filename, NULL); if (fp == NULL) { return NULL; } int fd = fileno(fp); if (cf_flags) { flags.cf_flags = cf_flags; pflags = &flags; } int res = PyRun_InteractiveLoopFlags(fp, filename, pflags); assert(!PyErr_Occurred()); assert(_Py_IsValidFD(fd)); fclose(fp); return PyLong_FromLong(res); } // Test Py_CompileStringFlags() static PyObject* run_compilestringflags(PyObject *mod, PyObject *args) { const char *str; const char *filename; int start; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; int cf_feature_version = 0; if (!PyArg_ParseTuple(args, "yyi|ii", &str, &filename, &start, &cf_flags, &cf_feature_version)) { return NULL; } if (cf_flags || cf_feature_version) { flags.cf_flags = cf_flags; flags.cf_feature_version = cf_feature_version; pflags = &flags; } return Py_CompileStringFlags(str, filename, start, pflags); } // Test Py_CompileStringExFlags() static PyObject* run_compilestringexflags(PyObject *mod, PyObject *args) { const char *str; const char *filename; int start; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; int cf_feature_version = 0; int optimize = -1; if (!PyArg_ParseTuple(args, "yyi|iii", &str, &filename, &start, &cf_flags, &cf_feature_version, &optimize)) { return NULL; } if (cf_flags || cf_feature_version) { flags.cf_flags = cf_flags; flags.cf_feature_version = cf_feature_version; pflags = &flags; } return Py_CompileStringExFlags(str, filename, start, pflags, optimize); } // Test Py_CompileStringObject() static PyObject* run_compilestringobject(PyObject *mod, PyObject *args) { const char *str; PyObject *filename; int start; PyCompilerFlags flags = _PyCompilerFlags_INIT; PyCompilerFlags *pflags = NULL; int cf_flags = 0; int cf_feature_version = 0; int optimize = -1; if (!PyArg_ParseTuple(args, "yOi|iii", &str, &filename, &start, &cf_flags, &cf_feature_version, &optimize)) { return NULL; } if (cf_flags || cf_feature_version) { flags.cf_flags = cf_flags; flags.cf_feature_version = cf_feature_version; pflags = &flags; } return Py_CompileStringObject(str, filename, start, pflags, optimize); } static PyMethodDef test_methods[] = { {"run_string", run_string, METH_VARARGS}, {"run_stringflags", run_stringflags, METH_VARARGS}, {"run_simplefile", run_simplefile, METH_VARARGS}, {"run_simplefileex", run_simplefileex, METH_VARARGS}, {"run_simplefileexflags", run_simplefileexflags, METH_VARARGS}, {"run_anyfile", run_anyfile, METH_VARARGS}, {"run_anyfileflags", run_anyfileflags, METH_VARARGS}, {"run_anyfileex", run_anyfileex, METH_VARARGS}, {"run_anyfileexflags", run_anyfileexflags, METH_VARARGS}, {"run_interactiveone", run_interactiveone, METH_VARARGS}, {"run_interactiveoneflags", run_interactiveoneflags, METH_VARARGS}, {"run_interactiveoneobject", run_interactiveoneobject, METH_VARARGS}, {"run_file", run_file, METH_VARARGS}, {"run_fileex", run_fileex, METH_VARARGS}, {"run_fileflags", run_fileflags, METH_VARARGS}, {"run_fileexflags", run_fileexflags, METH_VARARGS}, {"run_simplestring", run_simplestring, METH_VARARGS}, {"run_simplestringflags", run_simplestringflags, METH_VARARGS}, {"run_interactiveloop", run_interactiveloop, METH_VARARGS}, {"run_interactiveloopflags", run_interactiveloopflags, METH_VARARGS}, {"run_compilestringflags", run_compilestringflags, METH_VARARGS}, {"run_compilestringexflags", run_compilestringexflags, METH_VARARGS}, {"run_compilestringobject", run_compilestringobject, METH_VARARGS}, {NULL}, }; int _PyTestCapi_Init_Run(PyObject *mod) { if (PyModule_AddFunctions(mod, test_methods) < 0) { return -1; } if (PyModule_AddIntMacro(mod, PyCF_ONLY_AST) < 0) { return -1; } if (PyModule_AddIntMacro(mod, PyCF_IGNORE_COOKIE) < 0) { return -1; } return 0; }