@@ -64,6 +64,10 @@ extern const char *PyWin_DLLVersionString;
6464# include <emscripten.h>
6565#endif
6666
67+ #ifdef __wasi__
68+ # include <wasi/version.h>
69+ #endif
70+
6771#ifdef HAVE_FCNTL_H
6872# include <fcntl.h>
6973#endif
@@ -3837,6 +3841,49 @@ make_abi_info(void)
38373841}
38383842
38393843
3844+ #ifdef __wasi__
3845+
3846+ static PyObject *
3847+ make_wasi_info (void )
3848+ {
3849+ #if defined(__wasip1__ )
3850+ const char * wasi_version = "p1" ;
3851+ #elif defined(__wasip2__ )
3852+ const char * wasi_version = "p2" ;
3853+ #elif defined(__wasip3__ )
3854+ const char * wasi_version = "p3" ;
3855+ #else
3856+ # error "Unknown WASI target version"
3857+ #endif
3858+
3859+ // The SDK version is only defined for SDK builds of wasi-libc.
3860+ #ifdef __wasi_sdk_version__
3861+ const char * wasi_sdk_version = __wasi_sdk_version__ ;
3862+ #else
3863+ # error "Unknown WASI SDK version"
3864+ #endif
3865+
3866+ #ifdef __wasi_cooperative_threads__
3867+ PyObject * cooperative_threads = Py_True ;
3868+ #else
3869+ PyObject * cooperative_threads = Py_False ;
3870+ #endif
3871+
3872+ PyObject * wasi_info = Py_BuildValue (
3873+ "{s:s,s:s,s:O}" ,
3874+ "wasi_version" , wasi_version ,
3875+ "wasi_sdk_version" , wasi_sdk_version ,
3876+ "cooperative_threads" , cooperative_threads );
3877+ if (wasi_info == NULL ) {
3878+ return NULL ;
3879+ }
3880+ PyObject * ns = _PyNamespace_New (wasi_info );
3881+ Py_DECREF (wasi_info );
3882+ return ns ;
3883+ }
3884+
3885+ #endif // __wasi__
3886+
38403887#ifdef __EMSCRIPTEN__
38413888
38423889PyDoc_STRVAR (emscripten_info__doc__ ,
@@ -4084,6 +4131,10 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
40844131
40854132 SET_SYS ("abi_info" , make_abi_info ());
40864133
4134+ #ifdef __wasi__
4135+ SET_SYS ("_wasi_info" , make_wasi_info ());
4136+ #endif
4137+
40874138 /* initialize asyncgen_hooks */
40884139 if (_PyStructSequence_InitBuiltin (interp , & AsyncGenHooksType ,
40894140 & asyncgen_hooks_desc ) < 0 )
0 commit comments