pymain_set_sys_argv() now copies argv (#4838)

bpo-29240, bpo-32030:

* Rename pymain_set_argv() to pymain_set_sys_argv()
* pymain_set_sys_argv() now creates of copy of argv and modify the
  copy, rather than modifying pymain->argv
* Call pymain_set_sys_argv() earlier: before pymain_run_python(), but
  after pymain_get_importer().
* Add _PySys_SetArgvWithError() to handle errors
This commit is contained in:
Victor Stinner 2017-12-13 17:31:16 +01:00 committed by GitHub
parent 981469794a
commit d5dda98fa8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 89 additions and 36 deletions

View file

@ -2446,17 +2446,34 @@ sys_update_path(int argc, wchar_t **argv)
Py_DECREF(a);
}
_PyInitError
_PySys_SetArgvWithError(int argc, wchar_t **argv, int updatepath)
{
PyObject *av = makeargvobject(argc, argv);
if (av == NULL) {
return _Py_INIT_NO_MEMORY();
}
if (PySys_SetObject("argv", av) != 0) {
Py_DECREF(av);
return _Py_INIT_ERR("can't assign sys.argv");
}
Py_DECREF(av);
if (updatepath) {
/* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path.
If argv[0] is a symlink, use the real path. */
sys_update_path(argc, argv);
}
return _Py_INIT_OK();
}
void
PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
{
PyObject *av = makeargvobject(argc, argv);
if (av == NULL)
Py_FatalError("no mem for sys.argv");
if (PySys_SetObject("argv", av) != 0)
Py_FatalError("can't assign sys.argv");
Py_DECREF(av);
if (updatepath)
sys_update_path(argc, argv);
_PyInitError err = _PySys_SetArgvWithError(argc, argv, updatepath);
if (_Py_INIT_FAILED(err)) {
_Py_FatalInitError(err);
}
}
void