New submission from Serhiy Storchaka <storchaka+cpyt...@gmail.com>:

Function getenvironment() in Modules/_winapi.c is used for converting the 
environment mapping to the wchar_t string for passing to CreateProcessW(). It 
performs the following steps:

* Allocate a Py_UCS4 buffer and copy all keys and values, converting them to 
Py_UCS4.
* Create a PyUnicode object from the Py_UCS4 buffer.
* Create a wchar_t buffer from the PyUnicode object (unless it has the UCS2 
kind).

The proposed PR makes it performing a single steps:

* Allocate a wchar_t buffer and copy all keys and values, converting them to 
wchar_t.

This needs less memory allocations and smaller memory consumption. In most 
cases this needs also less and faster memory scans and copies.

In addition, the PR replaces PySequence_Fast C API with faster PyList C API. In 
the past PyMapping_Keys() and PyMapping_Values() could return a tuple in 
unlikely case, but now they always return a list (see issue 28280).

The current code uses the legacy Unicode C API, while the new code uses the 
newer (added in 3.3) wchar_t based Unicode C API, so something similar to this 
change should be made sooner or later.

----------
components: Extension Modules
messages: 338527
nosy: lemburg, serhiy.storchaka
priority: normal
severity: normal
status: open
title: Refactor getenvironment() in _winapi.c
versions: Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue36387>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to