]> granicus.if.org Git - python/commitdiff
bpo-36142: Add preconfig.c (GH-12128)
authorVictor Stinner <vstinner@redhat.com>
Fri, 1 Mar 2019 16:52:56 +0000 (17:52 +0100)
committerGitHub <noreply@github.com>
Fri, 1 Mar 2019 16:52:56 +0000 (17:52 +0100)
* Add _PyArgv_Decode() function
* Move _Py_ClearFileSystemEncoding() and _Py_SetFileSystemEncoding()
  to preconfig.c.

Include/cpython/coreconfig.h
Include/internal/pycore_coreconfig.h
Include/internal/pycore_fileutils.h
Makefile.pre.in
PCbuild/pythoncore.vcxproj
PCbuild/pythoncore.vcxproj.filters
Python/coreconfig.c
Python/preconfig.c [new file with mode: 0644]

index 8109d4abc508da965d4ccb5da7959f7a57deca76..e3ebf7365b9416f1a3a6dbc06755592b2aa1e189 100644 (file)
@@ -5,7 +5,7 @@
 extern "C" {
 #endif
 
-/* _PyArgv */
+/* --- _PyArgv ---------------------------------------------------- */
 
 typedef struct {
     int argc;
@@ -15,7 +15,7 @@ typedef struct {
 } _PyArgv;
 
 
-/* _PyInitError */
+/* --- _PyInitError ----------------------------------------------- */
 
 typedef struct {
     const char *prefix;
@@ -46,7 +46,7 @@ typedef struct {
 #define _Py_INIT_FAILED(err) \
     (err.msg != NULL || err.exitcode != -1)
 
-/* _PyCoreConfig */
+/* --- _PyCoreConfig ---------------------------------------------- */
 
 typedef struct {
     /* Install signal handlers? Yes by default. */
@@ -364,7 +364,8 @@ typedef struct {
 /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */
 
 
-/* Functions used for testing */
+/* --- Function used for testing ---------------------------------- */
+
 PyAPI_FUNC(PyObject *) _Py_GetGlobalVariablesAsDict(void);
 PyAPI_FUNC(PyObject *) _PyCoreConfig_AsDict(const _PyCoreConfig *config);
 
index ebb0a9e9f1f7980165ee20c97081e13be4f591a9..9f3a4c72b16d1b0c2ec954e689d56c056adda2f3 100644 (file)
@@ -8,7 +8,7 @@ extern "C" {
 #  error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN defined"
 #endif
 
-/* _Py_wstrlist */
+/* --- _Py_wstrlist ----------------------------------------------- */
 
 PyAPI_FUNC(void) _Py_wstrlist_clear(
     int len,
@@ -24,12 +24,17 @@ PyAPI_FUNC(PyObject*) _Py_wstrlist_as_pylist(
     int len,
     wchar_t **list);
 
-/* Py_GetArgcArgv() helpers */
+/* --- _PyArgv ---------------------------------------------------- */
+
+PyAPI_FUNC(_PyInitError) _PyArgv_Decode(const _PyArgv *args,
+    wchar_t*** argv_p);
+
+/* --- Py_GetArgcArgv() helpers ----------------------------------- */
 
 PyAPI_FUNC(void) _Py_ClearArgcArgv(void);
 PyAPI_FUNC(int) _Py_SetArgcArgv(int argc, wchar_t * const *argv);
 
-/* _PyCoreConfig */
+/* --- _PyCoreConfig ---------------------------------------------- */
 
 PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config);
 PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *);
index 25006653a5896035f406b1cfba704404f7b81a8b..23ae2013c0eeb50dfca97aadec9b50c329910701 100644 (file)
@@ -10,6 +10,8 @@ extern "C" {
 
 #include <locale.h>   /* struct lconv */
 
+PyAPI_DATA(int) _Py_HasFileSystemDefaultEncodeErrors;
+
 PyAPI_FUNC(int) _Py_DecodeUTF8Ex(
     const char *arg,
     Py_ssize_t arglen,
index 9c2d3d66a05e77efccb904d2b8ff33e1ec9b34d8..5ae69480bf16a460a79c21f81fd75d080c72be41 100644 (file)
@@ -357,6 +357,7 @@ PYTHON_OBJS=        \
                Python/mystrtoul.o \
                Python/pathconfig.o \
                Python/peephole.o \
+               Python/preconfig.o \
                Python/pyarena.o \
                Python/pyctype.o \
                Python/pyfpe.o \
index 1ec5f75808f356fc876945dd4ba0568d361349c1..992c84f8cc81eed06e36444fd609209ce1c251a0 100644 (file)
     <ClCompile Include="..\Python\mystrtoul.c" />
     <ClCompile Include="..\Python\pathconfig.c" />
     <ClCompile Include="..\Python\peephole.c" />
+    <ClCompile Include="..\Python\preconfig.c" />
     <ClCompile Include="..\Python\pyarena.c" />
     <ClCompile Include="..\Python\pyctype.c" />
     <ClCompile Include="..\Python\pyfpe.c" />
index 5053dcf1e8d917d4851b581470e114acf6ce179a..293bded66c3165c9b45b3df48495597494dd81a5 100644 (file)
     <ClCompile Include="..\Python\peephole.c">
       <Filter>Python</Filter>
     </ClCompile>
+    <ClCompile Include="..\Python\preconfig.c">
+      <Filter>Python</Filter>
+    </ClCompile>
     <ClCompile Include="..\Python\pyarena.c">
       <Filter>Python</Filter>
     </ClCompile>
index 47dbe66d3ebac66e5a88a17d0be1bd1a3cbeb941..e1bf8b523ccf8b1eb313c5aa84af654273f33a0d 100644 (file)
@@ -136,13 +136,6 @@ int Py_LegacyWindowsFSEncodingFlag = 0; /* Uses mbcs instead of utf-8 */
 int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */
 #endif
 
-/* The filesystem encoding is chosen by config_init_fs_encoding(),
-   see also initfsencoding(). */
-const char *Py_FileSystemDefaultEncoding = NULL;
-int Py_HasFileSystemDefaultEncoding = 0;
-const char *Py_FileSystemDefaultEncodeErrors = NULL;
-static int _Py_HasFileSystemDefaultEncodeErrors = 0;
-
 
 PyObject *
 _Py_GetGlobalVariablesAsDict(void)
@@ -296,49 +289,6 @@ _Py_wstrlist_as_pylist(int len, wchar_t **list)
 }
 
 
-void
-_Py_ClearFileSystemEncoding(void)
-{
-    if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
-        PyMem_RawFree((char*)Py_FileSystemDefaultEncoding);
-        Py_FileSystemDefaultEncoding = NULL;
-    }
-    if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) {
-        PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors);
-        Py_FileSystemDefaultEncodeErrors = NULL;
-    }
-}
-
-
-/* --- File system encoding/errors -------------------------------- */
-
-/* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors
-   global configuration variables. */
-int
-_Py_SetFileSystemEncoding(const char *encoding, const char *errors)
-{
-    char *encoding2 = _PyMem_RawStrdup(encoding);
-    if (encoding2 == NULL) {
-        return -1;
-    }
-
-    char *errors2 = _PyMem_RawStrdup(errors);
-    if (errors2 == NULL) {
-        PyMem_RawFree(encoding2);
-        return -1;
-    }
-
-    _Py_ClearFileSystemEncoding();
-
-    Py_FileSystemDefaultEncoding = encoding2;
-    Py_HasFileSystemDefaultEncoding = 0;
-
-    Py_FileSystemDefaultEncodeErrors = errors2;
-    _Py_HasFileSystemDefaultEncodeErrors = 0;
-    return 0;
-}
-
-
 /* --- Py_SetStandardStreamEncoding() ----------------------------- */
 
 /* Helper to allow an embedding application to override the normal
@@ -1849,6 +1799,7 @@ fail:
 
 typedef struct {
     const _PyArgv *args;
+    int argc;
     wchar_t **argv;
     int nwarnoption;             /* Number of -W command line options */
     wchar_t **warnoptions;       /* Command line -W options */
@@ -1881,35 +1832,7 @@ static _PyInitError
 cmdline_decode_argv(_PyCmdline *cmdline)
 {
     assert(cmdline->argv == NULL);
-
-    const _PyArgv *args = cmdline->args;
-
-    if (args->use_bytes_argv) {
-        /* +1 for a the NULL terminator */
-        size_t size = sizeof(wchar_t*) * (args->argc + 1);
-        wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size);
-        if (argv == NULL) {
-            return _Py_INIT_NO_MEMORY();
-        }
-
-        for (int i = 0; i < args->argc; i++) {
-            size_t len;
-            wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len);
-            if (arg == NULL) {
-                _Py_wstrlist_clear(i, argv);
-                return DECODE_LOCALE_ERR("command line arguments",
-                                         (Py_ssize_t)len);
-            }
-            argv[i] = arg;
-        }
-        argv[args->argc] = NULL;
-
-        cmdline->argv = argv;
-    }
-    else {
-        cmdline->argv = args->wchar_argv;
-    }
-    return _Py_INIT_OK();
+    return _PyArgv_Decode(cmdline->args, &cmdline->argv);
 }
 
 
@@ -2377,7 +2300,7 @@ config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args)
     memset(&cmdline, 0, sizeof(cmdline));
     cmdline.args = args;
 
-    err = cmdline_decode_argv(&cmdline);
+    err = _PyArgv_Decode(cmdline.args, &cmdline.argv);
     if (_Py_INIT_FAILED(err)) {
         goto done;
     }
diff --git a/Python/preconfig.c b/Python/preconfig.c
new file mode 100644 (file)
index 0000000..8102924
--- /dev/null
@@ -0,0 +1,92 @@
+#include "Python.h"
+#include "pycore_coreconfig.h"
+
+
+#define DECODE_LOCALE_ERR(NAME, LEN) \
+    (((LEN) == -2) \
+     ? _Py_INIT_USER_ERR("cannot decode " NAME) \
+     : _Py_INIT_NO_MEMORY())
+
+
+/* --- File system encoding/errors -------------------------------- */
+
+/* The filesystem encoding is chosen by config_init_fs_encoding(),
+   see also initfsencoding(). */
+const char *Py_FileSystemDefaultEncoding = NULL;
+int Py_HasFileSystemDefaultEncoding = 0;
+const char *Py_FileSystemDefaultEncodeErrors = NULL;
+int _Py_HasFileSystemDefaultEncodeErrors = 0;
+
+void
+_Py_ClearFileSystemEncoding(void)
+{
+    if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
+        PyMem_RawFree((char*)Py_FileSystemDefaultEncoding);
+        Py_FileSystemDefaultEncoding = NULL;
+    }
+    if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) {
+        PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors);
+        Py_FileSystemDefaultEncodeErrors = NULL;
+    }
+}
+
+
+/* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors
+   global configuration variables. */
+int
+_Py_SetFileSystemEncoding(const char *encoding, const char *errors)
+{
+    char *encoding2 = _PyMem_RawStrdup(encoding);
+    if (encoding2 == NULL) {
+        return -1;
+    }
+
+    char *errors2 = _PyMem_RawStrdup(errors);
+    if (errors2 == NULL) {
+        PyMem_RawFree(encoding2);
+        return -1;
+    }
+
+    _Py_ClearFileSystemEncoding();
+
+    Py_FileSystemDefaultEncoding = encoding2;
+    Py_HasFileSystemDefaultEncoding = 0;
+
+    Py_FileSystemDefaultEncodeErrors = errors2;
+    _Py_HasFileSystemDefaultEncodeErrors = 0;
+    return 0;
+}
+
+
+/* --- _PyArgv ---------------------------------------------------- */
+
+_PyInitError
+_PyArgv_Decode(const _PyArgv *args, wchar_t*** argv_p)
+{
+    wchar_t** argv;
+    if (args->use_bytes_argv) {
+        /* +1 for a the NULL terminator */
+        size_t size = sizeof(wchar_t*) * (args->argc + 1);
+        argv = (wchar_t **)PyMem_RawMalloc(size);
+        if (argv == NULL) {
+            return _Py_INIT_NO_MEMORY();
+        }
+
+        for (int i = 0; i < args->argc; i++) {
+            size_t len;
+            wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len);
+            if (arg == NULL) {
+                _Py_wstrlist_clear(i, argv);
+                return DECODE_LOCALE_ERR("command line arguments",
+                                         (Py_ssize_t)len);
+            }
+            argv[i] = arg;
+        }
+        argv[args->argc] = NULL;
+    }
+    else {
+        argv = args->wchar_argv;
+    }
+    *argv_p = argv;
+    return _Py_INIT_OK();
+}