mirror of
https://github.com/python/cpython.git
synced 2024-11-25 19:03:49 +08:00
Issue #13889: On MSVC builds, set FPU control word at runtime for all string <-> float conversions. Patch by Samuel Iseli and Stefan Krah.
This commit is contained in:
parent
473fde60dc
commit
18e3d81f96
@ -557,6 +557,30 @@ extern "C" {
|
||||
_Py_set_387controlword(old_387controlword)
|
||||
#endif
|
||||
|
||||
/* get and set x87 control word for VisualStudio/x86 */
|
||||
#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */
|
||||
#define HAVE_PY_SET_53BIT_PRECISION 1
|
||||
#define _Py_SET_53BIT_PRECISION_HEADER \
|
||||
unsigned int old_387controlword, new_387controlword, out_387controlword
|
||||
/* We use the __control87_2 function to set only the x87 control word.
|
||||
The SSE control word is unaffected. */
|
||||
#define _Py_SET_53BIT_PRECISION_START \
|
||||
do { \
|
||||
__control87_2(0, 0, &old_387controlword, NULL); \
|
||||
new_387controlword = \
|
||||
(old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \
|
||||
if (new_387controlword != old_387controlword) \
|
||||
__control87_2(new_387controlword, _MCW_PC | _MCW_RC, \
|
||||
&out_387controlword, NULL); \
|
||||
} while (0)
|
||||
#define _Py_SET_53BIT_PRECISION_END \
|
||||
do { \
|
||||
if (new_387controlword != old_387controlword) \
|
||||
__control87_2(old_387controlword, _MCW_PC | _MCW_RC, \
|
||||
&out_387controlword, NULL); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/* default definitions are empty */
|
||||
#ifndef HAVE_PY_SET_53BIT_PRECISION
|
||||
#define _Py_SET_53BIT_PRECISION_HEADER
|
||||
|
@ -10,6 +10,10 @@ What's New in Python 3.2.4
|
||||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #13889: Check and (if necessary) set FPU control word before calling
|
||||
any of the dtoa.c string <-> float conversion functions, on MSVC builds of
|
||||
Python. This fixes issues when embedding Python in a Delphi app.
|
||||
|
||||
- Issue #14474: Save and restore exception state in thread.start_new_thread()
|
||||
while writing error message if the thread leaves a unhandled exception.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user