From c243fa23581ed2e5b26b1ead732a06104c88cf97 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 10 Jun 2019 19:06:36 +0530 Subject: [PATCH] Cleanup getenv --- src/polyglot/builtins.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/polyglot/builtins.py b/src/polyglot/builtins.py index 4b3c50fbfe..f68602640e 100644 --- a/src/polyglot/builtins.py +++ b/src/polyglot/builtins.py @@ -151,24 +151,28 @@ else: return x if hasattr(sys, 'getwindowsversion'): - import ctypes - gev = ctypes.windll.kernel32.GetEnvironmentVariableW - def getenv(x, default=None): if isinstance(x, bytes): x = x.decode('mbcs', 'replace') - n = 1024 - buf = ctypes.create_unicode_buffer(n) - res = gev(x, buf, n) + + if getenv.buf is None: + import ctypes + import ctypes.wintypes as w + getenv.cub = ctypes.create_unicode_buffer + getenv.buf = getenv.cub(1024) + getenv.gev = ctypes.windll.kernel32.GetEnvironmentVariableW + getenv.gev.restype = w.DWORD + getenv.gev.argtypes = [w.LPCWSTR, w.LPWSTR, w.DWORD] + res = getenv.gev(x, getenv.buf, len(getenv.buf)) if res == 0: return default - if res > n - 4: - n = res + 8 - buf = ctypes.create_unicode_buffer(n) - res = gev(x, buf, n) + if res > len(getenv.buf) - 4: + getenv.buf = getenv.cub(res + 8) + res = getenv.gev(x, getenv.buf, len(getenv.buf)) if res == 0: return default - return buf.value + return getenv.buf.value + getenv.buf = None else: def getenv(x, default=None): ans = os.getenv(x, default)