Skip to content

bpo-36763: Add _PyInitError functions #13395

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 17, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 7 additions & 30 deletions Include/cpython/coreconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,34 +18,13 @@ typedef struct {
int exitcode;
} _PyInitError;

/* Almost all errors causing Python initialization to fail */
#ifdef _MSC_VER
/* Visual Studio 2015 doesn't implement C99 __func__ in C */
# define _Py_INIT_GET_FUNC() __FUNCTION__
#else
# define _Py_INIT_GET_FUNC() __func__
#endif

#define _Py_INIT_OK() \
(_PyInitError){._type = _Py_INIT_ERR_TYPE_OK,}
/* other fields are set to 0 */
#define _Py_INIT_ERR(ERR_MSG) \
(_PyInitError){ \
._type = _Py_INIT_ERR_TYPE_ERROR, \
._func = _Py_INIT_GET_FUNC(), \
.err_msg = (ERR_MSG)}
/* other fields are set to 0 */
#define _Py_INIT_NO_MEMORY() _Py_INIT_ERR("memory allocation failed")
#define _Py_INIT_EXIT(EXITCODE) \
(_PyInitError){ \
._type = _Py_INIT_ERR_TYPE_EXIT, \
.exitcode = (EXITCODE)}
#define _Py_INIT_IS_ERROR(err) \
(err._type == _Py_INIT_ERR_TYPE_ERROR)
#define _Py_INIT_IS_EXIT(err) \
(err._type == _Py_INIT_ERR_TYPE_EXIT)
#define _Py_INIT_FAILED(err) \
(err._type != _Py_INIT_ERR_TYPE_OK)
PyAPI_FUNC(_PyInitError) _PyInitError_Ok(void);
PyAPI_FUNC(_PyInitError) _PyInitError_Error(const char *err_msg);
PyAPI_FUNC(_PyInitError) _PyInitError_NoMemory(void);
PyAPI_FUNC(_PyInitError) _PyInitError_Exit(int exitcode);
PyAPI_FUNC(int) _PyInitError_IsError(_PyInitError err);
PyAPI_FUNC(int) _PyInitError_IsExit(_PyInitError err);
PyAPI_FUNC(int) _PyInitError_Failed(_PyInitError err);

/* --- _PyWstrList ------------------------------------------------ */

Expand All @@ -56,8 +35,6 @@ typedef struct {
wchar_t **items;
} _PyWstrList;

#define _PyWstrList_INIT (_PyWstrList){.length = 0, .items = NULL}


/* --- _PyPreConfig ----------------------------------------------- */

