Mercurial > cpython-lru_cache-weakref
annotate Python/pymath.c @ 58973:db86bf39ccaa legacy-trunk
Issue 7970: When email.Parser.Parser parses a MIME message of type
message/rfc822 it turns it into an object whose body consists of
a list containing a single Message object. HeaderParser, on the
other hand, just copies the body as a string. Generator.flatten
has a special handler for the message mime type that expected the
body to be the one item list. This fails if the message was parsed
by HeaderParser. So we now check to see if the body is a string
first, and if so just we just emit it.
| author | R. David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Sun, 21 Feb 2010 04:23:00 +0000 |
| parents | 7f5cbc28f433 |
| children | fd25030223b0 |
| rev | line source |
|---|---|
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1 #include "Python.h" |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
2 |
|
51485
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
3 #ifdef X87_DOUBLE_ROUNDING |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
4 /* On x86 platforms using an x87 FPU, this function is called from the |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
5 Py_FORCE_DOUBLE macro (defined in pymath.h) to force a floating-point |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
6 number out of an 80-bit x87 FPU register and into a 64-bit memory location, |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
7 thus rounding from extended precision to double precision. */ |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
8 double _Py_force_double(double x) |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
9 { |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
10 volatile double y; |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
11 y = x; |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
12 return y; |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
13 } |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
14 #endif |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49267
diff
changeset
|
15 |
|
56707
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
16 #ifdef HAVE_GCC_ASM_FOR_X87 |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
17 |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
18 /* inline assembly for getting and setting the 387 FPU control word on |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
19 gcc/x86 */ |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
20 |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
21 unsigned short _Py_get_387controlword(void) { |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
22 unsigned short cw; |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
23 __asm__ __volatile__ ("fnstcw %0" : "=m" (cw)); |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
24 return cw; |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
25 } |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
26 |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
27 void _Py_set_387controlword(unsigned short cw) { |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
28 __asm__ __volatile__ ("fldcw %0" : : "m" (cw)); |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
29 } |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
30 |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
31 #endif |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
32 |
|
2ab08c919648
Issue #7117 (backport py3k float repr) continued:
Mark Dickinson <dickinsm@gmail.com>
parents:
53227
diff
changeset
|
33 |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
34 #ifndef HAVE_HYPOT |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
35 double hypot(double x, double y) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
36 { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
37 double yx; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
38 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
39 x = fabs(x); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
40 y = fabs(y); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
41 if (x < y) { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
42 double temp = x; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
43 x = y; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
44 y = temp; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
45 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
46 if (x == 0.) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
47 return 0.; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
48 else { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
49 yx = y/x; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
50 return x*sqrt(1.+yx*yx); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
51 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
52 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
53 #endif /* HAVE_HYPOT */ |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
54 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
55 #ifndef HAVE_COPYSIGN |
|
53222
ad5c7eaccea1
copysign shouldn't be declared as static in pymath.c
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
56 double |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
57 copysign(double x, double y) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
58 { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
59 /* use atan2 to distinguish -0. from 0. */ |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
60 if (y > 0. || (y == 0. && atan2(y, -1.) > 0.)) { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
61 return fabs(x); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
62 } else { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
63 return -fabs(x); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
64 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
65 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
66 #endif /* HAVE_COPYSIGN */ |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
67 |
|
53227
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
68 #ifndef HAVE_ROUND |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
69 double |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
70 round(double x) |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
71 { |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
72 double absx, y; |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
73 absx = fabs(x); |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
74 y = floor(absx); |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
75 if (absx - y >= 0.5) |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
76 y += 1.0; |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
77 return copysign(y, x); |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
78 } |
|
96d82facd890
Backport r71704 (add configure check for C99 round function) to trunk.
Mark Dickinson <dickinsm@gmail.com>
parents:
53222
diff
changeset
|
79 #endif /* HAVE_ROUND */ |
