__all__.append('_exit')
except ImportError:
pass
+ try:
+ from posix import _clearenv
+ __all__.append('_clearenv')
+ except ImportError:
+ pass
import posixpath as path
try:
new.update(self)
return new
+ if _exists("_clearenv"):
+ def clear(self):
+ _clearenv()
+ self._data.clear()
+
+
def _create_environ_mapping():
if name == 'nt':
# Where Env Var Names Must Be UPPERCASE
self.assertNotIn(b'test_env', os.environb)
self.assertNotIn('test_env', os.environ)
+ def test_clearenv(self):
+ os.environ['REMOVEME'] = '1'
+ os.environ.clear()
+ self.assertEqual(os.environ, {})
+
+ self.assertRaises(TypeError, os.environ.clear, None)
+
+
class WalkTests(unittest.TestCase):
"""Tests for os.walk()."""
is_fwalk = False
--- /dev/null
+Optimize :data:`os.environ.clear() <os.environ>` by calling
+:manpage:`clearenv(3)` when this function is available.
+Patch by Victor Stinner.
#endif /* !defined(MS_WINDOWS) */
+#if defined(HAVE_CLEARENV)
+
+PyDoc_STRVAR(os__clearenv__doc__,
+"_clearenv($module, /)\n"
+"--\n"
+"\n");
+
+#define OS__CLEARENV_METHODDEF \
+ {"_clearenv", (PyCFunction)os__clearenv, METH_NOARGS, os__clearenv__doc__},
+
+static PyObject *
+os__clearenv_impl(PyObject *module);
+
+static PyObject *
+os__clearenv(PyObject *module, PyObject *Py_UNUSED(ignored))
+{
+ return os__clearenv_impl(module);
+}
+
+#endif /* defined(HAVE_CLEARENV) */
+
PyDoc_STRVAR(os_strerror__doc__,
"strerror($module, code, /)\n"
"--\n"
#define OS_UNSETENV_METHODDEF
#endif /* !defined(OS_UNSETENV_METHODDEF) */
+#ifndef OS__CLEARENV_METHODDEF
+ #define OS__CLEARENV_METHODDEF
+#endif /* !defined(OS__CLEARENV_METHODDEF) */
+
#ifndef OS_WCOREDUMP_METHODDEF
#define OS_WCOREDUMP_METHODDEF
#endif /* !defined(OS_WCOREDUMP_METHODDEF) */
#ifndef OS__EMSCRIPTEN_LOG_METHODDEF
#define OS__EMSCRIPTEN_LOG_METHODDEF
#endif /* !defined(OS__EMSCRIPTEN_LOG_METHODDEF) */
-/*[clinic end generated code: output=47ace1528820858b input=a9049054013a1b77]*/
+/*[clinic end generated code: output=67f0df7cd5a7de20 input=a9049054013a1b77]*/
#endif /* !MS_WINDOWS */
+#ifdef HAVE_CLEARENV
+/*[clinic input]
+os._clearenv
+[clinic start generated code]*/
+
+static PyObject *
+os__clearenv_impl(PyObject *module)
+/*[clinic end generated code: output=2d6705d62c014b51 input=47d2fa7f323c43ca]*/
+{
+ errno = 0;
+ int err = clearenv();
+ if (err) {
+ return posix_error();
+ }
+ Py_RETURN_NONE;
+}
+#endif
+
+
/*[clinic input]
os.strerror
OS_POSIX_FADVISE_METHODDEF
OS_PUTENV_METHODDEF
OS_UNSETENV_METHODDEF
+ OS__CLEARENV_METHODDEF
OS_STRERROR_METHODDEF
OS_FCHDIR_METHODDEF
OS_FSYNC_METHODDEF
then :
printf "%s\n" "#define HAVE_CHOWN 1" >>confdefs.h
+fi
+ac_fn_c_check_func "$LINENO" "clearenv" "ac_cv_func_clearenv"
+if test "x$ac_cv_func_clearenv" = xyes
+then :
+ printf "%s\n" "#define HAVE_CLEARENV 1" >>confdefs.h
+
fi
ac_fn_c_check_func "$LINENO" "clock" "ac_cv_func_clock"
if test "x$ac_cv_func_clock" = xyes
# checks for library functions
AC_CHECK_FUNCS([ \
- accept4 alarm bind_textdomain_codeset chmod chown clock closefrom close_range confstr \
+ accept4 alarm bind_textdomain_codeset chmod chown clearenv \
+ clock closefrom close_range confstr \
copy_file_range ctermid dladdr dup dup3 execv explicit_bzero explicit_memset \
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
# Determine JIT stencils header files based on target platform
JIT_STENCILS_H=""
-AS_VAR_IF([enable_experimental_jit], [no],
+AS_VAR_IF([enable_experimental_jit], [no],
[],
[case "$host" in
aarch64-apple-darwin*)
/* Define if you have the 'chroot' function. */
#undef HAVE_CHROOT
+/* Define to 1 if you have the 'clearenv' function. */
+#undef HAVE_CLEARENV
+
/* Define to 1 if you have the 'clock' function. */
#undef HAVE_CLOCK