From 9ef330d21c10208ba97defdd98f328c4561576d4 Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Sat, 6 Mar 2021 16:07:47 +0000 Subject: [PATCH 1/3] ffi: move initconfig.rs to cpython/initconfig.rs --- src/ffi/{ => cpython}/initconfig.rs | 5 --- src/ffi/cpython/mod.rs | 9 +++++- src/ffi/cpython/pylifecycle.rs | 48 +++++++++++++++++++++++++++++ src/ffi/mod.rs | 4 --- src/ffi/pylifecycle.rs | 23 -------------- 5 files changed, 56 insertions(+), 33 deletions(-) rename src/ffi/{ => cpython}/initconfig.rs (95%) create mode 100644 src/ffi/cpython/pylifecycle.rs diff --git a/src/ffi/initconfig.rs b/src/ffi/cpython/initconfig.rs similarity index 95% rename from src/ffi/initconfig.rs rename to src/ffi/cpython/initconfig.rs index 5e46898f5b2..202c7d2ffd9 100644 --- a/src/ffi/initconfig.rs +++ b/src/ffi/cpython/initconfig.rs @@ -19,7 +19,6 @@ pub struct PyStatus { pub exitcode: c_int, } -#[cfg_attr(windows, link(name = "pythonXY"))] extern "C" { pub fn PyStatus_Ok() -> PyStatus; pub fn PyStatus_Error(err_msg: *const c_char) -> PyStatus; @@ -39,7 +38,6 @@ pub struct PyWideStringList { pub items: *mut *mut wchar_t, } -#[cfg_attr(windows, link(name = "pythonXY"))] extern "C" { pub fn PyWideStringList_Append(list: *mut PyWideStringList, item: *const wchar_t) -> PyStatus; pub fn PyWideStringList_Insert( @@ -70,7 +68,6 @@ pub struct PyPreConfig { pub allocator: c_int, } -#[cfg_attr(windows, link(name = "pythonXY"))] extern "C" { pub fn PyPreConfig_InitPythonConfig(config: *mut PyPreConfig); pub fn PyPreConfig_InitIsolatedConfig(config: *mut PyPreConfig); @@ -150,7 +147,6 @@ pub struct PyConfig { pub orig_argv: PyWideStringList, } -#[cfg_attr(windows, link(name = "pythonXY"))] extern "C" { pub fn PyConfig_InitPythonConfig(config: *mut PyConfig); pub fn PyConfig_InitIsolatedConfig(config: *mut PyConfig); @@ -186,7 +182,6 @@ extern "C" { /* --- Helper functions --------------------------------------- */ -#[cfg_attr(windows, link(name = "pythonXY"))] extern "C" { pub fn Py_GetArgcArgv(argc: *mut c_int, argv: *mut *mut *mut wchar_t); } diff --git a/src/ffi/cpython/mod.rs b/src/ffi/cpython/mod.rs index 527de948f30..f38c48ac6da 100644 --- a/src/ffi/cpython/mod.rs +++ b/src/ffi/cpython/mod.rs @@ -9,10 +9,13 @@ pub mod dictobject; // skipped fileobject.h pub mod frameobject; // skipped import.h -// skipped initconfig.h +#[cfg(all(Py_3_8, not(PyPy)))] +pub mod initconfig; // skipped interpreteridobject.h pub mod listobject; pub mod object; +#[cfg(all(Py_3_8, not(PyPy)))] +pub mod pylifecycle; pub use self::abstract_::*; #[cfg(not(PyPy))] @@ -22,5 +25,9 @@ pub use self::code::*; #[cfg(not(PyPy))] pub use self::dictobject::*; pub use self::frameobject::*; +#[cfg(all(Py_3_8, not(PyPy)))] +pub use self::initconfig::*; pub use self::listobject::*; pub use self::object::*; +#[cfg(all(Py_3_8, not(PyPy)))] +pub use self::pylifecycle::*; diff --git a/src/ffi/cpython/pylifecycle.rs b/src/ffi/cpython/pylifecycle.rs new file mode 100644 index 00000000000..1e866920150 --- /dev/null +++ b/src/ffi/cpython/pylifecycle.rs @@ -0,0 +1,48 @@ +use crate::ffi::{PyConfig, PyPreConfig, PyStatus, Py_ssize_t}; +use libc::wchar_t; +use std::os::raw::{c_char, c_int}; + +// "private" functions in cpython/pylifecycle.h accepted in PEP 587 +extern "C" { + // skipped _Py_SetStandardStreamEncoding; + pub fn Py_PreInitialize(src_config: *const PyPreConfig) -> PyStatus; + pub fn Py_PreInitializeFromBytesArgs( + src_config: *const PyPreConfig, + argc: Py_ssize_t, + argv: *mut *mut c_char, + ) -> PyStatus; + pub fn Py_PreInitializeFromArgs( + src_config: *const PyPreConfig, + argc: Py_ssize_t, + argv: *mut *mut wchar_t, + ) -> PyStatus; + pub fn _Py_IsCoreInitialized() -> c_int; + + pub fn Py_InitializeFromConfig(config: *const PyConfig) -> PyStatus; + // skipped _Py_InitializeMain + + pub fn Py_RunMain() -> c_int; + + // skipped Py_ExitStatusException + + // skipped _Py_RestoreSignals + + // skipped Py_FdIsInteractive + // skipped _Py_FdIsInteractive + + // skipped _Py_SetProgramFullPath + + // skipped _Py_gitidentifier + // skipped _Py_getversion + + // skipped _Py_IsFinalizing + + // skipped _PyOS_URandom + // skipped _PyOS_URandomNonblock + + // skipped _Py_CoerceLegacyLocale + // skipped _Py_LegacyLocaleDetected + // skipped _Py_SetLocaleFromEnv + + // skipped _Py_NewInterpreter +} diff --git a/src/ffi/mod.rs b/src/ffi/mod.rs index bc739b681db..7bf36fe825b 100644 --- a/src/ffi/mod.rs +++ b/src/ffi/mod.rs @@ -36,8 +36,6 @@ pub use self::funcobject::*; #[cfg(not(Py_LIMITED_API))] pub use self::genobject::*; pub use self::import::*; -#[cfg(all(Py_3_8, not(any(PY_LIMITED_API, PyPy))))] -pub use self::initconfig::*; pub use self::intrcheck::*; pub use self::iterobject::*; pub use self::listobject::*; @@ -164,8 +162,6 @@ mod pyport; // [cfg(not(Py_LIMITED_API))] // mod pytime; contains nothing of interest -#[cfg(all(Py_3_8, not(any(PY_LIMITED_API, PyPy))))] -mod initconfig; mod objimpl; mod pydebug; mod pyhash; diff --git a/src/ffi/pylifecycle.rs b/src/ffi/pylifecycle.rs index 4d76ae93c1a..8cccd211ee3 100644 --- a/src/ffi/pylifecycle.rs +++ b/src/ffi/pylifecycle.rs @@ -1,6 +1,4 @@ use crate::ffi::pystate::PyThreadState; -#[cfg(all(Py_3_8, not(any(PY_LIMITED_API, PyPy))))] -use crate::ffi::{PyConfig, PyPreConfig, PyStatus, Py_ssize_t}; use libc::wchar_t; use std::os::raw::{c_char, c_int}; @@ -53,24 +51,3 @@ extern "C" { pub fn PyOS_getsig(arg1: c_int) -> PyOS_sighandler_t; pub fn PyOS_setsig(arg1: c_int, arg2: PyOS_sighandler_t) -> PyOS_sighandler_t; } - -// "private" functions in cpython/pylifecycle.h accepted in PEP 587 -#[cfg(all(Py_3_8, not(any(PY_LIMITED_API, PyPy))))] -#[cfg_attr(windows, link(name = "pythonXY"))] -extern "C" { - pub fn Py_PreInitialize(src_config: *const PyPreConfig) -> PyStatus; - pub fn Py_PreInitializeFromBytesArgs( - src_config: *const PyPreConfig, - argc: Py_ssize_t, - argv: *mut *mut c_char, - ) -> PyStatus; - pub fn Py_PreInitializeFromArgs( - src_config: *const PyPreConfig, - argc: Py_ssize_t, - argv: *mut *mut wchar_t, - ) -> PyStatus; - - pub fn Py_InitializeFromConfig(config: *const PyConfig) -> PyStatus; - - pub fn Py_RunMain() -> c_int; -} From 7ed53b72fa28e11491cb59a8249833ac0bd7b34a Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Sat, 6 Mar 2021 16:40:39 +0000 Subject: [PATCH 2/3] ffi: update PyConfig for Python 3.10 --- src/ffi/cpython/initconfig.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ffi/cpython/initconfig.rs b/src/ffi/cpython/initconfig.rs index 202c7d2ffd9..ee6fc75b53d 100644 --- a/src/ffi/cpython/initconfig.rs +++ b/src/ffi/cpython/initconfig.rs @@ -99,7 +99,10 @@ pub struct PyConfig { pub filesystem_errors: *mut wchar_t, pub pycache_prefix: *mut wchar_t, pub parse_argv: c_int, + #[cfg(Py_3_10)] + pub orig_argv: PyWideStringList, pub argv: PyWideStringList, + #[cfg(not(Py_3_10))] pub program_name: *mut wchar_t, pub xoptions: PyWideStringList, pub warnoptions: PyWideStringList, @@ -122,9 +125,14 @@ pub struct PyConfig { pub legacy_windows_stdio: c_int, pub check_hash_pycs_mode: *mut wchar_t, + #[cfg(Py_3_10)] + pub program_name: *mut wchar_t, pub pathconfig_warnings: c_int, pub pythonpath_env: *mut wchar_t, pub home: *mut wchar_t, + #[cfg(Py_3_10)] + pub platlibdir: *mut wchar_t, + pub module_search_paths_set: c_int, pub module_search_paths: PyWideStringList, pub executable: *mut wchar_t, @@ -133,7 +141,7 @@ pub struct PyConfig { pub base_prefix: *mut wchar_t, pub exec_prefix: *mut wchar_t, pub base_exec_prefix: *mut wchar_t, - #[cfg(Py_3_9)] + #[cfg(all(Py_3_9, not(Py_3_10)))] pub platlibdir: *mut wchar_t, pub skip_source_first_line: c_int, pub run_command: *mut wchar_t, @@ -143,7 +151,7 @@ pub struct PyConfig { pub _init_main: c_int, #[cfg(Py_3_9)] pub _isolated_interpreter: c_int, - #[cfg(Py_3_9)] + #[cfg(all(Py_3_9, not(Py_3_10)))] pub orig_argv: PyWideStringList, } From 23b5fe9e69237a1768b50355abb12e24f3ab912a Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Sat, 6 Mar 2021 22:45:19 +0000 Subject: [PATCH 3/3] ffi: add _Py_InitializeMain --- CHANGELOG.md | 1 + src/ffi/cpython/pylifecycle.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78cc43a1d31..44d01bb2575 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Add #[pyo3(from_py_with = "...")]` attribute for function arguments and struct fields to override the default from-Python conversion. [#1411](https://github.com/PyO3/pyo3/pull/1411) - Add FFI definition `PyCFunction_CheckExact` for Python 3.9 and later. [#1425](https://github.com/PyO3/pyo3/pull/1425) - Add FFI definition `Py_IS_TYPE`. [#1429](https://github.com/PyO3/pyo3/pull/1429) +- Add FFI definition `_Py_InitializeMain`. [#1473](https://github.com/PyO3/pyo3/pull/1473) ### Changed - Change `PyTimeAcces::get_fold()` to return a `bool` instead of a `u8`. [#1397](https://github.com/PyO3/pyo3/pull/1397) diff --git a/src/ffi/cpython/pylifecycle.rs b/src/ffi/cpython/pylifecycle.rs index 1e866920150..b05cbe8cd98 100644 --- a/src/ffi/cpython/pylifecycle.rs +++ b/src/ffi/cpython/pylifecycle.rs @@ -19,7 +19,7 @@ extern "C" { pub fn _Py_IsCoreInitialized() -> c_int; pub fn Py_InitializeFromConfig(config: *const PyConfig) -> PyStatus; - // skipped _Py_InitializeMain + pub fn _Py_InitializeMain() -> PyStatus; pub fn Py_RunMain() -> c_int;