• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* Complex object implementation */
3 
4 /* Borrows heavily from floatobject.c */
5 
6 /* Submitted by Jim Hugunin */
7 
8 #include "Python.h"
9 #include "structmember.h"         // PyMemberDef
10 
11 /*[clinic input]
12 class complex "PyComplexObject *" "&PyComplex_Type"
13 [clinic start generated code]*/
14 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=819e057d2d10f5ec]*/
15 
16 #include "clinic/complexobject.c.h"
17 
18 /* elementary operations on complex numbers */
19 
20 static Py_complex c_1 = {1., 0.};
21 
22 Py_complex
_Py_c_sum(Py_complex a,Py_complex b)23 _Py_c_sum(Py_complex a, Py_complex b)
24 {
25     Py_complex r;
26     r.real = a.real + b.real;
27     r.imag = a.imag + b.imag;
28     return r;
29 }
30 
31 Py_complex
_Py_c_diff(Py_complex a,Py_complex b)32 _Py_c_diff(Py_complex a, Py_complex b)
33 {
34     Py_complex r;
35     r.real = a.real - b.real;
36     r.imag = a.imag - b.imag;
37     return r;
38 }
39 
40 Py_complex
_Py_c_neg(Py_complex a)41 _Py_c_neg(Py_complex a)
42 {
43     Py_complex r;
44     r.real = -a.real;
45     r.imag = -a.imag;
46     return r;
47 }
48 
49 Py_complex
_Py_c_prod(Py_complex a,Py_complex b)50 _Py_c_prod(Py_complex a, Py_complex b)
51 {
52     Py_complex r;
53     r.real = a.real*b.real - a.imag*b.imag;
54     r.imag = a.real*b.imag + a.imag*b.real;
55     return r;
56 }
57 
58 /* Avoid bad optimization on Windows ARM64 until the compiler is fixed */
59 #ifdef _M_ARM64
60 #pragma optimize("", off)
61 #endif
62 Py_complex
_Py_c_quot(Py_complex a,Py_complex b)63 _Py_c_quot(Py_complex a, Py_complex b)
64 {
65     /******************************************************************
66     This was the original algorithm.  It's grossly prone to spurious
67     overflow and underflow errors.  It also merrily divides by 0 despite
68     checking for that(!).  The code still serves a doc purpose here, as
69     the algorithm following is a simple by-cases transformation of this
70     one:
71 
72     Py_complex r;
73     double d = b.real*b.real + b.imag*b.imag;
74     if (d == 0.)
75         errno = EDOM;
76     r.real = (a.real*b.real + a.imag*b.imag)/d;
77     r.imag = (a.imag*b.real - a.real*b.imag)/d;
78     return r;
79     ******************************************************************/
80 
81     /* This algorithm is better, and is pretty obvious:  first divide the
82      * numerators and denominator by whichever of {b.real, b.imag} has
83      * larger magnitude.  The earliest reference I found was to CACM
84      * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
85      * University).  As usual, though, we're still ignoring all IEEE
86      * endcases.
87      */
88      Py_complex r;      /* the result */
89      const double abs_breal = b.real < 0 ? -b.real : b.real;
90      const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
91 
92     if (abs_breal >= abs_bimag) {
93         /* divide tops and bottom by b.real */
94         if (abs_breal == 0.0) {
95             errno = EDOM;
96             r.real = r.imag = 0.0;
97         }
98         else {
99             const double ratio = b.imag / b.real;
100             const double denom = b.real + b.imag * ratio;
101             r.real = (a.real + a.imag * ratio) / denom;
102             r.imag = (a.imag - a.real * ratio) / denom;
103         }
104     }
105     else if (abs_bimag >= abs_breal) {
106         /* divide tops and bottom by b.imag */
107         const double ratio = b.real / b.imag;
108         const double denom = b.real * ratio + b.imag;
109         assert(b.imag != 0.0);
110         r.real = (a.real * ratio + a.imag) / denom;
111         r.imag = (a.imag * ratio - a.real) / denom;
112     }
113     else {
114         /* At least one of b.real or b.imag is a NaN */
115         r.real = r.imag = Py_NAN;
116     }
117     return r;
118 }
119 #ifdef _M_ARM64
120 #pragma optimize("", on)
121 #endif
122 
123 Py_complex
_Py_c_pow(Py_complex a,Py_complex b)124 _Py_c_pow(Py_complex a, Py_complex b)
125 {
126     Py_complex r;
127     double vabs,len,at,phase;
128     if (b.real == 0. && b.imag == 0.) {
129         r.real = 1.;
130         r.imag = 0.;
131     }
132     else if (a.real == 0. && a.imag == 0.) {
133         if (b.imag != 0. || b.real < 0.)
134             errno = EDOM;
135         r.real = 0.;
136         r.imag = 0.;
137     }
138     else {
139         vabs = hypot(a.real,a.imag);
140         len = pow(vabs,b.real);
141         at = atan2(a.imag, a.real);
142         phase = at*b.real;
143         if (b.imag != 0.0) {
144             len /= exp(at*b.imag);
145             phase += b.imag*log(vabs);
146         }
147         r.real = len*cos(phase);
148         r.imag = len*sin(phase);
149     }
150     return r;
151 }
152 
153 static Py_complex
c_powu(Py_complex x,long n)154 c_powu(Py_complex x, long n)
155 {
156     Py_complex r, p;
157     long mask = 1;
158     r = c_1;
159     p = x;
160     while (mask > 0 && n >= mask) {
161         if (n & mask)
162             r = _Py_c_prod(r,p);
163         mask <<= 1;
164         p = _Py_c_prod(p,p);
165     }
166     return r;
167 }
168 
169 static Py_complex
c_powi(Py_complex x,long n)170 c_powi(Py_complex x, long n)
171 {
172     Py_complex cn;
173 
174     if (n > 100 || n < -100) {
175         cn.real = (double) n;
176         cn.imag = 0.;
177         return _Py_c_pow(x,cn);
178     }
179     else if (n > 0)
180         return c_powu(x,n);
181     else
182         return _Py_c_quot(c_1, c_powu(x,-n));
183 
184 }
185 
186 double
_Py_c_abs(Py_complex z)187 _Py_c_abs(Py_complex z)
188 {
189     /* sets errno = ERANGE on overflow;  otherwise errno = 0 */
190     double result;
191 
192     if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
193         /* C99 rules: if either the real or the imaginary part is an
194            infinity, return infinity, even if the other part is a
195            NaN. */
196         if (Py_IS_INFINITY(z.real)) {
197             result = fabs(z.real);
198             errno = 0;
199             return result;
200         }
201         if (Py_IS_INFINITY(z.imag)) {
202             result = fabs(z.imag);
203             errno = 0;
204             return result;
205         }
206         /* either the real or imaginary part is a NaN,
207            and neither is infinite. Result should be NaN. */
208         return Py_NAN;
209     }
210     result = hypot(z.real, z.imag);
211     if (!Py_IS_FINITE(result))
212         errno = ERANGE;
213     else
214         errno = 0;
215     return result;
216 }
217 
218 static PyObject *
complex_subtype_from_c_complex(PyTypeObject * type,Py_complex cval)219 complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
220 {
221     PyObject *op;
222 
223     op = type->tp_alloc(type, 0);
224     if (op != NULL)
225         ((PyComplexObject *)op)->cval = cval;
226     return op;
227 }
228 
229 PyObject *
PyComplex_FromCComplex(Py_complex cval)230 PyComplex_FromCComplex(Py_complex cval)
231 {
232     PyComplexObject *op;
233 
234     /* Inline PyObject_New */
235     op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
236     if (op == NULL)
237         return PyErr_NoMemory();
238     (void)PyObject_INIT(op, &PyComplex_Type);
239     op->cval = cval;
240     return (PyObject *) op;
241 }
242 
243 static PyObject *
complex_subtype_from_doubles(PyTypeObject * type,double real,double imag)244 complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
245 {
246     Py_complex c;
247     c.real = real;
248     c.imag = imag;
249     return complex_subtype_from_c_complex(type, c);
250 }
251 
252 PyObject *
PyComplex_FromDoubles(double real,double imag)253 PyComplex_FromDoubles(double real, double imag)
254 {
255     Py_complex c;
256     c.real = real;
257     c.imag = imag;
258     return PyComplex_FromCComplex(c);
259 }
260 
261 double
PyComplex_RealAsDouble(PyObject * op)262 PyComplex_RealAsDouble(PyObject *op)
263 {
264     if (PyComplex_Check(op)) {
265         return ((PyComplexObject *)op)->cval.real;
266     }
267     else {
268         return PyFloat_AsDouble(op);
269     }
270 }
271 
272 double
PyComplex_ImagAsDouble(PyObject * op)273 PyComplex_ImagAsDouble(PyObject *op)
274 {
275     if (PyComplex_Check(op)) {
276         return ((PyComplexObject *)op)->cval.imag;
277     }
278     else {
279         return 0.0;
280     }
281 }
282 
283 static PyObject *
try_complex_special_method(PyObject * op)284 try_complex_special_method(PyObject *op)
285 {
286     PyObject *f;
287     _Py_IDENTIFIER(__complex__);
288 
289     f = _PyObject_LookupSpecial(op, &PyId___complex__);
290     if (f) {
291         PyObject *res = _PyObject_CallNoArg(f);
292         Py_DECREF(f);
293         if (!res || PyComplex_CheckExact(res)) {
294             return res;
295         }
296         if (!PyComplex_Check(res)) {
297             PyErr_Format(PyExc_TypeError,
298                 "__complex__ returned non-complex (type %.200s)",
299                 Py_TYPE(res)->tp_name);
300             Py_DECREF(res);
301             return NULL;
302         }
303         /* Issue #29894: warn if 'res' not of exact type complex. */
304         if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
305                 "__complex__ returned non-complex (type %.200s).  "
306                 "The ability to return an instance of a strict subclass of complex "
307                 "is deprecated, and may be removed in a future version of Python.",
308                 Py_TYPE(res)->tp_name)) {
309             Py_DECREF(res);
310             return NULL;
311         }
312         return res;
313     }
314     return NULL;
315 }
316 
317 Py_complex
PyComplex_AsCComplex(PyObject * op)318 PyComplex_AsCComplex(PyObject *op)
319 {
320     Py_complex cv;
321     PyObject *newop = NULL;
322 
323     assert(op);
324     /* If op is already of type PyComplex_Type, return its value */
325     if (PyComplex_Check(op)) {
326         return ((PyComplexObject *)op)->cval;
327     }
328     /* If not, use op's __complex__  method, if it exists */
329 
330     /* return -1 on failure */
331     cv.real = -1.;
332     cv.imag = 0.;
333 
334     newop = try_complex_special_method(op);
335 
336     if (newop) {
337         cv = ((PyComplexObject *)newop)->cval;
338         Py_DECREF(newop);
339         return cv;
340     }
341     else if (PyErr_Occurred()) {
342         return cv;
343     }
344     /* If neither of the above works, interpret op as a float giving the
345        real part of the result, and fill in the imaginary part as 0. */
346     else {
347         /* PyFloat_AsDouble will return -1 on failure */
348         cv.real = PyFloat_AsDouble(op);
349         return cv;
350     }
351 }
352 
353 static PyObject *
complex_repr(PyComplexObject * v)354 complex_repr(PyComplexObject *v)
355 {
356     int precision = 0;
357     char format_code = 'r';
358     PyObject *result = NULL;
359 
360     /* If these are non-NULL, they'll need to be freed. */
361     char *pre = NULL;
362     char *im = NULL;
363 
364     /* These do not need to be freed. re is either an alias
365        for pre or a pointer to a constant.  lead and tail
366        are pointers to constants. */
367     const char *re = NULL;
368     const char *lead = "";
369     const char *tail = "";
370 
371     if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
372         /* Real part is +0: just output the imaginary part and do not
373            include parens. */
374         re = "";
375         im = PyOS_double_to_string(v->cval.imag, format_code,
376                                    precision, 0, NULL);
377         if (!im) {
378             PyErr_NoMemory();
379             goto done;
380         }
381     } else {
382         /* Format imaginary part with sign, real part without. Include
383            parens in the result. */
384         pre = PyOS_double_to_string(v->cval.real, format_code,
385                                     precision, 0, NULL);
386         if (!pre) {
387             PyErr_NoMemory();
388             goto done;
389         }
390         re = pre;
391 
392         im = PyOS_double_to_string(v->cval.imag, format_code,
393                                    precision, Py_DTSF_SIGN, NULL);
394         if (!im) {
395             PyErr_NoMemory();
396             goto done;
397         }
398         lead = "(";
399         tail = ")";
400     }
401     result = PyUnicode_FromFormat("%s%s%sj%s", lead, re, im, tail);
402   done:
403     PyMem_Free(im);
404     PyMem_Free(pre);
405 
406     return result;
407 }
408 
409 static Py_hash_t
complex_hash(PyComplexObject * v)410 complex_hash(PyComplexObject *v)
411 {
412     Py_uhash_t hashreal, hashimag, combined;
413     hashreal = (Py_uhash_t)_Py_HashDouble(v->cval.real);
414     if (hashreal == (Py_uhash_t)-1)
415         return -1;
416     hashimag = (Py_uhash_t)_Py_HashDouble(v->cval.imag);
417     if (hashimag == (Py_uhash_t)-1)
418         return -1;
419     /* Note:  if the imaginary part is 0, hashimag is 0 now,
420      * so the following returns hashreal unchanged.  This is
421      * important because numbers of different types that
422      * compare equal must have the same hash value, so that
423      * hash(x + 0*j) must equal hash(x).
424      */
425     combined = hashreal + _PyHASH_IMAG * hashimag;
426     if (combined == (Py_uhash_t)-1)
427         combined = (Py_uhash_t)-2;
428     return (Py_hash_t)combined;
429 }
430 
431 /* This macro may return! */
432 #define TO_COMPLEX(obj, c) \
433     if (PyComplex_Check(obj)) \
434         c = ((PyComplexObject *)(obj))->cval; \
435     else if (to_complex(&(obj), &(c)) < 0) \
436         return (obj)
437 
438 static int
to_complex(PyObject ** pobj,Py_complex * pc)439 to_complex(PyObject **pobj, Py_complex *pc)
440 {
441     PyObject *obj = *pobj;
442 
443     pc->real = pc->imag = 0.0;
444     if (PyLong_Check(obj)) {
445         pc->real = PyLong_AsDouble(obj);
446         if (pc->real == -1.0 && PyErr_Occurred()) {
447             *pobj = NULL;
448             return -1;
449         }
450         return 0;
451     }
452     if (PyFloat_Check(obj)) {
453         pc->real = PyFloat_AsDouble(obj);
454         return 0;
455     }
456     Py_INCREF(Py_NotImplemented);
457     *pobj = Py_NotImplemented;
458     return -1;
459 }
460 
461 
462 static PyObject *
complex_add(PyObject * v,PyObject * w)463 complex_add(PyObject *v, PyObject *w)
464 {
465     Py_complex result;
466     Py_complex a, b;
467     TO_COMPLEX(v, a);
468     TO_COMPLEX(w, b);
469     result = _Py_c_sum(a, b);
470     return PyComplex_FromCComplex(result);
471 }
472 
473 static PyObject *
complex_sub(PyObject * v,PyObject * w)474 complex_sub(PyObject *v, PyObject *w)
475 {
476     Py_complex result;
477     Py_complex a, b;
478     TO_COMPLEX(v, a);
479     TO_COMPLEX(w, b);
480     result = _Py_c_diff(a, b);
481     return PyComplex_FromCComplex(result);
482 }
483 
484 static PyObject *
complex_mul(PyObject * v,PyObject * w)485 complex_mul(PyObject *v, PyObject *w)
486 {
487     Py_complex result;
488     Py_complex a, b;
489     TO_COMPLEX(v, a);
490     TO_COMPLEX(w, b);
491     result = _Py_c_prod(a, b);
492     return PyComplex_FromCComplex(result);
493 }
494 
495 static PyObject *
complex_div(PyObject * v,PyObject * w)496 complex_div(PyObject *v, PyObject *w)
497 {
498     Py_complex quot;
499     Py_complex a, b;
500     TO_COMPLEX(v, a);
501     TO_COMPLEX(w, b);
502     errno = 0;
503     quot = _Py_c_quot(a, b);
504     if (errno == EDOM) {
505         PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero");
506         return NULL;
507     }
508     return PyComplex_FromCComplex(quot);
509 }
510 
511 static PyObject *
complex_remainder(PyObject * v,PyObject * w)512 complex_remainder(PyObject *v, PyObject *w)
513 {
514     PyErr_SetString(PyExc_TypeError,
515                     "can't mod complex numbers.");
516     return NULL;
517 }
518 
519 
520 static PyObject *
complex_divmod(PyObject * v,PyObject * w)521 complex_divmod(PyObject *v, PyObject *w)
522 {
523     PyErr_SetString(PyExc_TypeError,
524                     "can't take floor or mod of complex number.");
525     return NULL;
526 }
527 
528 static PyObject *
complex_pow(PyObject * v,PyObject * w,PyObject * z)529 complex_pow(PyObject *v, PyObject *w, PyObject *z)
530 {
531     Py_complex p;
532     Py_complex exponent;
533     long int_exponent;
534     Py_complex a, b;
535     TO_COMPLEX(v, a);
536     TO_COMPLEX(w, b);
537 
538     if (z != Py_None) {
539         PyErr_SetString(PyExc_ValueError, "complex modulo");
540         return NULL;
541     }
542     errno = 0;
543     exponent = b;
544     int_exponent = (long)exponent.real;
545     if (exponent.imag == 0. && exponent.real == int_exponent)
546         p = c_powi(a, int_exponent);
547     else
548         p = _Py_c_pow(a, exponent);
549 
550     Py_ADJUST_ERANGE2(p.real, p.imag);
551     if (errno == EDOM) {
552         PyErr_SetString(PyExc_ZeroDivisionError,
553                         "0.0 to a negative or complex power");
554         return NULL;
555     }
556     else if (errno == ERANGE) {
557         PyErr_SetString(PyExc_OverflowError,
558                         "complex exponentiation");
559         return NULL;
560     }
561     return PyComplex_FromCComplex(p);
562 }
563 
564 static PyObject *
complex_int_div(PyObject * v,PyObject * w)565 complex_int_div(PyObject *v, PyObject *w)
566 {
567     PyErr_SetString(PyExc_TypeError,
568                     "can't take floor of complex number.");
569     return NULL;
570 }
571 
572 static PyObject *
complex_neg(PyComplexObject * v)573 complex_neg(PyComplexObject *v)
574 {
575     Py_complex neg;
576     neg.real = -v->cval.real;
577     neg.imag = -v->cval.imag;
578     return PyComplex_FromCComplex(neg);
579 }
580 
581 static PyObject *
complex_pos(PyComplexObject * v)582 complex_pos(PyComplexObject *v)
583 {
584     if (PyComplex_CheckExact(v)) {
585         Py_INCREF(v);
586         return (PyObject *)v;
587     }
588     else
589         return PyComplex_FromCComplex(v->cval);
590 }
591 
592 static PyObject *
complex_abs(PyComplexObject * v)593 complex_abs(PyComplexObject *v)
594 {
595     double result;
596 
597     result = _Py_c_abs(v->cval);
598 
599     if (errno == ERANGE) {
600         PyErr_SetString(PyExc_OverflowError,
601                         "absolute value too large");
602         return NULL;
603     }
604     return PyFloat_FromDouble(result);
605 }
606 
607 static int
complex_bool(PyComplexObject * v)608 complex_bool(PyComplexObject *v)
609 {
610     return v->cval.real != 0.0 || v->cval.imag != 0.0;
611 }
612 
613 static PyObject *
complex_richcompare(PyObject * v,PyObject * w,int op)614 complex_richcompare(PyObject *v, PyObject *w, int op)
615 {
616     PyObject *res;
617     Py_complex i;
618     int equal;
619 
620     if (op != Py_EQ && op != Py_NE) {
621         goto Unimplemented;
622     }
623 
624     assert(PyComplex_Check(v));
625     TO_COMPLEX(v, i);
626 
627     if (PyLong_Check(w)) {
628         /* Check for 0.0 imaginary part first to avoid the rich
629          * comparison when possible.
630          */
631         if (i.imag == 0.0) {
632             PyObject *j, *sub_res;
633             j = PyFloat_FromDouble(i.real);
634             if (j == NULL)
635                 return NULL;
636 
637             sub_res = PyObject_RichCompare(j, w, op);
638             Py_DECREF(j);
639             return sub_res;
640         }
641         else {
642             equal = 0;
643         }
644     }
645     else if (PyFloat_Check(w)) {
646         equal = (i.real == PyFloat_AsDouble(w) && i.imag == 0.0);
647     }
648     else if (PyComplex_Check(w)) {
649         Py_complex j;
650 
651         TO_COMPLEX(w, j);
652         equal = (i.real == j.real && i.imag == j.imag);
653     }
654     else {
655         goto Unimplemented;
656     }
657 
658     if (equal == (op == Py_EQ))
659          res = Py_True;
660     else
661          res = Py_False;
662 
663     Py_INCREF(res);
664     return res;
665 
666 Unimplemented:
667     Py_RETURN_NOTIMPLEMENTED;
668 }
669 
670 static PyObject *
complex_int(PyObject * v)671 complex_int(PyObject *v)
672 {
673     PyErr_SetString(PyExc_TypeError,
674                "can't convert complex to int");
675     return NULL;
676 }
677 
678 static PyObject *
complex_float(PyObject * v)679 complex_float(PyObject *v)
680 {
681     PyErr_SetString(PyExc_TypeError,
682                "can't convert complex to float");
683     return NULL;
684 }
685 
686 static PyObject *
complex_conjugate(PyObject * self,PyObject * Py_UNUSED (ignored))687 complex_conjugate(PyObject *self, PyObject *Py_UNUSED(ignored))
688 {
689     Py_complex c;
690     c = ((PyComplexObject *)self)->cval;
691     c.imag = -c.imag;
692     return PyComplex_FromCComplex(c);
693 }
694 
695 PyDoc_STRVAR(complex_conjugate_doc,
696 "complex.conjugate() -> complex\n"
697 "\n"
698 "Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
699 
700 static PyObject *
complex_getnewargs(PyComplexObject * v,PyObject * Py_UNUSED (ignored))701 complex_getnewargs(PyComplexObject *v, PyObject *Py_UNUSED(ignored))
702 {
703     Py_complex c = v->cval;
704     return Py_BuildValue("(dd)", c.real, c.imag);
705 }
706 
707 PyDoc_STRVAR(complex__format__doc,
708 "complex.__format__() -> str\n"
709 "\n"
710 "Convert to a string according to format_spec.");
711 
712 static PyObject *
complex__format__(PyObject * self,PyObject * args)713 complex__format__(PyObject* self, PyObject* args)
714 {
715     PyObject *format_spec;
716     _PyUnicodeWriter writer;
717     int ret;
718 
719     if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
720         return NULL;
721 
722     _PyUnicodeWriter_Init(&writer);
723     ret = _PyComplex_FormatAdvancedWriter(
724         &writer,
725         self,
726         format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
727     if (ret == -1) {
728         _PyUnicodeWriter_Dealloc(&writer);
729         return NULL;
730     }
731     return _PyUnicodeWriter_Finish(&writer);
732 }
733 
734 static PyMethodDef complex_methods[] = {
735     {"conjugate",       (PyCFunction)complex_conjugate, METH_NOARGS,
736      complex_conjugate_doc},
737     {"__getnewargs__",          (PyCFunction)complex_getnewargs,        METH_NOARGS},
738     {"__format__",          (PyCFunction)complex__format__,
739                                        METH_VARARGS, complex__format__doc},
740     {NULL,              NULL}           /* sentinel */
741 };
742 
743 static PyMemberDef complex_members[] = {
744     {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
745      "the real part of a complex number"},
746     {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
747      "the imaginary part of a complex number"},
748     {0},
749 };
750 
751 static PyObject *
complex_from_string_inner(const char * s,Py_ssize_t len,void * type)752 complex_from_string_inner(const char *s, Py_ssize_t len, void *type)
753 {
754     double x=0.0, y=0.0, z;
755     int got_bracket=0;
756     const char *start;
757     char *end;
758 
759     /* position on first nonblank */
760     start = s;
761     while (Py_ISSPACE(*s))
762         s++;
763     if (*s == '(') {
764         /* Skip over possible bracket from repr(). */
765         got_bracket = 1;
766         s++;
767         while (Py_ISSPACE(*s))
768             s++;
769     }
770 
771     /* a valid complex string usually takes one of the three forms:
772 
773          <float>                  - real part only
774          <float>j                 - imaginary part only
775          <float><signed-float>j   - real and imaginary parts
776 
777        where <float> represents any numeric string that's accepted by the
778        float constructor (including 'nan', 'inf', 'infinity', etc.), and
779        <signed-float> is any string of the form <float> whose first
780        character is '+' or '-'.
781 
782        For backwards compatibility, the extra forms
783 
784          <float><sign>j
785          <sign>j
786          j
787 
788        are also accepted, though support for these forms may be removed from
789        a future version of Python.
790     */
791 
792     /* first look for forms starting with <float> */
793     z = PyOS_string_to_double(s, &end, NULL);
794     if (z == -1.0 && PyErr_Occurred()) {
795         if (PyErr_ExceptionMatches(PyExc_ValueError))
796             PyErr_Clear();
797         else
798             return NULL;
799     }
800     if (end != s) {
801         /* all 4 forms starting with <float> land here */
802         s = end;
803         if (*s == '+' || *s == '-') {
804             /* <float><signed-float>j | <float><sign>j */
805             x = z;
806             y = PyOS_string_to_double(s, &end, NULL);
807             if (y == -1.0 && PyErr_Occurred()) {
808                 if (PyErr_ExceptionMatches(PyExc_ValueError))
809                     PyErr_Clear();
810                 else
811                     return NULL;
812             }
813             if (end != s)
814                 /* <float><signed-float>j */
815                 s = end;
816             else {
817                 /* <float><sign>j */
818                 y = *s == '+' ? 1.0 : -1.0;
819                 s++;
820             }
821             if (!(*s == 'j' || *s == 'J'))
822                 goto parse_error;
823             s++;
824         }
825         else if (*s == 'j' || *s == 'J') {
826             /* <float>j */
827             s++;
828             y = z;
829         }
830         else
831             /* <float> */
832             x = z;
833     }
834     else {
835         /* not starting with <float>; must be <sign>j or j */
836         if (*s == '+' || *s == '-') {
837             /* <sign>j */
838             y = *s == '+' ? 1.0 : -1.0;
839             s++;
840         }
841         else
842             /* j */
843             y = 1.0;
844         if (!(*s == 'j' || *s == 'J'))
845             goto parse_error;
846         s++;
847     }
848 
849     /* trailing whitespace and closing bracket */
850     while (Py_ISSPACE(*s))
851         s++;
852     if (got_bracket) {
853         /* if there was an opening parenthesis, then the corresponding
854            closing parenthesis should be right here */
855         if (*s != ')')
856             goto parse_error;
857         s++;
858         while (Py_ISSPACE(*s))
859             s++;
860     }
861 
862     /* we should now be at the end of the string */
863     if (s-start != len)
864         goto parse_error;
865 
866     return complex_subtype_from_doubles((PyTypeObject *)type, x, y);
867 
868   parse_error:
869     PyErr_SetString(PyExc_ValueError,
870                     "complex() arg is a malformed string");
871     return NULL;
872 }
873 
874 static PyObject *
complex_subtype_from_string(PyTypeObject * type,PyObject * v)875 complex_subtype_from_string(PyTypeObject *type, PyObject *v)
876 {
877     const char *s;
878     PyObject *s_buffer = NULL, *result = NULL;
879     Py_ssize_t len;
880 
881     if (PyUnicode_Check(v)) {
882         s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v);
883         if (s_buffer == NULL) {
884             return NULL;
885         }
886         assert(PyUnicode_IS_ASCII(s_buffer));
887         /* Simply get a pointer to existing ASCII characters. */
888         s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
889         assert(s != NULL);
890     }
891     else {
892         PyErr_Format(PyExc_TypeError,
893             "complex() argument must be a string or a number, not '%.200s'",
894             Py_TYPE(v)->tp_name);
895         return NULL;
896     }
897 
898     result = _Py_string_to_number_with_underscores(s, len, "complex", v, type,
899                                                    complex_from_string_inner);
900     Py_DECREF(s_buffer);
901     return result;
902 }
903 
904 /*[clinic input]
905 @classmethod
906 complex.__new__ as complex_new
907     real as r: object(c_default="_PyLong_Zero") = 0
908     imag as i: object(c_default="NULL") = 0
909 
910 Create a complex number from a real part and an optional imaginary part.
911 
912 This is equivalent to (real + imag*1j) where imag defaults to 0.
913 [clinic start generated code]*/
914 
915 static PyObject *
complex_new_impl(PyTypeObject * type,PyObject * r,PyObject * i)916 complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i)
917 /*[clinic end generated code: output=b6c7dd577b537dc1 input=6f6b0bedba29bcb5]*/
918 {
919     PyObject *tmp;
920     PyNumberMethods *nbr, *nbi = NULL;
921     Py_complex cr, ci;
922     int own_r = 0;
923     int cr_is_complex = 0;
924     int ci_is_complex = 0;
925 
926     /* Special-case for a single argument when type(arg) is complex. */
927     if (PyComplex_CheckExact(r) && i == NULL &&
928         type == &PyComplex_Type) {
929         /* Note that we can't know whether it's safe to return
930            a complex *subclass* instance as-is, hence the restriction
931            to exact complexes here.  If either the input or the
932            output is a complex subclass, it will be handled below
933            as a non-orthogonal vector.  */
934         Py_INCREF(r);
935         return r;
936     }
937     if (PyUnicode_Check(r)) {
938         if (i != NULL) {
939             PyErr_SetString(PyExc_TypeError,
940                             "complex() can't take second arg"
941                             " if first is a string");
942             return NULL;
943         }
944         return complex_subtype_from_string(type, r);
945     }
946     if (i != NULL && PyUnicode_Check(i)) {
947         PyErr_SetString(PyExc_TypeError,
948                         "complex() second arg can't be a string");
949         return NULL;
950     }
951 
952     tmp = try_complex_special_method(r);
953     if (tmp) {
954         r = tmp;
955         own_r = 1;
956     }
957     else if (PyErr_Occurred()) {
958         return NULL;
959     }
960 
961     nbr = Py_TYPE(r)->tp_as_number;
962     if (nbr == NULL || (nbr->nb_float == NULL && nbr->nb_index == NULL)) {
963         PyErr_Format(PyExc_TypeError,
964                      "complex() first argument must be a string or a number, "
965                      "not '%.200s'",
966                      Py_TYPE(r)->tp_name);
967         if (own_r) {
968             Py_DECREF(r);
969         }
970         return NULL;
971     }
972     if (i != NULL) {
973         nbi = Py_TYPE(i)->tp_as_number;
974         if (nbi == NULL || (nbi->nb_float == NULL && nbi->nb_index == NULL)) {
975             PyErr_Format(PyExc_TypeError,
976                          "complex() second argument must be a number, "
977                          "not '%.200s'",
978                          Py_TYPE(i)->tp_name);
979             if (own_r) {
980                 Py_DECREF(r);
981             }
982             return NULL;
983         }
984     }
985 
986     /* If we get this far, then the "real" and "imag" parts should
987        both be treated as numbers, and the constructor should return a
988        complex number equal to (real + imag*1j).
989 
990        Note that we do NOT assume the input to already be in canonical
991        form; the "real" and "imag" parts might themselves be complex
992        numbers, which slightly complicates the code below. */
993     if (PyComplex_Check(r)) {
994         /* Note that if r is of a complex subtype, we're only
995            retaining its real & imag parts here, and the return
996            value is (properly) of the builtin complex type. */
997         cr = ((PyComplexObject*)r)->cval;
998         cr_is_complex = 1;
999         if (own_r) {
1000             Py_DECREF(r);
1001         }
1002     }
1003     else {
1004         /* The "real" part really is entirely real, and contributes
1005            nothing in the imaginary direction.
1006            Just treat it as a double. */
1007         tmp = PyNumber_Float(r);
1008         if (own_r) {
1009             /* r was a newly created complex number, rather
1010                than the original "real" argument. */
1011             Py_DECREF(r);
1012         }
1013         if (tmp == NULL)
1014             return NULL;
1015         assert(PyFloat_Check(tmp));
1016         cr.real = PyFloat_AsDouble(tmp);
1017         cr.imag = 0.0;
1018         Py_DECREF(tmp);
1019     }
1020     if (i == NULL) {
1021         ci.real = cr.imag;
1022     }
1023     else if (PyComplex_Check(i)) {
1024         ci = ((PyComplexObject*)i)->cval;
1025         ci_is_complex = 1;
1026     } else {
1027         /* The "imag" part really is entirely imaginary, and
1028            contributes nothing in the real direction.
1029            Just treat it as a double. */
1030         tmp = PyNumber_Float(i);
1031         if (tmp == NULL)
1032             return NULL;
1033         ci.real = PyFloat_AsDouble(tmp);
1034         Py_DECREF(tmp);
1035     }
1036     /*  If the input was in canonical form, then the "real" and "imag"
1037         parts are real numbers, so that ci.imag and cr.imag are zero.
1038         We need this correction in case they were not real numbers. */
1039 
1040     if (ci_is_complex) {
1041         cr.real -= ci.imag;
1042     }
1043     if (cr_is_complex && i != NULL) {
1044         ci.real += cr.imag;
1045     }
1046     return complex_subtype_from_doubles(type, cr.real, ci.real);
1047 }
1048 
1049 static PyNumberMethods complex_as_number = {
1050     (binaryfunc)complex_add,                    /* nb_add */
1051     (binaryfunc)complex_sub,                    /* nb_subtract */
1052     (binaryfunc)complex_mul,                    /* nb_multiply */
1053     (binaryfunc)complex_remainder,              /* nb_remainder */
1054     (binaryfunc)complex_divmod,                 /* nb_divmod */
1055     (ternaryfunc)complex_pow,                   /* nb_power */
1056     (unaryfunc)complex_neg,                     /* nb_negative */
1057     (unaryfunc)complex_pos,                     /* nb_positive */
1058     (unaryfunc)complex_abs,                     /* nb_absolute */
1059     (inquiry)complex_bool,                      /* nb_bool */
1060     0,                                          /* nb_invert */
1061     0,                                          /* nb_lshift */
1062     0,                                          /* nb_rshift */
1063     0,                                          /* nb_and */
1064     0,                                          /* nb_xor */
1065     0,                                          /* nb_or */
1066     complex_int,                                /* nb_int */
1067     0,                                          /* nb_reserved */
1068     complex_float,                              /* nb_float */
1069     0,                                          /* nb_inplace_add */
1070     0,                                          /* nb_inplace_subtract */
1071     0,                                          /* nb_inplace_multiply*/
1072     0,                                          /* nb_inplace_remainder */
1073     0,                                          /* nb_inplace_power */
1074     0,                                          /* nb_inplace_lshift */
1075     0,                                          /* nb_inplace_rshift */
1076     0,                                          /* nb_inplace_and */
1077     0,                                          /* nb_inplace_xor */
1078     0,                                          /* nb_inplace_or */
1079     (binaryfunc)complex_int_div,                /* nb_floor_divide */
1080     (binaryfunc)complex_div,                    /* nb_true_divide */
1081     0,                                          /* nb_inplace_floor_divide */
1082     0,                                          /* nb_inplace_true_divide */
1083 };
1084 
1085 PyTypeObject PyComplex_Type = {
1086     PyVarObject_HEAD_INIT(&PyType_Type, 0)
1087     "complex",
1088     sizeof(PyComplexObject),
1089     0,
1090     0,                                          /* tp_dealloc */
1091     0,                                          /* tp_vectorcall_offset */
1092     0,                                          /* tp_getattr */
1093     0,                                          /* tp_setattr */
1094     0,                                          /* tp_as_async */
1095     (reprfunc)complex_repr,                     /* tp_repr */
1096     &complex_as_number,                         /* tp_as_number */
1097     0,                                          /* tp_as_sequence */
1098     0,                                          /* tp_as_mapping */
1099     (hashfunc)complex_hash,                     /* tp_hash */
1100     0,                                          /* tp_call */
1101     0,                                          /* tp_str */
1102     PyObject_GenericGetAttr,                    /* tp_getattro */
1103     0,                                          /* tp_setattro */
1104     0,                                          /* tp_as_buffer */
1105     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,   /* tp_flags */
1106     complex_new__doc__,                         /* tp_doc */
1107     0,                                          /* tp_traverse */
1108     0,                                          /* tp_clear */
1109     complex_richcompare,                        /* tp_richcompare */
1110     0,                                          /* tp_weaklistoffset */
1111     0,                                          /* tp_iter */
1112     0,                                          /* tp_iternext */
1113     complex_methods,                            /* tp_methods */
1114     complex_members,                            /* tp_members */
1115     0,                                          /* tp_getset */
1116     0,                                          /* tp_base */
1117     0,                                          /* tp_dict */
1118     0,                                          /* tp_descr_get */
1119     0,                                          /* tp_descr_set */
1120     0,                                          /* tp_dictoffset */
1121     0,                                          /* tp_init */
1122     PyType_GenericAlloc,                        /* tp_alloc */
1123     complex_new,                                /* tp_new */
1124     PyObject_Del,                               /* tp_free */
1125 };
1126