Author: Armin Rigo <[email protected]>
Branch: errno-again
Changeset: r75394:944e6eb53a35
Date: 2015-01-16 18:01 +0100
http://bitbucket.org/pypy/pypy/changeset/944e6eb53a35/
Log: in-progress: windows
diff --git a/pypy/module/_multiprocessing/interp_connection.py
b/pypy/module/_multiprocessing/interp_connection.py
--- a/pypy/module/_multiprocessing/interp_connection.py
+++ b/pypy/module/_multiprocessing/interp_connection.py
@@ -441,7 +441,7 @@
lltype.nullptr(rwin32.LPDWORD.TO),
lltype.nullptr(rwin32.LPDWORD.TO),
left_ptr):
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
length = intmask(read_ptr[0] + left_ptr[0])
if length > maxlength: # bad message, close connection
@@ -460,7 +460,7 @@
read_ptr, rffi.NULL)
if not result:
rffi.free_charp(newbuf)
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
assert read_ptr[0] == left_ptr[0]
return length, newbuf
@@ -480,7 +480,7 @@
lltype.nullptr(rwin32.LPDWORD.TO),
bytes_ptr,
lltype.nullptr(rwin32.LPDWORD.TO)):
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
bytes = bytes_ptr[0]
finally:
lltype.free(bytes_ptr, flavor='raw')
@@ -506,7 +506,8 @@
lltype.nullptr(rwin32.LPDWORD.TO),
bytes_ptr,
lltype.nullptr(rwin32.LPDWORD.TO)):
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space,
+ rwin32.lastSavedWindowsError())
bytes = bytes_ptr[0]
finally:
lltype.free(bytes_ptr, flavor='raw')
diff --git a/pypy/module/_multiprocessing/interp_semaphore.py
b/pypy/module/_multiprocessing/interp_semaphore.py
--- a/pypy/module/_multiprocessing/interp_semaphore.py
+++ b/pypy/module/_multiprocessing/interp_semaphore.py
@@ -31,7 +31,8 @@
rwin32.BOOL, releasegil=False)
_ReleaseSemaphore = rwin32.winexternal(
'ReleaseSemaphore', [rwin32.HANDLE, rffi.LONG, rffi.LONGP],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
else:
from rpython.rlib import rposix
@@ -296,7 +297,7 @@
def semlock_release(self, space):
if not _ReleaseSemaphore(self.handle, 1,
lltype.nullptr(rffi.LONGP.TO)):
- err = rwin32.GetLastError()
+ err = rwin32.GetLastError_saved()
if err == 0x0000012a: # ERROR_TOO_MANY_POSTS
raise OperationError(
space.w_ValueError,
@@ -310,7 +311,7 @@
previous_ptr = lltype.malloc(rffi.LONGP.TO, 1, flavor='raw')
try:
if not _ReleaseSemaphore(self.handle, 1, previous_ptr):
- raise rwin32.lastWindowsError("ReleaseSemaphore")
+ raise rwin32.lastSavedWindowsError("ReleaseSemaphore")
return previous_ptr[0] + 1
finally:
lltype.free(previous_ptr, flavor='raw')
diff --git a/pypy/module/_multiprocessing/interp_win32.py
b/pypy/module/_multiprocessing/interp_win32.py
--- a/pypy/module/_multiprocessing/interp_win32.py
+++ b/pypy/module/_multiprocessing/interp_win32.py
@@ -41,20 +41,24 @@
rwin32.DWORD, rwin32.DWORD, rwin32.DWORD,
rwin32.DWORD, rwin32.DWORD, rwin32.DWORD,
rffi.VOIDP],
- rwin32.HANDLE)
+ rwin32.HANDLE,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_ConnectNamedPipe = rwin32.winexternal(
- 'ConnectNamedPipe', [rwin32.HANDLE, rffi.VOIDP], rwin32.BOOL)
+ 'ConnectNamedPipe', [rwin32.HANDLE, rffi.VOIDP], rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_SetNamedPipeHandleState = rwin32.winexternal(
'SetNamedPipeHandleState', [
rwin32.HANDLE,
rwin32.LPDWORD, rwin32.LPDWORD, rwin32.LPDWORD],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_WaitNamedPipe = rwin32.winexternal(
'WaitNamedPipeA', [rwin32.LPCSTR, rwin32.DWORD],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_PeekNamedPipe = rwin32.winexternal(
'PeekNamedPipe', [
@@ -62,31 +66,36 @@
rffi.VOIDP,
rwin32.DWORD,
rwin32.LPDWORD, rwin32.LPDWORD, rwin32.LPDWORD],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_CreateFile = rwin32.winexternal(
'CreateFileA', [
rwin32.LPCSTR,
rwin32.DWORD, rwin32.DWORD, rffi.VOIDP,
rwin32.DWORD, rwin32.DWORD, rwin32.HANDLE],
- rwin32.HANDLE)
+ rwin32.HANDLE,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_WriteFile = rwin32.winexternal(
'WriteFile', [
rwin32.HANDLE,
rffi.VOIDP, rwin32.DWORD,
rwin32.LPDWORD, rffi.VOIDP],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_ReadFile = rwin32.winexternal(
'ReadFile', [
rwin32.HANDLE,
rffi.VOIDP, rwin32.DWORD,
rwin32.LPDWORD, rffi.VOIDP],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_ExitProcess = rwin32.winexternal(
- 'ExitProcess', [rffi.UINT], lltype.Void)
+ 'ExitProcess', [rffi.UINT], lltype.Void,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_GetTickCount = rwin32.winexternal(
'GetTickCount', [], rwin32.DWORD)
@@ -97,10 +106,10 @@
def CloseHandle(space, w_handle):
handle = handle_w(space, w_handle)
if not rwin32.CloseHandle(handle):
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
def GetLastError(space):
- return space.wrap(rwin32.GetLastError())
+ return space.wrap(rwin32.GetLastError_saved())
# __________________________________________________________
# functions for the "win32" namespace
@@ -118,7 +127,7 @@
outputsize, inputsize, timeout, rffi.NULL)
if handle == rwin32.INVALID_HANDLE_VALUE:
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
return w_handle(space, handle)
@@ -129,7 +138,7 @@
raise OperationError(space.w_NotImplementedError,
space.wrap("expected a NULL pointer"))
if not _ConnectNamedPipe(handle, rffi.NULL):
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
def SetNamedPipeHandleState(space, w_handle, w_pipemode, w_maxinstances,
w_timeout):
@@ -149,7 +158,7 @@
statep[2] = rffi.ptradd(state, 2)
if not _SetNamedPipeHandleState(handle, statep[0], statep[1],
statep[2]):
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
finally:
lltype.free(state, flavor='raw')
lltype.free(statep, flavor='raw')
@@ -158,7 +167,7 @@
def WaitNamedPipe(space, name, timeout):
# Careful: zero means "default value specified by CreateNamedPipe()"
if not _WaitNamedPipe(name, timeout):
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
@unwrap_spec(filename=str, access=r_uint, share=r_uint,
disposition=r_uint, flags=r_uint)
@@ -174,7 +183,7 @@
disposition, flags, rwin32.NULL_HANDLE)
if handle == rwin32.INVALID_HANDLE_VALUE:
- raise wrap_windowserror(space, rwin32.lastWindowsError())
+ raise wrap_windowserror(space, rwin32.lastSavedWindowsError())
return w_handle(space, handle)
diff --git a/pypy/module/time/interp_time.py b/pypy/module/time/interp_time.py
--- a/pypy/module/time/interp_time.py
+++ b/pypy/module/time/interp_time.py
@@ -62,7 +62,8 @@
_setCtrlHandlerRoutine = rffi.llexternal(
'pypy_timemodule_setCtrlHandler',
[rwin32.HANDLE], rwin32.BOOL,
- compilation_info=eci)
+ compilation_info=eci,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
class GlobalState:
def __init__(self):
@@ -79,8 +80,8 @@
except WindowsError, e:
raise wrap_windowserror(space, e)
if not _setCtrlHandlerRoutine(globalState.interrupt_event):
- raise wrap_windowserror(
- space, rwin32.lastWindowsError("SetConsoleCtrlHandler"))
+ raise wrap_windowserror(space,
+ rwin32.lastSavedWindowsError("SetConsoleCtrlHandler"))
globalState = GlobalState()
diff --git a/rpython/rlib/rdynload.py b/rpython/rlib/rdynload.py
--- a/rpython/rlib/rdynload.py
+++ b/rpython/rlib/rdynload.py
@@ -145,7 +145,7 @@
# mode is unused on windows, but a consistant signature
res = rwin32.LoadLibrary(name)
if not res:
- err = rwin32.GetLastError()
+ err = rwin32.GetLastError_saved()
raise DLOpenError(rwin32.FormatError(err))
return res
diff --git a/rpython/rlib/rmmap.py b/rpython/rlib/rmmap.py
--- a/rpython/rlib/rmmap.py
+++ b/rpython/rlib/rmmap.py
@@ -201,11 +201,20 @@
SYSTEM_INFO_P = lltype.Ptr(SYSTEM_INFO)
GetSystemInfo, _ = winexternal('GetSystemInfo', [SYSTEM_INFO_P],
lltype.Void)
- GetFileSize, _ = winexternal('GetFileSize', [HANDLE, LPDWORD], DWORD)
+ GetFileSize, _ = winexternal('GetFileSize', [HANDLE, LPDWORD], DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
GetCurrentProcess, _ = winexternal('GetCurrentProcess', [], HANDLE)
- DuplicateHandle, _ = winexternal('DuplicateHandle', [HANDLE, HANDLE,
HANDLE, LPHANDLE, DWORD, BOOL, DWORD], BOOL)
- CreateFileMapping, _ = winexternal('CreateFileMappingA', [HANDLE,
rwin32.LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR], HANDLE)
- MapViewOfFile, _ = winexternal('MapViewOfFile', [HANDLE, DWORD, DWORD,
DWORD, SIZE_T], LPCSTR)##!!LPVOID)
+ DuplicateHandle, _ = winexternal('DuplicateHandle',
+ [HANDLE, HANDLE, HANDLE, LPHANDLE, DWORD,
+ BOOL, DWORD], BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
+ CreateFileMapping, _ = winexternal('CreateFileMappingA',
+ [HANDLE, rwin32.LPSECURITY_ATTRIBUTES,
+ DWORD, DWORD, DWORD, LPCSTR], HANDLE,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
+ MapViewOfFile, _ = winexternal('MapViewOfFile', [HANDLE, DWORD, DWORD,
+ DWORD, SIZE_T], LPCSTR,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
##!!LPVOID
_, UnmapViewOfFile_safe = winexternal('UnmapViewOfFile', [LPCSTR], BOOL)
FlushViewOfFile, _ = winexternal('FlushViewOfFile', [LPCSTR, SIZE_T], BOOL)
SetFilePointer, _ = winexternal('SetFilePointer', [HANDLE, LONG, PLONG,
DWORD], DWORD)
@@ -255,7 +264,7 @@
# so we need to check the last error also
INVALID_FILE_SIZE = -1
if low == INVALID_FILE_SIZE:
- err = rwin32.GetLastError()
+ err = rwin32.GetLastError_saved()
if err:
raise WindowsError(err, "mmap")
return low, high
@@ -328,10 +337,10 @@
self.unmap()
self.setdata(NODATA, 0)
if self.map_handle != INVALID_HANDLE:
- rwin32.CloseHandle(self.map_handle)
+ rwin32.CloseHandle_no_err(self.map_handle)
self.map_handle = INVALID_HANDLE
if self.file_handle != INVALID_HANDLE:
- rwin32.CloseHandle(self.file_handle)
+ rwin32.CloseHandle_no_err(self.file_handle)
self.file_handle = INVALID_HANDLE
elif _POSIX:
self.closed = True
@@ -536,7 +545,7 @@
elif _MS_WINDOWS:
# disconnect the mapping
self.unmap()
- rwin32.CloseHandle(self.map_handle)
+ rwin32.CloseHandle_no_err(self.map_handle)
# move to the desired EOF position
if _64BIT:
@@ -573,9 +582,9 @@
charp = rffi.cast(LPCSTR, data)
self.setdata(charp, newsize)
return
- winerror = rwin32.lastWindowsError()
+ winerror = rwin32.lastSavedWindowsError()
if self.map_handle:
- rwin32.CloseHandle(self.map_handle)
+ rwin32.CloseHandle_no_err(self.map_handle)
self.map_handle = INVALID_HANDLE
raise winerror
@@ -812,7 +821,7 @@
False, # inherited by child procs?
DUPLICATE_SAME_ACCESS) # options
if not res:
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
m.file_handle = handle_ref[0]
finally:
lltype.free(handle_ref, flavor='raw')
@@ -855,9 +864,9 @@
charp = rffi.cast(LPCSTR, data)
m.setdata(charp, map_size)
return m
- winerror = rwin32.lastWindowsError()
+ winerror = rwin32.lastSavedWindowsError()
if m.map_handle:
- rwin32.CloseHandle(m.map_handle)
+ rwin32.CloseHandle_no_err(m.map_handle)
m.map_handle = INVALID_HANDLE
raise winerror
diff --git a/rpython/rlib/rthread.py b/rpython/rlib/rthread.py
--- a/rpython/rlib/rthread.py
+++ b/rpython/rlib/rthread.py
@@ -371,6 +371,7 @@
loop_invariant=True)
tlfield_rpy_errno = ThreadLocalField(rffi.INT, "rpy_errno")
if sys.platform == "win32":
+ from rpython.rlib import rwin32
tlfield_rpy_lasterror = ThreadLocalField(rwin32.DWORD, "rpy_lasterror")
def _threadlocalref_seeme(field):
diff --git a/rpython/rlib/runicode.py b/rpython/rlib/runicode.py
--- a/rpython/rlib/runicode.py
+++ b/rpython/rlib/runicode.py
@@ -1597,7 +1597,8 @@
rwin32.LPCSTR, rffi.INT,
rffi.CWCHARP, rffi.INT],
rffi.INT,
- calling_conv='win')
+ calling_conv='win',
+ save_err=rffi.RFFI_SAVE_LASTERROR)
WideCharToMultiByte = rffi.llexternal('WideCharToMultiByte',
[rffi.UINT, rwin32.DWORD,
@@ -1605,19 +1606,20 @@
rwin32.LPCSTR, rffi.INT,
rwin32.LPCSTR, BOOLP],
rffi.INT,
- calling_conv='win')
+ calling_conv='win',
+ save_err=rffi.RFFI_SAVE_LASTERROR)
def is_dbcs_lead_byte(c):
# XXX don't know how to test this
return False
def _decode_mbcs_error(s, errorhandler):
- if rwin32.GetLastError() == rwin32.ERROR_NO_UNICODE_TRANSLATION:
+ if rwin32.GetLastError_saved() == rwin32.ERROR_NO_UNICODE_TRANSLATION:
msg = ("No mapping for the Unicode character exists in the target "
"multi-byte code page.")
errorhandler('strict', 'mbcs', msg, s, 0, 0)
else:
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
def str_decode_mbcs(s, size, errors, final=False, errorhandler=None,
force_ignore=True):
@@ -1684,7 +1686,7 @@
dataptr, size, None, 0,
None, used_default_p)
if mbcssize == 0:
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
# If we used a default char, then we failed!
if (used_default_p and
rffi.cast(lltype.Bool, used_default_p[0])):
@@ -1696,7 +1698,7 @@
if WideCharToMultiByte(CP_ACP, flags,
dataptr, size, buf.raw, mbcssize,
None, used_default_p) == 0:
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
if (used_default_p and
rffi.cast(lltype.Bool, used_default_p[0])):
errorhandler('strict', 'mbcs', "invalid character",
diff --git a/rpython/rlib/rurandom.py b/rpython/rlib/rurandom.py
--- a/rpython/rlib/rurandom.py
+++ b/rpython/rlib/rurandom.py
@@ -35,14 +35,16 @@
rwin32.LPCSTR, rwin32.LPCSTR, rwin32.DWORD, rwin32.DWORD],
rwin32.BOOL,
calling_conv='win',
- compilation_info=eci)
+ compilation_info=eci,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
CryptGenRandom = rffi.llexternal(
'CryptGenRandom',
[HCRYPTPROV, rwin32.DWORD, rffi.CArrayPtr(rwin32.BYTE)],
rwin32.BOOL,
calling_conv='win',
- compilation_info=eci)
+ compilation_info=eci,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
def init_urandom():
"""NOT_RPYTHON
@@ -60,14 +62,14 @@
if not CryptAcquireContext(
context, None, None,
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT):
- raise rwin32.lastWindowsError("CryptAcquireContext")
+ raise rwin32.lastSavedWindowsError("CryptAcquireContext")
provider = context[0]
# TODO(win64) This is limited to 2**31
with lltype.scoped_alloc(rffi.CArray(rwin32.BYTE), n,
zero=True, # zero seed
) as buf:
if not CryptGenRandom(provider, n, buf):
- raise rwin32.lastWindowsError("CryptGenRandom")
+ raise rwin32.lastSavedWindowsError("CryptGenRandom")
return rffi.charpsize2str(rffi.cast(rffi.CCHARP, buf), n)
diff --git a/rpython/rlib/rwin32.py b/rpython/rlib/rwin32.py
--- a/rpython/rlib/rwin32.py
+++ b/rpython/rlib/rwin32.py
@@ -131,19 +131,23 @@
from rpython.rlib import rthread
rthread.tlfield_rpy_lasterror.setraw(rffi.cast(DWORD, err))
- # In tests, the first call to GetLastError_real() is always wrong,
+ # In tests, the first call to _GetLastError() is always wrong,
# because error is hidden by operations in ll2ctypes. Call it now.
- GetLastError_real()
+ _GetLastError()
GetModuleHandle = winexternal('GetModuleHandleA', [rffi.CCHARP], HMODULE)
- LoadLibrary = winexternal('LoadLibraryA', [rffi.CCHARP], HMODULE)
+ LoadLibrary = winexternal('LoadLibraryA', [rffi.CCHARP], HMODULE,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
GetProcAddress = winexternal('GetProcAddress',
[HMODULE, rffi.CCHARP],
rffi.VOIDP)
FreeLibrary = winexternal('FreeLibrary', [HMODULE], BOOL, releasegil=False)
LocalFree = winexternal('LocalFree', [HLOCAL], DWORD)
- CloseHandle = winexternal('CloseHandle', [HANDLE], BOOL, releasegil=False)
+ CloseHandle = winexternal('CloseHandle', [HANDLE], BOOL, releasegil=False,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
+ CloseHandle_no_err = winexternal('CloseHandle', [HANDLE], BOOL,
+ releasegil=False)
FormatMessage = winexternal(
'FormatMessageA',
@@ -260,7 +264,7 @@
def fake_FormatError(code):
return 'Windows Error %d' % (code,)
- def lastWindowsError(context="Windows Error"):
+ def lastSavedWindowsError(context="Windows Error"):
code = GetLastError_saved()
return WindowsError(code, context)
@@ -285,7 +289,8 @@
_GetVersionEx = winexternal('GetVersionExA',
[lltype.Ptr(OSVERSIONINFOEX)],
- DWORD)
+ DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
@jit.dont_look_inside
def GetVersionEx():
@@ -294,7 +299,7 @@
rffi.sizeof(OSVERSIONINFOEX))
try:
if not _GetVersionEx(info):
- raise lastWindowsError()
+ raise lastSavedWindowsError()
return (rffi.cast(lltype.Signed, info.c_dwMajorVersion),
rffi.cast(lltype.Signed, info.c_dwMinorVersion),
rffi.cast(lltype.Signed, info.c_dwBuildNumber),
@@ -309,7 +314,8 @@
lltype.free(info, flavor='raw')
_WaitForSingleObject = winexternal(
- 'WaitForSingleObject', [HANDLE, DWORD], DWORD)
+ 'WaitForSingleObject', [HANDLE, DWORD], DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
def WaitForSingleObject(handle, timeout):
"""Return values:
@@ -317,12 +323,13 @@
- WAIT_TIMEOUT when the timeout elapsed"""
res = _WaitForSingleObject(handle, timeout)
if res == rffi.cast(DWORD, -1):
- raise lastWindowsError("WaitForSingleObject")
+ raise lastSavedWindowsError("WaitForSingleObject")
return res
_WaitForMultipleObjects = winexternal(
'WaitForMultipleObjects', [
- DWORD, rffi.CArrayPtr(HANDLE), BOOL, DWORD], DWORD)
+ DWORD, rffi.CArrayPtr(HANDLE), BOOL, DWORD], DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
def WaitForMultipleObjects(handles, waitall=False, timeout=INFINITE):
"""Return values:
@@ -336,24 +343,26 @@
handle_array[i] = handles[i]
res = _WaitForMultipleObjects(nb, handle_array, waitall, timeout)
if res == rffi.cast(DWORD, -1):
- raise lastWindowsError("WaitForMultipleObjects")
+ raise lastSavedWindowsError("WaitForMultipleObjects")
return res
finally:
lltype.free(handle_array, flavor='raw')
_CreateEvent = winexternal(
- 'CreateEventA', [rffi.VOIDP, BOOL, BOOL, LPCSTR], HANDLE)
+ 'CreateEventA', [rffi.VOIDP, BOOL, BOOL, LPCSTR], HANDLE,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
def CreateEvent(*args):
handle = _CreateEvent(*args)
if handle == NULL_HANDLE:
- raise lastWindowsError("CreateEvent")
+ raise lastSavedWindowsError("CreateEvent")
return handle
SetEvent = winexternal(
'SetEvent', [HANDLE], BOOL)
ResetEvent = winexternal(
'ResetEvent', [HANDLE], BOOL)
_OpenProcess = winexternal(
- 'OpenProcess', [DWORD, BOOL, DWORD], HANDLE)
+ 'OpenProcess', [DWORD, BOOL, DWORD], HANDLE,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
def OpenProcess(*args):
''' OpenProcess( dwDesiredAccess, bInheritHandle, dwProcessId)
where dwDesiredAccess is a combination of the flags:
@@ -379,12 +388,14 @@
'''
handle = _OpenProcess(*args)
if handle == NULL_HANDLE:
- raise lastWindowsError("OpenProcess")
+ raise lastSavedWindowsError("OpenProcess")
return handle
TerminateProcess = winexternal(
- 'TerminateProcess', [HANDLE, rffi.UINT], BOOL)
+ 'TerminateProcess', [HANDLE, rffi.UINT], BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
GenerateConsoleCtrlEvent = winexternal(
- 'GenerateConsoleCtrlEvent', [DWORD, DWORD], BOOL)
+ 'GenerateConsoleCtrlEvent', [DWORD, DWORD], BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_GetCurrentProcessId = winexternal(
'GetCurrentProcessId', [], DWORD)
def GetCurrentProcessId():
@@ -400,14 +411,15 @@
def os_kill(pid, sig):
if sig == CTRL_C_EVENT or sig == CTRL_BREAK_EVENT:
if GenerateConsoleCtrlEvent(sig, pid) == 0:
- raise lastWindowsError('os_kill failed generating event')
+ raise lastSavedWindowsError('os_kill failed generating event')
return
handle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if handle == NULL_HANDLE:
- raise lastWindowsError('os_kill failed opening process')
+ raise lastSavedWindowsError('os_kill failed opening process')
try:
if TerminateProcess(handle, sig) == 0:
- raise lastWindowsError('os_kill failed to terminate process')
+ raise lastSavedWindowsError(
+ 'os_kill failed to terminate process')
finally:
CloseHandle(handle)
diff --git a/rpython/rlib/rwinreg.py b/rpython/rlib/rwinreg.py
--- a/rpython/rlib/rwinreg.py
+++ b/rpython/rlib/rwinreg.py
@@ -146,17 +146,18 @@
_ExpandEnvironmentStringsW = external(
'ExpandEnvironmentStringsW',
[rffi.CWCHARP, rffi.CWCHARP, rwin32.DWORD],
- rwin32.DWORD)
+ rwin32.DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
def ExpandEnvironmentStrings(source):
with rffi.scoped_unicode2wcharp(source) as src_buf:
size = _ExpandEnvironmentStringsW(src_buf,
lltype.nullptr(rffi.CWCHARP.TO), 0)
if size == 0:
- raise rwin32.lastWindowsError("ExpandEnvironmentStrings")
+ raise rwin32.lastSavedWindowsError("ExpandEnvironmentStrings")
size = intmask(size)
with rffi.scoped_alloc_unicodebuffer(size) as dest_buf:
if _ExpandEnvironmentStringsW(src_buf,
dest_buf.raw, size) == 0:
- raise rwin32.lastWindowsError("ExpandEnvironmentStrings")
+ raise rwin32.lastSavedWindowsError("ExpandEnvironmentStrings")
return dest_buf.str(size - 1) # remove trailing \0
diff --git a/rpython/rlib/streamio.py b/rpython/rlib/streamio.py
--- a/rpython/rlib/streamio.py
+++ b/rpython/rlib/streamio.py
@@ -188,7 +188,8 @@
if sys.platform == "win32":
- from rpython.rlib.rwin32 import BOOL, HANDLE, get_osfhandle, GetLastError
+ from rpython.rlib.rwin32 import BOOL, HANDLE, get_osfhandle
+ from rpython.rlib.rwin32 import GetLastError_saved
from rpython.translator.tool.cbuild import ExternalCompilationInfo
from rpython.rtyper.lltypesystem import rffi
@@ -196,7 +197,8 @@
_setmode = rffi.llexternal('_setmode', [rffi.INT, rffi.INT], rffi.INT,
compilation_info=_eci)
SetEndOfFile = rffi.llexternal('SetEndOfFile', [HANDLE], BOOL,
- compilation_info=_eci)
+ compilation_info=_eci,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
def _setfd_binary(fd):
# Allow this to succeed on invalid fd's
@@ -211,7 +213,7 @@
# Truncate. Note that this may grow the file!
handle = get_osfhandle(fd)
if not SetEndOfFile(handle):
- raise OSError(GetLastError(),
+ raise OSError(GetLastError_saved(),
"Could not truncate file")
finally:
# we restore the file pointer position in any case
diff --git a/rpython/rtyper/lltypesystem/module/ll_math.py
b/rpython/rtyper/lltypesystem/module/ll_math.py
--- a/rpython/rtyper/lltypesystem/module/ll_math.py
+++ b/rpython/rtyper/lltypesystem/module/ll_math.py
@@ -43,10 +43,10 @@
return rffi.llexternal(name, ARGS, RESULT, compilation_info=eci,
sandboxsafe=True, **kwargs)
-def math_llexternal(name, ARGS, RESULT):
+def math_llexternal(name, ARGS, RESULT, **kwargs):
return rffi.llexternal(math_prefix + name, ARGS, RESULT,
compilation_info=math_eci,
- sandboxsafe=True)
+ sandboxsafe=True, **kwargs)
math_fabs = llexternal('fabs', [rffi.DOUBLE], rffi.DOUBLE)
math_log = llexternal('log', [rffi.DOUBLE], rffi.DOUBLE)
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -1339,7 +1339,8 @@
rwin32.LPHANDLE,
rffi.VOIDP,
rwin32.DWORD],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
_open_osfhandle = self.llexternal('_open_osfhandle',
[rffi.INTPTR_T,
rffi.INT],
rffi.INT)
@@ -1352,7 +1353,7 @@
if ok:
error = 0
else:
- error = rwin32.GetLastError()
+ error = rwin32.GetLastError_saved()
hread = rffi.cast(rffi.INTPTR_T, pread[0])
hwrite = rffi.cast(rffi.INTPTR_T, pwrite[0])
lltype.free(pwrite, flavor='raw')
@@ -1564,7 +1565,7 @@
@func_renamer('unlink_llimpl_%s' % traits.str.__name__)
def unlink_llimpl(path):
if not win32traits.DeleteFile(path):
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
return extdef([traits.str0], s_None, llimpl=unlink_llimpl,
export_name=traits.ll_os_name('unlink'))
@@ -1601,7 +1602,7 @@
@func_renamer('mkdir_llimpl_%s' % traits.str.__name__)
def os_mkdir_llimpl(path, mode):
if not win32traits.CreateDirectory(path, None):
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
else:
def os_mkdir_llimpl(pathname, mode):
res = os_mkdir(pathname, mode)
@@ -1677,7 +1678,7 @@
@func_renamer('rename_llimpl_%s' % traits.str.__name__)
def rename_llimpl(oldpath, newpath):
if not win32traits.MoveFile(oldpath, newpath):
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
return extdef([traits.str0, traits.str0], s_None, llimpl=rename_llimpl,
export_name=traits.ll_os_name('rename'))
diff --git a/rpython/rtyper/module/ll_os_environ.py
b/rpython/rtyper/module/ll_os_environ.py
--- a/rpython/rtyper/module/ll_os_environ.py
+++ b/rpython/rtyper/module/ll_os_environ.py
@@ -124,7 +124,8 @@
_wgetenv = rffi.llexternal('_wgetenv', [rffi.CWCHARP], rffi.CWCHARP,
compilation_info=eci, releasegil=False)
_wputenv = rffi.llexternal('_wputenv', [rffi.CWCHARP], rffi.INT,
- compilation_info=eci)
+ compilation_info=eci,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
class EnvKeepalive:
pass
@@ -144,7 +145,7 @@
traits = UnicodeTraits()
get_environ, getenv, putenv = get__wenviron, _wgetenv, _wputenv
byname, eq = envkeepalive.bywname, u'='
- from rpython.rlib.rwin32 import lastWindowsError as last_error
+ from rpython.rlib.rwin32 import lastSavedWindowsError as last_error
def envitems_llimpl():
environ = get_environ()
diff --git a/rpython/rtyper/module/ll_os_stat.py
b/rpython/rtyper/module/ll_os_stat.py
--- a/rpython/rtyper/module/ll_os_stat.py
+++ b/rpython/rtyper/module/ll_os_stat.py
@@ -523,11 +523,11 @@
try:
l_path = traits.str2charp(path)
res = win32traits.GetFileAttributesEx(l_path,
win32traits.GetFileExInfoStandard, data)
- errcode = rwin32.GetLastError()
+ errcode = rwin32.GetLastError_saved()
if res == 0:
if errcode == win32traits.ERROR_SHARING_VIOLATION:
res = attributes_from_dir(l_path, data)
- errcode = rwin32.GetLastError()
+ errcode = rwin32.GetLastError_saved()
traits.free_charp(l_path)
if res == 0:
raise WindowsError(errcode, "os_stat failed")
@@ -549,7 +549,7 @@
0, 0, 0, 0, 0,
0, 0, 0, 0))
elif filetype == win32traits.FILE_TYPE_UNKNOWN:
- error = rwin32.GetLastError()
+ error = rwin32.GetLastError_saved()
if error != 0:
raise WindowsError(error, "os_fstat failed")
# else: unknown but valid file
@@ -560,7 +560,8 @@
try:
res = win32traits.GetFileInformationByHandle(handle, info)
if res == 0:
- raise WindowsError(rwin32.GetLastError(), "os_fstat failed")
+ raise WindowsError(rwin32.GetLastError_saved(),
+ "os_fstat failed")
return by_handle_info_to_stat(info)
finally:
lltype.free(info, flavor='raw')
diff --git a/rpython/rtyper/module/ll_win32file.py
b/rpython/rtyper/module/ll_win32file.py
--- a/rpython/rtyper/module/ll_win32file.py
+++ b/rpython/rtyper/module/ll_win32file.py
@@ -113,10 +113,12 @@
FindFirstFile = external('FindFirstFile' + suffix,
[traits.CCHARP, LPWIN32_FIND_DATA],
- rwin32.HANDLE)
+ rwin32.HANDLE,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
FindNextFile = external('FindNextFile' + suffix,
[rwin32.HANDLE, LPWIN32_FIND_DATA],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
FindClose = external('FindClose',
[rwin32.HANDLE],
rwin32.BOOL)
@@ -124,28 +126,33 @@
GetFileAttributes = external(
'GetFileAttributes' + suffix,
[traits.CCHARP],
- rwin32.DWORD)
+ rwin32.DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
SetFileAttributes = external(
'SetFileAttributes' + suffix,
[traits.CCHARP, rwin32.DWORD],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
GetFileAttributesEx = external(
'GetFileAttributesEx' + suffix,
[traits.CCHARP, GET_FILEEX_INFO_LEVELS,
lltype.Ptr(WIN32_FILE_ATTRIBUTE_DATA)],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
GetFileInformationByHandle = external(
'GetFileInformationByHandle',
[rwin32.HANDLE, lltype.Ptr(BY_HANDLE_FILE_INFORMATION)],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
GetFileType = external(
'GetFileType',
[rwin32.HANDLE],
- rwin32.DWORD)
+ rwin32.DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
LPSTRP = rffi.CArrayPtr(traits.CCHARP)
@@ -153,45 +160,52 @@
'GetFullPathName' + suffix,
[traits.CCHARP, rwin32.DWORD,
traits.CCHARP, LPSTRP],
- rwin32.DWORD)
+ rwin32.DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
GetCurrentDirectory = external(
'GetCurrentDirectory' + suffix,
[rwin32.DWORD, traits.CCHARP],
- rwin32.DWORD)
+ rwin32.DWORD,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
SetCurrentDirectory = external(
'SetCurrentDirectory' + suffix,
[traits.CCHARP],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
CreateDirectory = external(
'CreateDirectory' + suffix,
[traits.CCHARP, rffi.VOIDP],
rwin32.BOOL,
- XXX) # save_err=rffi.RFFI_SAVE_LASTERROR
+ save_err=rffi.RFFI_SAVE_LASTERROR)
SetEnvironmentVariable = external(
'SetEnvironmentVariable' + suffix,
[traits.CCHARP, traits.CCHARP],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
CreateFile = external(
'CreateFile' + apisuffix,
[traits.CCHARP, rwin32.DWORD, rwin32.DWORD,
rwin32.LPSECURITY_ATTRIBUTES, rwin32.DWORD, rwin32.DWORD,
rwin32.HANDLE],
- rwin32.HANDLE)
+ rwin32.HANDLE,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
DeleteFile = external(
'DeleteFile' + suffix,
[traits.CCHARP],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
MoveFile = external(
'MoveFile' + suffix,
[traits.CCHARP, traits.CCHARP],
- rwin32.BOOL)
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
return Win32Traits
@@ -227,7 +241,7 @@
result = []
hFindFile = win32traits.FindFirstFile(mask, filedata)
if hFindFile == rwin32.INVALID_HANDLE_VALUE:
- error = rwin32.GetLastError()
+ error = rwin32.GetLastError_saved()
if error == win32traits.ERROR_FILE_NOT_FOUND:
return result
else:
@@ -241,7 +255,7 @@
break
# FindNextFile sets error to ERROR_NO_MORE_FILES if
# it got to the end of the directory
- error = rwin32.GetLastError()
+ error = rwin32.GetLastError_saved()
win32traits.FindClose(hFindFile)
if error == win32traits.ERROR_NO_MORE_FILES:
return result
@@ -279,14 +293,14 @@
the per-drive current directory, which are of the form =<drive>:
"""
if not win32traits.SetCurrentDirectory(path):
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
MAX_PATH = rwin32.MAX_PATH
assert MAX_PATH > 0
with traits.scoped_alloc_buffer(MAX_PATH) as path:
res = win32traits.GetCurrentDirectory(MAX_PATH + 1, path.raw)
if not res:
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
res = rffi.cast(lltype.Signed, res)
assert res > 0
if res <= MAX_PATH + 1:
@@ -295,14 +309,14 @@
with traits.scoped_alloc_buffer(res) as path:
res = win32traits.GetCurrentDirectory(res, path.raw)
if not res:
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
res = rffi.cast(lltype.Signed, res)
assert res > 0
new_path = path.str(res)
if isUNC(new_path):
return
if not win32traits.SetEnvironmentVariable(magic_envvar(new_path),
new_path):
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
return chdir_llimpl
@@ -317,13 +331,13 @@
def chmod_llimpl(path, mode):
attr = win32traits.GetFileAttributes(path)
if attr == win32traits.INVALID_FILE_ATTRIBUTES:
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
if mode & 0200: # _S_IWRITE
attr &= ~win32traits.FILE_ATTRIBUTE_READONLY
else:
attr |= win32traits.FILE_ATTRIBUTE_READONLY
if not win32traits.SetFileAttributes(path, attr):
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
return chmod_llimpl
@@ -343,7 +357,7 @@
path, rffi.cast(rwin32.DWORD, nBufferLength),
lpBuffer, lltype.nullptr(win32traits.LPSTRP.TO))
if res == 0:
- raise rwin32.lastWindowsError("_getfullpathname failed")
+ raise rwin32.lastSavedWindowsError("_getfullpathname failed")
result = traits.charp2str(lpBuffer)
return result
finally:
@@ -360,7 +374,8 @@
'GetSystemTime',
[lltype.Ptr(rwin32.SYSTEMTIME)],
lltype.Void,
- calling_conv='win')
+ calling_conv='win',
+ save_err=rffi.RFFI_SAVE_LASTERROR)
SystemTimeToFileTime = rffi.llexternal(
'SystemTimeToFileTime',
@@ -376,7 +391,8 @@
lltype.Ptr(rwin32.FILETIME),
lltype.Ptr(rwin32.FILETIME)],
rwin32.BOOL,
- calling_conv = 'win')
+ calling_conv = 'win',
+ save_err=rffi.RFFI_SAVE_LASTERROR)
@specialize.argtype(1)
def os_utime_llimpl(path, tp):
@@ -386,7 +402,7 @@
win32traits.FILE_FLAG_BACKUP_SEMANTICS,
rwin32.NULL_HANDLE)
if hFile == rwin32.INVALID_HANDLE_VALUE:
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
ctime = lltype.nullptr(rwin32.FILETIME)
atime = lltype.malloc(rwin32.FILETIME, flavor='raw')
mtime = lltype.malloc(rwin32.FILETIME, flavor='raw')
@@ -397,7 +413,7 @@
GetSystemTime(now)
if (not SystemTimeToFileTime(now, atime) or
not SystemTimeToFileTime(now, mtime)):
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
finally:
lltype.free(now, flavor='raw')
else:
@@ -405,7 +421,7 @@
time_t_to_FILE_TIME(actime, atime)
time_t_to_FILE_TIME(modtime, mtime)
if not SetFileTime(hFile, ctime, atime, mtime):
- raise rwin32.lastWindowsError()
+ raise rwin32.lastSavedWindowsError()
finally:
rwin32.CloseHandle(hFile)
lltype.free(atime, flavor='raw')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit