mirror of
https://github.com/python/cpython
synced 2026-11-06 09:02:40 +03:00
gh-152132: Fix Py_RunMain() to return an exit code (#153446)
* Fix Py_RunMain() to return an exit code, rather than calling
Py_Exit(), when running a script, a command, or the REPL.
* _PyRun_SimpleFile() now logs errors to stderr, for example if setting
__main__.__file__ fails.
* Add tests on Py_RunMain() exitcode.
* Rename functions:
* _PyRun_SimpleStringFlagsWithName() => _PyRun_SimpleString()
* _PyRun_SimpleFileObject() => _PyRun_SimpleFile()
* _PyRun_AnyFileObject() => _PyRun_AnyFile()
* _PyRun_InteractiveLoopObject() => _PyRun_InteractiveLoop()
* Change _PyRun_SimpleString(), _PyRun_SimpleFile(), _PyRun_AnyFile() and
_PyRun_InteractiveLoop() return type to PyObject*.
* pymain_repl() now displays the error if PySys_Audit() or
import _pyrepl failed.
* PyRun_SimpleFileExFlags() and PyRun_AnyFileExFlags() now log
PyUnicode_DecodeFSDefault() error. So these functions can no longer
return -1 with an exception set.
(cherry picked from commit fac72f1ee9)
69 lines
1.7 KiB
C
69 lines
1.7 KiB
C
#ifndef Py_INTERNAL_PYTHONRUN_H
|
|
#define Py_INTERNAL_PYTHONRUN_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
#endif
|
|
|
|
extern PyObject* _PyRun_SimpleFile(
|
|
FILE *fp,
|
|
PyObject *filename,
|
|
int closeit,
|
|
PyCompilerFlags *flags);
|
|
|
|
extern PyObject* _PyRun_AnyFile(
|
|
FILE *fp,
|
|
PyObject *filename,
|
|
int closeit,
|
|
PyCompilerFlags *flags);
|
|
|
|
extern int _PyObject_SupportedAsScript(PyObject *);
|
|
extern const char* _Py_SourceAsString(
|
|
PyObject *cmd,
|
|
const char *funcname,
|
|
const char *what,
|
|
PyCompilerFlags *cf,
|
|
PyObject **cmd_copy);
|
|
|
|
// Export for special main.c string compiling with source tracebacks
|
|
extern PyObject* _PyRun_SimpleString(
|
|
const char *command,
|
|
PyObject* name,
|
|
PyCompilerFlags *flags);
|
|
|
|
|
|
/* Stack size, in "pointers". This must be large enough, so
|
|
* no two calls to check recursion depth are more than this far
|
|
* apart. In practice, that means it must be larger than the C
|
|
* stack consumption of PyEval_EvalDefault */
|
|
#if (defined(Py_DEBUG) \
|
|
|| defined(_Py_ADDRESS_SANITIZER) \
|
|
|| defined(_Py_THREAD_SANITIZER))
|
|
# define _PyOS_LOG2_STACK_MARGIN 12
|
|
#else
|
|
# define _PyOS_LOG2_STACK_MARGIN 11
|
|
#endif
|
|
#define _PyOS_STACK_MARGIN (1 << _PyOS_LOG2_STACK_MARGIN)
|
|
#define _PyOS_STACK_MARGIN_BYTES (_PyOS_STACK_MARGIN * sizeof(void *))
|
|
|
|
#if SIZEOF_VOID_P == 8
|
|
# define _PyOS_STACK_MARGIN_SHIFT (_PyOS_LOG2_STACK_MARGIN + 3)
|
|
#else
|
|
# define _PyOS_STACK_MARGIN_SHIFT (_PyOS_LOG2_STACK_MARGIN + 2)
|
|
#endif
|
|
|
|
#ifdef _Py_THREAD_SANITIZER
|
|
# define _PyOS_MIN_STACK_SIZE (_PyOS_STACK_MARGIN_BYTES * 6)
|
|
#else
|
|
# define _PyOS_MIN_STACK_SIZE (_PyOS_STACK_MARGIN_BYTES * 3)
|
|
#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif // !Py_INTERNAL_PYTHONRUN_H
|
|
|