Expand Down
32 changes: 32 additions & 0 deletions Include/internal/pycore_coreconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,41 @@ extern "C" {

#include "pycore_pystate.h" /* _PyRuntimeState */

/* --- _PyInitError ----------------------------------------------- */

/* Almost all errors causing Python initialization to fail */
#ifdef _MSC_VER
/* Visual Studio 2015 doesn't implement C99 __func__ in C */
# define _Py_INIT_GET_FUNC() __FUNCTION__
#else
# define _Py_INIT_GET_FUNC() __func__
#endif

#define _Py_INIT_OK() \
(_PyInitError){._type = _Py_INIT_ERR_TYPE_OK,}
/* other fields are set to 0 */
#define _Py_INIT_ERR(ERR_MSG) \
(_PyInitError){ \
._type = _Py_INIT_ERR_TYPE_ERROR, \
._func = _Py_INIT_GET_FUNC(), \
.err_msg = (ERR_MSG)}
/* other fields are set to 0 */
#define _Py_INIT_NO_MEMORY() _Py_INIT_ERR("memory allocation failed")
#define _Py_INIT_EXIT(EXITCODE) \
(_PyInitError){ \
._type = _Py_INIT_ERR_TYPE_EXIT, \
.exitcode = (EXITCODE)}
#define _Py_INIT_IS_ERROR(err) \
(err._type == _Py_INIT_ERR_TYPE_ERROR)
#define _Py_INIT_IS_EXIT(err) \
(err._type == _Py_INIT_ERR_TYPE_EXIT)
#define _Py_INIT_FAILED(err) \
(err._type != _Py_INIT_ERR_TYPE_OK)

/* --- _PyWstrList ------------------------------------------------ */

#define _PyWstrList_INIT (_PyWstrList){.length = 0, .items = NULL}

#ifndef NDEBUG
PyAPI_FUNC(int) _PyWstrList_CheckConsistency(const _PyWstrList *list);
#endif
Expand Down
1 change: 1 addition & 0 deletions Modules/faulthandler.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "Python.h"
#include "pycore_coreconfig.h"
#include "pythread.h"
#include <signal.h>
#include <object.h>
Expand Down
1 change: 1 addition & 0 deletions Modules/getpath.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* Return the initial module search path. */

#include "Python.h"
#include "pycore_coreconfig.h"
#include "osdefs.h"
#include "pycore_fileutils.h"
#include "pycore_pathconfig.h"
Expand Down
1 change: 1 addition & 0 deletions Objects/exceptions.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include "pycore_coreconfig.h"
#include "pycore_object.h"
#include "pycore_pymem.h"
#include "pycore_pystate.h"
Expand Down
1 change: 1 addition & 0 deletions Objects/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/* Generic object operations; and implementation of None */

#include "Python.h"
#include "pycore_coreconfig.h"
#include "pycore_object.h"
#include "pycore_pystate.h"
#include "pycore_context.h"
Expand Down
1 change: 1 addition & 0 deletions PC/getpathp.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@


#include "Python.h"
#include "pycore_coreconfig.h"
#include "pycore_pystate.h"
#include "osdefs.h"
#include <wchar.h>
Expand Down
2 changes: 1 addition & 1 deletion Programs/_freeze_importlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ main(int argc, char *argv[])
_PyInitError err = _Py_InitializeFromConfig(&config);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
memory: program_name is a constant string. */
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand Down
52 changes: 26 additions & 26 deletions Programs/_testembed.c
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ static int test_init_from_config(void)
preconfig.utf8_mode = 1;

err = _Py_PreInitialize(&preconfig);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand Down Expand Up @@ -512,7 +512,7 @@ static int test_init_from_config(void)
config.pathconfig_warnings = 0;

err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Expand Down Expand Up @@ -543,7 +543,7 @@ static int test_init_parse_argv(int parse_argv)
config.parse_argv = parse_argv;

err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Expand Down Expand Up @@ -653,7 +653,7 @@ static int init_isolated_flag(void)

test_init_env_dev_mode_putenvs();
err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Expand All @@ -672,7 +672,7 @@ static int test_preinit_isolated1(void)
preconfig.isolated = 1;

err = _Py_PreInitialize(&preconfig);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand All @@ -682,7 +682,7 @@ static int test_preinit_isolated1(void)

test_init_env_dev_mode_putenvs();
err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Expand All @@ -701,7 +701,7 @@ static int test_preinit_isolated2(void)
preconfig.isolated = 0;

err = _Py_PreInitialize(&preconfig);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand All @@ -717,7 +717,7 @@ static int test_preinit_isolated2(void)

test_init_env_dev_mode_putenvs();
err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Expand All @@ -734,7 +734,7 @@ static int init_isolated_config(void)
_PyPreConfig_InitIsolatedConfig(&preconfig);

err = _Py_PreInitialize(&preconfig);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand All @@ -744,13 +744,13 @@ static int init_isolated_config(void)

_PyCoreConfig config;
err = _PyCoreConfig_InitIsolatedConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
config.program_name = L"./_testembed";

err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Expand All @@ -767,19 +767,19 @@ static int init_python_config(void)
_PyPreConfig_InitPythonConfig(&preconfig);

err = _Py_PreInitialize(&preconfig);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

_PyCoreConfig config;
err = _PyCoreConfig_InitPythonConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
config.program_name = L"./_testembed";

err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Expand All @@ -798,14 +798,14 @@ static int init_dont_configure_locale(void)
preconfig.coerce_c_locale_warn = 1;

err = _Py_PreInitialize(&preconfig);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

_PyCoreConfig config = _PyCoreConfig_INIT;
config.program_name = L"./_testembed";
err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand All @@ -824,7 +824,7 @@ static int init_dev_mode(void)
config.dev_mode = 1;
config.program_name = L"./_testembed";
_PyInitError err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Expand All @@ -840,30 +840,30 @@ static int test_init_read_set(void)
_PyCoreConfig_Init(&config);

err = _PyCoreConfig_DecodeLocale(&config.program_name, "./init_read_set");
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
goto fail;
}

err = _PyCoreConfig_Read(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
goto fail;
}

if (_PyWstrList_Append(&config.module_search_paths,
L"init_read_set_path") < 0) {
err = _Py_INIT_NO_MEMORY();
err = _PyInitError_NoMemory();
goto fail;
}

/* override executable computed by _PyCoreConfig_Read() */
err = _PyCoreConfig_SetString(&config.executable, L"my_executable");
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
goto fail;
}

err = _Py_InitializeFromConfig(&config);
_PyCoreConfig_Clear(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
goto fail;
}
dump_config();
Expand Down Expand Up @@ -898,7 +898,7 @@ static int test_init_run_main(void)
configure_init_main(&config);

_PyInitError err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand All @@ -914,7 +914,7 @@ static int test_init_main(void)
config._init_main = 0;

_PyInitError err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand All @@ -928,7 +928,7 @@ static int test_init_main(void)
}

err = _Py_InitializeMain();
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand All @@ -951,7 +951,7 @@ static int test_run_main(void)
config.program_name = L"./python3";

_PyInitError err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) {
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

Expand Down
1 change: 1 addition & 0 deletions Python/bootstrap_hash.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "Python.h"
#include "pycore_coreconfig.h"
#ifdef MS_WINDOWS
# include <windows.h>
/* All sample MSDN wincrypt programs include the header below. It is at least
Expand Down
28 changes: 28 additions & 0 deletions Python/coreconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,34 @@ _Py_GetGlobalVariablesAsDict(void)
}


/* --- _PyInitError ----------------------------------------------- */

_PyInitError _PyInitError_Ok(void)
{ return _Py_INIT_OK(); }

_PyInitError _PyInitError_Error(const char *err_msg)
{
return (_PyInitError){._type = _Py_INIT_ERR_TYPE_ERROR,
.err_msg = err_msg};
}

_PyInitError _PyInitError_NoMemory(void)
{ return _PyInitError_Error("memory allocation failed"); }

_PyInitError _PyInitError_Exit(int exitcode)
{ return _Py_INIT_EXIT(exitcode); }


int _PyInitError_IsError(_PyInitError err)
{ return _Py_INIT_IS_ERROR(err); }

int _PyInitError_IsExit(_PyInitError err)
{ return _Py_INIT_IS_EXIT(err); }

int _PyInitError_Failed(_PyInitError err)
{ return _Py_INIT_FAILED(err); }


/* --- _PyWstrList ------------------------------------------------ */

#ifndef NDEBUG
Expand Down
Loading