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