annotate Objects/complexobject.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents a73c47c1d374
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5559
1eced1aaad5a Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Complex object implementation */
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 /* Borrows heavily from floatobject.c */
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
5559
1eced1aaad5a Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
6 /* Submitted by Jim Hugunin */
1eced1aaad5a Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
7
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
8 #include "Python.h"
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
9 #include "structmember.h"
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 /* elementary operations on complex numbers */
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3608
diff changeset
13 static Py_complex c_1 = {1., 0.};
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
15 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
16 c_sum(Py_complex a, Py_complex b)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
18 Py_complex r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
19 r.real = a.real + b.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
20 r.imag = a.imag + b.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
21 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
24 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
25 c_diff(Py_complex a, Py_complex b)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
27 Py_complex r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
28 r.real = a.real - b.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
29 r.imag = a.imag - b.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
30 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
33 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
34 c_neg(Py_complex a)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
36 Py_complex r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
37 r.real = -a.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
38 r.imag = -a.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
39 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
41
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
42 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
43 c_prod(Py_complex a, Py_complex b)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
45 Py_complex r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
46 r.real = a.real*b.real - a.imag*b.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
47 r.imag = a.real*b.imag + a.imag*b.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
48 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
51 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
52 c_quot(Py_complex a, Py_complex b)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
54 /******************************************************************
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
55 This was the original algorithm. It's grossly prone to spurious
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
56 overflow and underflow errors. It also merrily divides by 0 despite
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
57 checking for that(!). The code still serves a doc purpose here, as
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
58 the algorithm following is a simple by-cases transformation of this
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
59 one:
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
60
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
61 Py_complex r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
62 double d = b.real*b.real + b.imag*b.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
63 if (d == 0.)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
64 errno = EDOM;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
65 r.real = (a.real*b.real + a.imag*b.imag)/d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
66 r.imag = (a.imag*b.real - a.real*b.imag)/d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
67 return r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
68 ******************************************************************/
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
69
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
70 /* This algorithm is better, and is pretty obvious: first divide the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
71 * numerators and denominator by whichever of {b.real, b.imag} has
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
72 * larger magnitude. The earliest reference I found was to CACM
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
73 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
74 * University). As usual, though, we're still ignoring all IEEE
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
75 * endcases.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
76 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
77 Py_complex r; /* the result */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
78 const double abs_breal = b.real < 0 ? -b.real : b.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
79 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
80
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
81 if (abs_breal >= abs_bimag) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
82 /* divide tops and bottom by b.real */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
83 if (abs_breal == 0.0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
84 errno = EDOM;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
85 r.real = r.imag = 0.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
86 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
87 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
88 const double ratio = b.imag / b.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
89 const double denom = b.real + b.imag * ratio;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
90 r.real = (a.real + a.imag * ratio) / denom;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
91 r.imag = (a.imag - a.real * ratio) / denom;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
92 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
93 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
94 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
95 /* divide tops and bottom by b.imag */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
96 const double ratio = b.real / b.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
97 const double denom = b.real * ratio + b.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
98 assert(b.imag != 0.0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
99 r.real = (a.real * ratio + a.imag) / denom;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
100 r.imag = (a.imag * ratio - a.real) / denom;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
101 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
102 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
104
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
105 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
106 c_pow(Py_complex a, Py_complex b)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
108 Py_complex r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
109 double vabs,len,at,phase;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
110 if (b.real == 0. && b.imag == 0.) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
111 r.real = 1.;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
112 r.imag = 0.;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
113 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
114 else if (a.real == 0. && a.imag == 0.) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
115 if (b.imag != 0. || b.real < 0.)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
116 errno = EDOM;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
117 r.real = 0.;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
118 r.imag = 0.;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
119 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
120 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
121 vabs = hypot(a.real,a.imag);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
122 len = pow(vabs,b.real);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
123 at = atan2(a.imag, a.real);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
124 phase = at*b.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
125 if (b.imag != 0.0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
126 len /= exp(at*b.imag);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
127 phase += b.imag*log(vabs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
128 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
129 r.real = len*cos(phase);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
130 r.imag = len*sin(phase);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
131 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
132 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
134
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
135 static Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
136 c_powu(Py_complex x, long n)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
138 Py_complex r, p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
139 long mask = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
140 r = c_1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
141 p = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
142 while (mask > 0 && n >= mask) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
143 if (n & mask)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
144 r = c_prod(r,p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
145 mask <<= 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
146 p = c_prod(p,p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
147 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
148 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
150
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
151 static Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
152 c_powi(Py_complex x, long n)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
154 Py_complex cn;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
155
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
156 if (n > 100 || n < -100) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
157 cn.real = (double) n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
158 cn.imag = 0.;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
159 return c_pow(x,cn);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
160 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
161 else if (n > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
162 return c_powu(x,n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
163 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
164 return c_quot(c_1,c_powu(x,-n));
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
165
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
167
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
168 double
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
169 c_abs(Py_complex z)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
170 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
171 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
172 double result;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
173
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
174 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
175 /* C99 rules: if either the real or the imaginary part is an
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
176 infinity, return infinity, even if the other part is a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
177 NaN. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
178 if (Py_IS_INFINITY(z.real)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
179 result = fabs(z.real);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
180 errno = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
181 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
182 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
183 if (Py_IS_INFINITY(z.imag)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
184 result = fabs(z.imag);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
185 errno = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
186 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
187 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
188 /* either the real or imaginary part is a NaN,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
189 and neither is infinite. Result should be NaN. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
190 return Py_NAN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
191 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
192 result = hypot(z.real, z.imag);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
193 if (!Py_IS_FINITE(result))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
194 errno = ERANGE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
195 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
196 errno = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
197 return result;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
198 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
199
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
200 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
201 complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
202 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
203 PyObject *op;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
204
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
205 op = type->tp_alloc(type, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
206 if (op != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
207 ((PyComplexObject *)op)->cval = cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
208 return op;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
209 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
210
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
212 PyComplex_FromCComplex(Py_complex cval)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 {
85157
e7f6cef7a4cc Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83433
diff changeset
214 PyComplexObject *op;
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
215
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
216 /* Inline PyObject_New */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
217 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
218 if (op == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
219 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
220 PyObject_INIT(op, &PyComplex_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
221 op->cval = cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
222 return (PyObject *) op;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
225 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
226 complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
227 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
228 Py_complex c;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
229 c.real = real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
230 c.imag = imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
231 return complex_subtype_from_c_complex(type, c);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
232 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
233
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
235 PyComplex_FromDoubles(double real, double imag)
4025
854f25fde8f4 Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents: 3771
diff changeset
236 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
237 Py_complex c;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
238 c.real = real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
239 c.imag = imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
240 return PyComplex_FromCComplex(c);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
242
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 double
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
244 PyComplex_RealAsDouble(PyObject *op)
4025
854f25fde8f4 Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents: 3771
diff changeset
245 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
246 if (PyComplex_Check(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
247 return ((PyComplexObject *)op)->cval.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
248 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
249 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
250 return PyFloat_AsDouble(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
251 }
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
253
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 double
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
255 PyComplex_ImagAsDouble(PyObject *op)
4025
854f25fde8f4 Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents: 3771
diff changeset
256 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
257 if (PyComplex_Check(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
258 return ((PyComplexObject *)op)->cval.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
259 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
260 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
261 return 0.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
262 }
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
264
58143
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
265 static PyObject *
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
266 try_complex_special_method(PyObject *op) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
267 PyObject *f;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 72475
diff changeset
268 _Py_IDENTIFIER(__complex__);
58143
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
269
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 72475
diff changeset
270 f = _PyObject_LookupSpecial(op, &PyId___complex__);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
271 if (f) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
272 PyObject *res = PyObject_CallFunctionObjArgs(f, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
273 Py_DECREF(f);
80426
399e59ad0a70 Issue #16290: __complex__ must now always return an instance of complex.
Mark Dickinson <mdickinson@enthought.com>
parents: 77223
diff changeset
274 if (res != NULL && !PyComplex_Check(res)) {
399e59ad0a70 Issue #16290: __complex__ must now always return an instance of complex.
Mark Dickinson <mdickinson@enthought.com>
parents: 77223
diff changeset
275 PyErr_SetString(PyExc_TypeError,
399e59ad0a70 Issue #16290: __complex__ must now always return an instance of complex.
Mark Dickinson <mdickinson@enthought.com>
parents: 77223
diff changeset
276 "__complex__ should return a complex object");
399e59ad0a70 Issue #16290: __complex__ must now always return an instance of complex.
Mark Dickinson <mdickinson@enthought.com>
parents: 77223
diff changeset
277 Py_DECREF(res);
399e59ad0a70 Issue #16290: __complex__ must now always return an instance of complex.
Mark Dickinson <mdickinson@enthought.com>
parents: 77223
diff changeset
278 return NULL;
399e59ad0a70 Issue #16290: __complex__ must now always return an instance of complex.
Mark Dickinson <mdickinson@enthought.com>
parents: 77223
diff changeset
279 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
280 return res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
281 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
282 return NULL;
58143
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
283 }
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
284
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3608
diff changeset
285 Py_complex
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
286 PyComplex_AsCComplex(PyObject *op)
4025
854f25fde8f4 Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents: 3771
diff changeset
287 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
288 Py_complex cv;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
289 PyObject *newop = NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40626
diff changeset
290
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
291 assert(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
292 /* If op is already of type PyComplex_Type, return its value */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
293 if (PyComplex_Check(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
294 return ((PyComplexObject *)op)->cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
295 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
296 /* If not, use op's __complex__ method, if it exists */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
297
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
298 /* return -1 on failure */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
299 cv.real = -1.;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
300 cv.imag = 0.;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
301
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
302 newop = try_complex_special_method(op);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40626
diff changeset
303
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
304 if (newop) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
305 cv = ((PyComplexObject *)newop)->cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
306 Py_DECREF(newop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
307 return cv;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
308 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
309 else if (PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
310 return cv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
311 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
312 /* If neither of the above works, interpret op as a float giving the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
313 real part of the result, and fill in the imaginary part as 0. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
314 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
315 /* PyFloat_AsDouble will return -1 on failure */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
316 cv.real = PyFloat_AsDouble(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
317 return cv;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
318 }
3328
4c655115dfce Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents: 3316
diff changeset
319 }
4c655115dfce Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents: 3316
diff changeset
320
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 static void
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
322 complex_dealloc(PyObject *op)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
324 op->ob_type->tp_free(op);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
326
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
327 static PyObject *
66705
fd638ca74634 Removed static function complex_format, moved it into complex_repr. Modified tests to check both str and repr, which are the same for complex.
Eric Smith <eric@trueblade.com>
parents: 66673
diff changeset
328 complex_repr(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 {
66705
fd638ca74634 Removed static function complex_format, moved it into complex_repr. Modified tests to check both str and repr, which are the same for complex.
Eric Smith <eric@trueblade.com>
parents: 66673
diff changeset
330 int precision = 0;
fd638ca74634 Removed static function complex_format, moved it into complex_repr. Modified tests to check both str and repr, which are the same for complex.
Eric Smith <eric@trueblade.com>
parents: 66673
diff changeset
331 char format_code = 'r';
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
332 PyObject *result = NULL;
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
333
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
334 /* If these are non-NULL, they'll need to be freed. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
335 char *pre = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
336 char *im = NULL;
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
337
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
338 /* These do not need to be freed. re is either an alias
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
339 for pre or a pointer to a constant. lead and tail
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
340 are pointers to constants. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
341 char *re = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
342 char *lead = "";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
343 char *tail = "";
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
344
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
345 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
66705
fd638ca74634 Removed static function complex_format, moved it into complex_repr. Modified tests to check both str and repr, which are the same for complex.
Eric Smith <eric@trueblade.com>
parents: 66673
diff changeset
346 /* Real part is +0: just output the imaginary part and do not
fd638ca74634 Removed static function complex_format, moved it into complex_repr. Modified tests to check both str and repr, which are the same for complex.
Eric Smith <eric@trueblade.com>
parents: 66673
diff changeset
347 include parens. */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
348 re = "";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
349 im = PyOS_double_to_string(v->cval.imag, format_code,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
350 precision, 0, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
351 if (!im) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
352 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
353 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
354 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
355 } else {
66705
fd638ca74634 Removed static function complex_format, moved it into complex_repr. Modified tests to check both str and repr, which are the same for complex.
Eric Smith <eric@trueblade.com>
parents: 66673
diff changeset
356 /* Format imaginary part with sign, real part without. Include
fd638ca74634 Removed static function complex_format, moved it into complex_repr. Modified tests to check both str and repr, which are the same for complex.
Eric Smith <eric@trueblade.com>
parents: 66673
diff changeset
357 parens in the result. */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
358 pre = PyOS_double_to_string(v->cval.real, format_code,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
359 precision, 0, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
360 if (!pre) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
361 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
362 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
363 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
364 re = pre;
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
365
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
366 im = PyOS_double_to_string(v->cval.imag, format_code,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
367 precision, Py_DTSF_SIGN, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
368 if (!im) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
369 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
370 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
371 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
372 lead = "(";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
373 tail = ")";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
374 }
68809
4c2135930882 Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
375 result = PyUnicode_FromFormat("%s%s%sj%s", lead, re, im, tail);
53332
330115137414 Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents: 53187
diff changeset
376 done:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
377 PyMem_Free(im);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
378 PyMem_Free(pre);
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
379
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
380 return result;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
382
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 63750
diff changeset
383 static Py_hash_t
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
384 complex_hash(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 {
65603
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
386 Py_uhash_t hashreal, hashimag, combined;
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
387 hashreal = (Py_uhash_t)_Py_HashDouble(v->cval.real);
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
388 if (hashreal == (Py_uhash_t)-1)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
389 return -1;
65603
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
390 hashimag = (Py_uhash_t)_Py_HashDouble(v->cval.imag);
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
391 if (hashimag == (Py_uhash_t)-1)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
392 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
393 /* Note: if the imaginary part is 0, hashimag is 0 now,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
394 * so the following returns hashreal unchanged. This is
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
395 * important because numbers of different types that
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
396 * compare equal must have the same hash value, so that
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
397 * hash(x + 0*j) must equal hash(x).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
398 */
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
399 combined = hashreal + _PyHASH_IMAG * hashimag;
65603
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
400 if (combined == (Py_uhash_t)-1)
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
401 combined = (Py_uhash_t)-2;
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 63750
diff changeset
402 return (Py_hash_t)combined;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
404
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
405 /* This macro may return! */
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
406 #define TO_COMPLEX(obj, c) \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
407 if (PyComplex_Check(obj)) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
408 c = ((PyComplexObject *)(obj))->cval; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
409 else if (to_complex(&(obj), &(c)) < 0) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
410 return (obj)
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
411
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
412 static int
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
413 to_complex(PyObject **pobj, Py_complex *pc)
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
414 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
415 PyObject *obj = *pobj;
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
416
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
417 pc->real = pc->imag = 0.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
418 if (PyLong_Check(obj)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
419 pc->real = PyLong_AsDouble(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
420 if (pc->real == -1.0 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
421 *pobj = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
422 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
423 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
424 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
425 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
426 if (PyFloat_Check(obj)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
427 pc->real = PyFloat_AsDouble(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
428 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
429 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
430 Py_INCREF(Py_NotImplemented);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
431 *pobj = Py_NotImplemented;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
432 return -1;
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
433 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
434
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
435
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
436 static PyObject *
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
437 complex_add(PyObject *v, PyObject *w)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
439 Py_complex result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
440 Py_complex a, b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
441 TO_COMPLEX(v, a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
442 TO_COMPLEX(w, b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
443 PyFPE_START_PROTECT("complex_add", return 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
444 result = c_sum(a, b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
445 PyFPE_END_PROTECT(result)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
446 return PyComplex_FromCComplex(result);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
448
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
449 static PyObject *
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
450 complex_sub(PyObject *v, PyObject *w)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
452 Py_complex result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
453 Py_complex a, b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
454 TO_COMPLEX(v, a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
455 TO_COMPLEX(w, b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
456 PyFPE_START_PROTECT("complex_sub", return 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
457 result = c_diff(a, b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
458 PyFPE_END_PROTECT(result)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
459 return PyComplex_FromCComplex(result);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
461
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
462 static PyObject *
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
463 complex_mul(PyObject *v, PyObject *w)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
465 Py_complex result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
466 Py_complex a, b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
467 TO_COMPLEX(v, a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
468 TO_COMPLEX(w, b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
469 PyFPE_START_PROTECT("complex_mul", return 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
470 result = c_prod(a, b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
471 PyFPE_END_PROTECT(result)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
472 return PyComplex_FromCComplex(result);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
474
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
475 static PyObject *
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
476 complex_div(PyObject *v, PyObject *w)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
478 Py_complex quot;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
479 Py_complex a, b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
480 TO_COMPLEX(v, a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
481 TO_COMPLEX(w, b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
482 PyFPE_START_PROTECT("complex_div", return 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
483 errno = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
484 quot = c_quot(a, b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
485 PyFPE_END_PROTECT(quot)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
486 if (errno == EDOM) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
487 PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
488 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
489 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
490 return PyComplex_FromCComplex(quot);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
492
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
493 static PyObject *
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
494 complex_remainder(PyObject *v, PyObject *w)
4275
cb841f1b022e Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents: 4025
diff changeset
495 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
496 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
497 "can't mod complex numbers.");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
498 return NULL;
4275
cb841f1b022e Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents: 4025
diff changeset
499 }
cb841f1b022e Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents: 4025
diff changeset
500
cb841f1b022e Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents: 4025
diff changeset
501
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
502 static PyObject *
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
503 complex_divmod(PyObject *v, PyObject *w)
4304
95c31931b76a Properly(?) implemented remainder and divmod (Tim Hochberg)
Guido van Rossum <guido@python.org>
parents: 4290
diff changeset
504 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
505 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
506 "can't take floor or mod of complex number.");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
507 return NULL;
4304
95c31931b76a Properly(?) implemented remainder and divmod (Tim Hochberg)
Guido van Rossum <guido@python.org>
parents: 4290
diff changeset
508 }
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
509
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
510 static PyObject *
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
511 complex_pow(PyObject *v, PyObject *w, PyObject *z)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
513 Py_complex p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
514 Py_complex exponent;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
515 long int_exponent;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
516 Py_complex a, b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
517 TO_COMPLEX(v, a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
518 TO_COMPLEX(w, b);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
519
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
520 if (z != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
521 PyErr_SetString(PyExc_ValueError, "complex modulo");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
522 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
523 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
524 PyFPE_START_PROTECT("complex_pow", return 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
525 errno = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
526 exponent = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
527 int_exponent = (long)exponent.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
528 if (exponent.imag == 0. && exponent.real == int_exponent)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
529 p = c_powi(a, int_exponent);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
530 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
531 p = c_pow(a, exponent);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
532
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
533 PyFPE_END_PROTECT(p)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
534 Py_ADJUST_ERANGE2(p.real, p.imag);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
535 if (errno == EDOM) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
536 PyErr_SetString(PyExc_ZeroDivisionError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
537 "0.0 to a negative or complex power");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
538 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
539 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
540 else if (errno == ERANGE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
541 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
542 "complex exponentiation");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
543 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
544 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
545 return PyComplex_FromCComplex(p);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
547
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
548 static PyObject *
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
549 complex_int_div(PyObject *v, PyObject *w)
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
550 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
551 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
552 "can't take floor of complex number.");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
553 return NULL;
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
554 }
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
555
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
556 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
557 complex_neg(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
558 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
559 Py_complex neg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
560 neg.real = -v->cval.real;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
561 neg.imag = -v->cval.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
562 return PyComplex_FromCComplex(neg);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
564
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
565 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
566 complex_pos(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
567 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
568 if (PyComplex_CheckExact(v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
569 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
570 return (PyObject *)v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
571 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
572 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
573 return PyComplex_FromCComplex(v->cval);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
574 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
575
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
576 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
577 complex_abs(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
578 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
579 double result;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
580
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
581 PyFPE_START_PROTECT("complex_abs", return 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
582 result = c_abs(v->cval);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
583 PyFPE_END_PROTECT(result)
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
584
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
585 if (errno == ERANGE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
586 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
587 "absolute value too large");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
588 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
589 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
590 return PyFloat_FromDouble(result);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
592
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 static int
40401
88133417dfd0 - patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents: 39607
diff changeset
594 complex_bool(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
595 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
596 return v->cval.real != 0.0 || v->cval.imag != 0.0;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
598
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
599 static PyObject *
15976
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
600 complex_richcompare(PyObject *v, PyObject *w, int op)
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
601 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
602 PyObject *res;
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
603 Py_complex i;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
604 int equal;
15976
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
605
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
606 if (op != Py_EQ && op != Py_NE) {
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
607 goto Unimplemented;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
608 }
20061
2caddb82ffea Do the same thing to complex that I did to str: the rich comparison
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
609
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
610 assert(PyComplex_Check(v));
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
611 TO_COMPLEX(v, i);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
612
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
613 if (PyLong_Check(w)) {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
614 /* Check for 0.0 imaginary part first to avoid the rich
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
615 * comparison when possible.
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
616 */
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
617 if (i.imag == 0.0) {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
618 PyObject *j, *sub_res;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
619 j = PyFloat_FromDouble(i.real);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
620 if (j == NULL)
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
621 return NULL;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
622
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
623 sub_res = PyObject_RichCompare(j, w, op);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
624 Py_DECREF(j);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
625 return sub_res;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
626 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
627 else {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
628 equal = 0;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
629 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
630 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
631 else if (PyFloat_Check(w)) {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
632 equal = (i.real == PyFloat_AsDouble(w) && i.imag == 0.0);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
633 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
634 else if (PyComplex_Check(w)) {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
635 Py_complex j;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
636
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
637 TO_COMPLEX(w, j);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
638 equal = (i.real == j.real && i.imag == j.imag);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
639 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
640 else {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
641 goto Unimplemented;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
642 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
643
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
644 if (equal == (op == Py_EQ))
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
645 res = Py_True;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
646 else
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
647 res = Py_False;
15976
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
648
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
649 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
650 return res;
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
651
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
652 Unimplemented:
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 69498
diff changeset
653 Py_RETURN_NOTIMPLEMENTED;
15976
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
654 }
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
655
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
656 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
657 complex_int(PyObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
659 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
660 "can't convert complex to int");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
661 return NULL;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
662 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
663
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
664 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
665 complex_float(PyObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
666 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
667 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
668 "can't convert complex to float");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
669 return NULL;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
670 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
671
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
672 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
673 complex_conjugate(PyObject *self)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
674 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
675 Py_complex c;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
676 c = ((PyComplexObject *)self)->cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
677 c.imag = -c.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
678 return PyComplex_FromCComplex(c);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
680
42414
8c165d20709f Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
681 PyDoc_STRVAR(complex_conjugate_doc,
8c165d20709f Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
682 "complex.conjugate() -> complex\n"
8c165d20709f Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
683 "\n"
85974
54213ef5bb19 #19068: use imperative mood in complex object docstrings. Patch by Marco Buttu.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 77223
diff changeset
684 "Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
42414
8c165d20709f Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
685
27521
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
686 static PyObject *
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
687 complex_getnewargs(PyComplexObject *v)
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
688 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
689 Py_complex c = v->cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
690 return Py_BuildValue("(dd)", c.real, c.imag);
27521
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
691 }
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
692
53632
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
693 PyDoc_STRVAR(complex__format__doc,
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
694 "complex.__format__() -> str\n"
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
695 "\n"
85974
54213ef5bb19 #19068: use imperative mood in complex object docstrings. Patch by Marco Buttu.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 77223
diff changeset
696 "Convert to a string according to format_spec.");
53632
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
697
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
698 static PyObject *
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
699 complex__format__(PyObject* self, PyObject* args)
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
700 {
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
701 PyObject *format_spec;
77223
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
702 _PyUnicodeWriter writer;
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
703 int ret;
53632
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
704
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
705 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
77223
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
706 return NULL;
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
707
83433
edf029fc9591 Close #17694: Add minimum length to _PyUnicodeWriter
Victor Stinner <victor.stinner@gmail.com>
parents: 80426
diff changeset
708 _PyUnicodeWriter_Init(&writer);
77223
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
709 ret = _PyComplex_FormatAdvancedWriter(
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
710 &writer,
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
711 self,
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
712 format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
713 if (ret == -1) {
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
714 _PyUnicodeWriter_Dealloc(&writer);
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
715 return NULL;
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
716 }
22b56b0b8619 Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
Victor Stinner <victor.stinner@gmail.com>
parents: 74578
diff changeset
717 return _PyUnicodeWriter_Finish(&writer);
53632
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
718 }
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
719
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
720 #if 0
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
721 static PyObject *
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
722 complex_is_finite(PyObject *self)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
723 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
724 Py_complex c;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
725 c = ((PyComplexObject *)self)->cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
726 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
727 Py_IS_FINITE(c.imag)));
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
728 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
729
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
730 PyDoc_STRVAR(complex_is_finite_doc,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
731 "complex.is_finite() -> bool\n"
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
732 "\n"
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
733 "Returns True if the real and the imaginary part is finite.");
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
734 #endif
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
735
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
736 static PyMethodDef complex_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
737 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
738 complex_conjugate_doc},
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
739 #if 0
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
740 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
741 complex_is_finite_doc},
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
742 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
743 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
744 {"__format__", (PyCFunction)complex__format__,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
745 METH_VARARGS, complex__format__doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
746 {NULL, NULL} /* sentinel */
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
747 };
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
748
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19974
diff changeset
749 static PyMemberDef complex_members[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
750 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
751 "the real part of a complex number"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
752 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
753 "the imaginary part of a complex number"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
754 {0},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
755 };
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
756
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
757 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
758 complex_subtype_from_string(PyTypeObject *type, PyObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
759 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
760 const char *s, *start;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
761 char *end;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
762 double x=0.0, y=0.0, z;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
763 int got_bracket=0;
66673
7b6af56ee74d Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66648
diff changeset
764 PyObject *s_buffer = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
765 Py_ssize_t len;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
766
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
767 if (PyUnicode_Check(v)) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
768 s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
769 if (s_buffer == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
770 return NULL;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
771 s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
66673
7b6af56ee74d Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66648
diff changeset
772 if (s == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
773 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
774 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
775 else if (PyObject_AsCharBuffer(v, &s, &len)) {
86992
a73c47c1d374 #17080: improve error message of float/complex when the wrong type is passed.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 85975
diff changeset
776 PyErr_Format(PyExc_TypeError,
a73c47c1d374 #17080: improve error message of float/complex when the wrong type is passed.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 85975
diff changeset
777 "complex() argument must be a string or a number, not '%.200s'",
a73c47c1d374 #17080: improve error message of float/complex when the wrong type is passed.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 85975
diff changeset
778 Py_TYPE(v)->tp_name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
779 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
780 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
781
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
782 /* position on first nonblank */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
783 start = s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
784 while (Py_ISSPACE(*s))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
785 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
786 if (*s == '(') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
787 /* Skip over possible bracket from repr(). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
788 got_bracket = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
789 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
790 while (Py_ISSPACE(*s))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
791 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
792 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
793
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
794 /* a valid complex string usually takes one of the three forms:
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
795
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
796 <float> - real part only
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
797 <float>j - imaginary part only
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
798 <float><signed-float>j - real and imaginary parts
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
799
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
800 where <float> represents any numeric string that's accepted by the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
801 float constructor (including 'nan', 'inf', 'infinity', etc.), and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
802 <signed-float> is any string of the form <float> whose first
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
803 character is '+' or '-'.
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
804
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
805 For backwards compatibility, the extra forms
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
806
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
807 <float><sign>j
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
808 <sign>j
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
809 j
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
810
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
811 are also accepted, though support for these forms may be removed from
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
812 a future version of Python.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
813 */
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
814
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
815 /* first look for forms starting with <float> */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
816 z = PyOS_string_to_double(s, &end, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
817 if (z == -1.0 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
818 if (PyErr_ExceptionMatches(PyExc_ValueError))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
819 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
820 else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
821 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
822 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
823 if (end != s) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
824 /* all 4 forms starting with <float> land here */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
825 s = end;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
826 if (*s == '+' || *s == '-') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
827 /* <float><signed-float>j | <float><sign>j */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
828 x = z;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
829 y = PyOS_string_to_double(s, &end, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
830 if (y == -1.0 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
831 if (PyErr_ExceptionMatches(PyExc_ValueError))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
832 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
833 else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
834 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
835 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
836 if (end != s)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
837 /* <float><signed-float>j */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
838 s = end;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
839 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
840 /* <float><sign>j */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
841 y = *s == '+' ? 1.0 : -1.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
842 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
843 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
844 if (!(*s == 'j' || *s == 'J'))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
845 goto parse_error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
846 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
847 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
848 else if (*s == 'j' || *s == 'J') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
849 /* <float>j */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
850 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
851 y = z;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
852 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
853 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
854 /* <float> */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
855 x = z;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
856 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
857 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
858 /* not starting with <float>; must be <sign>j or j */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
859 if (*s == '+' || *s == '-') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
860 /* <sign>j */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
861 y = *s == '+' ? 1.0 : -1.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
862 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
863 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
864 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
865 /* j */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
866 y = 1.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
867 if (!(*s == 'j' || *s == 'J'))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
868 goto parse_error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
869 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
870 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
871
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
872 /* trailing whitespace and closing bracket */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
873 while (Py_ISSPACE(*s))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
874 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
875 if (got_bracket) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
876 /* if there was an opening parenthesis, then the corresponding
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
877 closing parenthesis should be right here */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
878 if (*s != ')')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
879 goto parse_error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
880 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
881 while (Py_ISSPACE(*s))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
882 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
883 }
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
884
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
885 /* we should now be at the end of the string */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
886 if (s-start != len)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
887 goto parse_error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
888
66673
7b6af56ee74d Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66648
diff changeset
889 Py_XDECREF(s_buffer);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
890 return complex_subtype_from_doubles(type, x, y);
53332
330115137414 Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents: 53187
diff changeset
891
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
892 parse_error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
893 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
894 "complex() arg is a malformed string");
56770
5a8e81594f0f Make sure memory is freed on error in complex_subtype_from_string.
Mark Dickinson <dickinsm@gmail.com>
parents: 56769
diff changeset
895 error:
66673
7b6af56ee74d Issue #10557: Fixed error messages from float() and other numeric
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66648
diff changeset
896 Py_XDECREF(s_buffer);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
897 return NULL;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
898 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
899
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
900 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
901 complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
902 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
903 PyObject *r, *i, *tmp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
904 PyNumberMethods *nbr, *nbi = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
905 Py_complex cr, ci;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
906 int own_r = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
907 int cr_is_complex = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
908 int ci_is_complex = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
909 static char *kwlist[] = {"real", "imag", 0};
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
910
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
911 r = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
912 i = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
913 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
914 &r, &i))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
915 return NULL;
25064
81a36d2a2d13 complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents: 24898
diff changeset
916
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
917 /* Special-case for a single argument when type(arg) is complex. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
918 if (PyComplex_CheckExact(r) && i == NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
919 type == &PyComplex_Type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
920 /* Note that we can't know whether it's safe to return
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
921 a complex *subclass* instance as-is, hence the restriction
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
922 to exact complexes here. If either the input or the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
923 output is a complex subclass, it will be handled below
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
924 as a non-orthogonal vector. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
925 Py_INCREF(r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
926 return r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
927 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
928 if (PyUnicode_Check(r)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
929 if (i != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
930 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
931 "complex() can't take second arg"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
932 " if first is a string");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
933 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
934 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
935 return complex_subtype_from_string(type, r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
936 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
937 if (i != NULL && PyUnicode_Check(i)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
938 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
939 "complex() second arg can't be a string");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
940 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
941 }
19889
733314fcfdaa Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents: 19758
diff changeset
942
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
943 tmp = try_complex_special_method(r);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
944 if (tmp) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
945 r = tmp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
946 own_r = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
947 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
948 else if (PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
949 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
950 }
58143
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
951
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
952 nbr = r->ob_type->tp_as_number;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
953 if (i != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
954 nbi = i->ob_type->tp_as_number;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
955 if (nbr == NULL || nbr->nb_float == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
956 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
86992
a73c47c1d374 #17080: improve error message of float/complex when the wrong type is passed.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 85975
diff changeset
957 PyErr_Format(PyExc_TypeError,
a73c47c1d374 #17080: improve error message of float/complex when the wrong type is passed.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 85975
diff changeset
958 "complex() argument must be a string or a number, not '%.200s'",
a73c47c1d374 #17080: improve error message of float/complex when the wrong type is passed.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 85975
diff changeset
959 Py_TYPE(r)->tp_name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
960 if (own_r) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
961 Py_DECREF(r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
962 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
963 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
964 }
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40626
diff changeset
965
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
966 /* If we get this far, then the "real" and "imag" parts should
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
967 both be treated as numbers, and the constructor should return a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
968 complex number equal to (real + imag*1j).
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40626
diff changeset
969
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
970 Note that we do NOT assume the input to already be in canonical
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
971 form; the "real" and "imag" parts might themselves be complex
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
972 numbers, which slightly complicates the code below. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
973 if (PyComplex_Check(r)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
974 /* Note that if r is of a complex subtype, we're only
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
975 retaining its real & imag parts here, and the return
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
976 value is (properly) of the builtin complex type. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
977 cr = ((PyComplexObject*)r)->cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
978 cr_is_complex = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
979 if (own_r) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
980 Py_DECREF(r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
981 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
982 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
983 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
984 /* The "real" part really is entirely real, and contributes
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
985 nothing in the imaginary direction.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
986 Just treat it as a double. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
987 tmp = PyNumber_Float(r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
988 if (own_r) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
989 /* r was a newly created complex number, rather
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
990 than the original "real" argument. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
991 Py_DECREF(r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
992 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
993 if (tmp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
994 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
995 if (!PyFloat_Check(tmp)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
996 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
997 "float(r) didn't return a float");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
998 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
999 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1000 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1001 cr.real = PyFloat_AsDouble(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1002 cr.imag = 0.0; /* Shut up compiler warning */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1003 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1004 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1005 if (i == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1006 ci.real = 0.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1007 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1008 else if (PyComplex_Check(i)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1009 ci = ((PyComplexObject*)i)->cval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1010 ci_is_complex = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1011 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1012 /* The "imag" part really is entirely imaginary, and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1013 contributes nothing in the real direction.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1014 Just treat it as a double. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1015 tmp = (*nbi->nb_float)(i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1016 if (tmp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1017 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1018 ci.real = PyFloat_AsDouble(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1019 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1020 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1021 /* If the input was in canonical form, then the "real" and "imag"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1022 parts are real numbers, so that ci.imag and cr.imag are zero.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1023 We need this correction in case they were not real numbers. */
44045
530fb9852c50 Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43420
diff changeset
1024
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1025 if (ci_is_complex) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1026 cr.real -= ci.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1027 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1028 if (cr_is_complex) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1029 ci.real += cr.imag;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1030 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1031 return complex_subtype_from_doubles(type, cr.real, ci.real);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
1032 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
1033
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23820
diff changeset
1034 PyDoc_STRVAR(complex_doc,
19889
733314fcfdaa Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents: 19758
diff changeset
1035 "complex(real[, imag]) -> complex number\n"
733314fcfdaa Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents: 19758
diff changeset
1036 "\n"
733314fcfdaa Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents: 19758
diff changeset
1037 "Create a complex number from a real part and an optional imaginary part.\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23820
diff changeset
1038 "This is equivalent to (real + imag*1j) where imag defaults to 0.");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
1039
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
1040 static PyNumberMethods complex_as_number = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1041 (binaryfunc)complex_add, /* nb_add */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1042 (binaryfunc)complex_sub, /* nb_subtract */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1043 (binaryfunc)complex_mul, /* nb_multiply */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1044 (binaryfunc)complex_remainder, /* nb_remainder */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1045 (binaryfunc)complex_divmod, /* nb_divmod */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1046 (ternaryfunc)complex_pow, /* nb_power */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1047 (unaryfunc)complex_neg, /* nb_negative */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1048 (unaryfunc)complex_pos, /* nb_positive */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1049 (unaryfunc)complex_abs, /* nb_absolute */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1050 (inquiry)complex_bool, /* nb_bool */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1051 0, /* nb_invert */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1052 0, /* nb_lshift */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1053 0, /* nb_rshift */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1054 0, /* nb_and */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1055 0, /* nb_xor */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1056 0, /* nb_or */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1057 complex_int, /* nb_int */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1058 0, /* nb_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1059 complex_float, /* nb_float */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1060 0, /* nb_inplace_add */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1061 0, /* nb_inplace_subtract */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1062 0, /* nb_inplace_multiply*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1063 0, /* nb_inplace_remainder */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1064 0, /* nb_inplace_power */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1065 0, /* nb_inplace_lshift */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1066 0, /* nb_inplace_rshift */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1067 0, /* nb_inplace_and */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1068 0, /* nb_inplace_xor */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1069 0, /* nb_inplace_or */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1070 (binaryfunc)complex_int_div, /* nb_floor_divide */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1071 (binaryfunc)complex_div, /* nb_true_divide */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1072 0, /* nb_inplace_floor_divide */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1073 0, /* nb_inplace_true_divide */
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
1074 };
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
1075
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
1076 PyTypeObject PyComplex_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1077 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1078 "complex",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1079 sizeof(PyComplexObject),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1080 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1081 complex_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1082 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1083 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1084 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1085 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1086 (reprfunc)complex_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1087 &complex_as_number, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1088 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1089 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1090 (hashfunc)complex_hash, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1091 0, /* tp_call */
63750
eafe07d40eb7 Issue #9337: Make float.__str__ identical to float.__repr__.
Mark Dickinson <dickinsm@gmail.com>
parents: 61873
diff changeset
1092 (reprfunc)complex_repr, /* tp_str */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1093 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1094 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1095 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1096 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1097 complex_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1098 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1099 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1100 complex_richcompare, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1101 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1102 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1103 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1104 complex_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1105 complex_members, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1106 0, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1107 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1108 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1109 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1110 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1111 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1112 0, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1113 PyType_GenericAlloc, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1114 complex_new, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54225
diff changeset
1115 PyObject_Del, /* tp_free */
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
1116 };