mirror of
https://github.com/python/cpython
synced 2026-11-06 09:02:40 +03:00
[3.14] gh-152132: Test Py_CompileString() in test_capi.test_run (#153470) (#153473) gh-152132: Test Py_CompileString() in test_capi.test_run (#153470) PyRun functions now raises ValueError if the start argument is invalid. Add Modules/_testlimitedcapi/run.c. (cherry picked from commitd83d26724b) (cherry picked from commit6374772d8c)
823 lines
20 KiB
C
823 lines
20 KiB
C
#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_obj(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;
|
|
}
|