summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2008-01-21 21:54:47 +0000
committerMark Dickinson <dickinsm@gmail.com>2008-01-21 21:54:47 +0000
commit0b84a2edc937e703d948a28b1de02d24cd418cae (patch)
tree36e36c53a7826971aba9aa91676d145382185c33 /Python
parenteb11fa87ff36451e3ef17b1866afd1896fbe261d (diff)
downloadcpython-0b84a2edc937e703d948a28b1de02d24cd418cae.tar.gz
Issue 1678380: fix a bug identifying -0.0 and 0.0
Diffstat (limited to 'Python')
-rw-r--r--Python/compile.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/Python/compile.c b/Python/compile.c
index ce19aa9df4..0e824caabd 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1567,7 +1567,20 @@ compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
Py_ssize_t arg;
/* necessary to make sure types aren't coerced (e.g., int and long) */
- t = PyTuple_Pack(2, o, o->ob_type);
+ /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
+ if (PyFloat_Check(o)) {
+ double d = PyFloat_AS_DOUBLE(o);
+ unsigned char* p = (unsigned char*) &d;
+ /* all we need is to make the tuple different in either the 0.0
+ * or -0.0 case from all others, just to avoid the "coercion".
+ */
+ if (*p==0 && p[sizeof(double)-1]==0)
+ t = PyTuple_Pack(3, o, o->ob_type, Py_None);
+ else
+ t = PyTuple_Pack(2, o, o->ob_type);
+ } else {
+ t = PyTuple_Pack(2, o, o->ob_type);
+ }
if (t == NULL)
return -1;