Coverage Report

Created: 2022-07-08 09:39

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