symbian-qemu-0.9.1-12/python-2.6.1/Objects/complexobject.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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"
       
    10 
       
    11 #ifdef HAVE_IEEEFP_H
       
    12 #include <ieeefp.h>
       
    13 #endif
       
    14 
       
    15 #ifndef WITHOUT_COMPLEX
       
    16 
       
    17 /* Precisions used by repr() and str(), respectively.
       
    18 
       
    19    The repr() precision (17 significant decimal digits) is the minimal number
       
    20    that is guaranteed to have enough precision so that if the number is read
       
    21    back in the exact same binary value is recreated.  This is true for IEEE
       
    22    floating point by design, and also happens to work for all other modern
       
    23    hardware.
       
    24 
       
    25    The str() precision is chosen so that in most cases, the rounding noise
       
    26    created by various operations is suppressed, while giving plenty of
       
    27    precision for practical use.
       
    28 */
       
    29 
       
    30 #define PREC_REPR	17
       
    31 #define PREC_STR	12
       
    32 
       
    33 /* elementary operations on complex numbers */
       
    34 
       
    35 static Py_complex c_1 = {1., 0.};
       
    36 
       
    37 Py_complex
       
    38 c_sum(Py_complex a, Py_complex b)
       
    39 {
       
    40 	Py_complex r;
       
    41 	r.real = a.real + b.real;
       
    42 	r.imag = a.imag + b.imag;
       
    43 	return r;
       
    44 }
       
    45 
       
    46 Py_complex
       
    47 c_diff(Py_complex a, Py_complex b)
       
    48 {
       
    49 	Py_complex r;
       
    50 	r.real = a.real - b.real;
       
    51 	r.imag = a.imag - b.imag;
       
    52 	return r;
       
    53 }
       
    54 
       
    55 Py_complex
       
    56 c_neg(Py_complex a)
       
    57 {
       
    58 	Py_complex r;
       
    59 	r.real = -a.real;
       
    60 	r.imag = -a.imag;
       
    61 	return r;
       
    62 }
       
    63 
       
    64 Py_complex
       
    65 c_prod(Py_complex a, Py_complex b)
       
    66 {
       
    67 	Py_complex r;
       
    68 	r.real = a.real*b.real - a.imag*b.imag;
       
    69 	r.imag = a.real*b.imag + a.imag*b.real;
       
    70 	return r;
       
    71 }
       
    72 
       
    73 Py_complex
       
    74 c_quot(Py_complex a, Py_complex b)
       
    75 {
       
    76 	/******************************************************************
       
    77 	This was the original algorithm.  It's grossly prone to spurious
       
    78 	overflow and underflow errors.  It also merrily divides by 0 despite
       
    79 	checking for that(!).  The code still serves a doc purpose here, as
       
    80 	the algorithm following is a simple by-cases transformation of this
       
    81 	one:
       
    82 
       
    83 	Py_complex r;
       
    84 	double d = b.real*b.real + b.imag*b.imag;
       
    85 	if (d == 0.)
       
    86 		errno = EDOM;
       
    87 	r.real = (a.real*b.real + a.imag*b.imag)/d;
       
    88 	r.imag = (a.imag*b.real - a.real*b.imag)/d;
       
    89 	return r;
       
    90 	******************************************************************/
       
    91 
       
    92 	/* This algorithm is better, and is pretty obvious:  first divide the
       
    93 	 * numerators and denominator by whichever of {b.real, b.imag} has
       
    94 	 * larger magnitude.  The earliest reference I found was to CACM
       
    95 	 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
       
    96 	 * University).  As usual, though, we're still ignoring all IEEE
       
    97 	 * endcases.
       
    98 	 */
       
    99 	 Py_complex r;	/* the result */
       
   100  	 const double abs_breal = b.real < 0 ? -b.real : b.real;
       
   101 	 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
       
   102 
       
   103 	 if (abs_breal >= abs_bimag) {
       
   104  		/* divide tops and bottom by b.real */
       
   105 	 	if (abs_breal == 0.0) {
       
   106 	 		errno = EDOM;
       
   107 	 		r.real = r.imag = 0.0;
       
   108 	 	}
       
   109 	 	else {
       
   110 	 		const double ratio = b.imag / b.real;
       
   111 	 		const double denom = b.real + b.imag * ratio;
       
   112 	 		r.real = (a.real + a.imag * ratio) / denom;
       
   113 	 		r.imag = (a.imag - a.real * ratio) / denom;
       
   114 	 	}
       
   115 	}
       
   116 	else {
       
   117 		/* divide tops and bottom by b.imag */
       
   118 		const double ratio = b.real / b.imag;
       
   119 		const double denom = b.real * ratio + b.imag;
       
   120 		assert(b.imag != 0.0);
       
   121 		r.real = (a.real * ratio + a.imag) / denom;
       
   122 		r.imag = (a.imag * ratio - a.real) / denom;
       
   123 	}
       
   124 	return r;
       
   125 }
       
   126 
       
   127 Py_complex
       
   128 c_pow(Py_complex a, Py_complex b)
       
   129 {
       
   130 	Py_complex r;
       
   131 	double vabs,len,at,phase;
       
   132 	if (b.real == 0. && b.imag == 0.) {
       
   133 		r.real = 1.;
       
   134 		r.imag = 0.;
       
   135 	}
       
   136 	else if (a.real == 0. && a.imag == 0.) {
       
   137 		if (b.imag != 0. || b.real < 0.)
       
   138 			errno = EDOM;
       
   139 		r.real = 0.;
       
   140 		r.imag = 0.;
       
   141 	}
       
   142 	else {
       
   143 		vabs = hypot(a.real,a.imag);
       
   144 		len = pow(vabs,b.real);
       
   145 		at = atan2(a.imag, a.real);
       
   146 		phase = at*b.real;
       
   147 		if (b.imag != 0.0) {
       
   148 			len /= exp(at*b.imag);
       
   149 			phase += b.imag*log(vabs);
       
   150 		}
       
   151 		r.real = len*cos(phase);
       
   152 		r.imag = len*sin(phase);
       
   153 	}
       
   154 	return r;
       
   155 }
       
   156 
       
   157 static Py_complex
       
   158 c_powu(Py_complex x, long n)
       
   159 {
       
   160 	Py_complex r, p;
       
   161 	long mask = 1;
       
   162 	r = c_1;
       
   163 	p = x;
       
   164 	while (mask > 0 && n >= mask) {
       
   165 		if (n & mask)
       
   166 			r = c_prod(r,p);
       
   167 		mask <<= 1;
       
   168 		p = c_prod(p,p);
       
   169 	}
       
   170 	return r;
       
   171 }
       
   172 
       
   173 static Py_complex
       
   174 c_powi(Py_complex x, long n)
       
   175 {
       
   176 	Py_complex cn;
       
   177 
       
   178 	if (n > 100 || n < -100) {
       
   179 		cn.real = (double) n;
       
   180 		cn.imag = 0.;
       
   181 		return c_pow(x,cn);
       
   182 	}
       
   183 	else if (n > 0)
       
   184 		return c_powu(x,n);
       
   185 	else
       
   186 		return c_quot(c_1,c_powu(x,-n));
       
   187 
       
   188 }
       
   189 
       
   190 double
       
   191 c_abs(Py_complex z)
       
   192 {
       
   193 	/* sets errno = ERANGE on overflow;  otherwise errno = 0 */
       
   194 	double result;
       
   195 
       
   196 	if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
       
   197 		/* C99 rules: if either the real or the imaginary part is an
       
   198 		   infinity, return infinity, even if the other part is a
       
   199 		   NaN. */
       
   200 		if (Py_IS_INFINITY(z.real)) {
       
   201 			result = fabs(z.real);
       
   202 			errno = 0;
       
   203 			return result;
       
   204 		}
       
   205 		if (Py_IS_INFINITY(z.imag)) {
       
   206 			result = fabs(z.imag);
       
   207 			errno = 0;
       
   208 			return result;
       
   209 		}
       
   210 		/* either the real or imaginary part is a NaN,
       
   211 		   and neither is infinite. Result should be NaN. */
       
   212 		return Py_NAN;
       
   213 	}
       
   214 	result = hypot(z.real, z.imag);
       
   215 	if (!Py_IS_FINITE(result))
       
   216 		errno = ERANGE;
       
   217 	else
       
   218 		errno = 0;
       
   219 	return result;
       
   220 }
       
   221 
       
   222 static PyObject *
       
   223 complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
       
   224 {
       
   225 	PyObject *op;
       
   226 
       
   227 	op = type->tp_alloc(type, 0);
       
   228 	if (op != NULL)
       
   229 		((PyComplexObject *)op)->cval = cval;
       
   230 	return op;
       
   231 }
       
   232 
       
   233 PyObject *
       
   234 PyComplex_FromCComplex(Py_complex cval)
       
   235 {
       
   236 	register PyComplexObject *op;
       
   237 
       
   238 	/* Inline PyObject_New */
       
   239 	op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
       
   240 	if (op == NULL)
       
   241 		return PyErr_NoMemory();
       
   242 	PyObject_INIT(op, &PyComplex_Type);
       
   243 	op->cval = cval;
       
   244 	return (PyObject *) op;
       
   245 }
       
   246 
       
   247 static PyObject *
       
   248 complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
       
   249 {
       
   250 	Py_complex c;
       
   251 	c.real = real;
       
   252 	c.imag = imag;
       
   253 	return complex_subtype_from_c_complex(type, c);
       
   254 }
       
   255 
       
   256 PyObject *
       
   257 PyComplex_FromDoubles(double real, double imag)
       
   258 {
       
   259 	Py_complex c;
       
   260 	c.real = real;
       
   261 	c.imag = imag;
       
   262 	return PyComplex_FromCComplex(c);
       
   263 }
       
   264 
       
   265 double
       
   266 PyComplex_RealAsDouble(PyObject *op)
       
   267 {
       
   268 	if (PyComplex_Check(op)) {
       
   269 		return ((PyComplexObject *)op)->cval.real;
       
   270 	}
       
   271 	else {
       
   272 		return PyFloat_AsDouble(op);
       
   273 	}
       
   274 }
       
   275 
       
   276 double
       
   277 PyComplex_ImagAsDouble(PyObject *op)
       
   278 {
       
   279 	if (PyComplex_Check(op)) {
       
   280 		return ((PyComplexObject *)op)->cval.imag;
       
   281 	}
       
   282 	else {
       
   283 		return 0.0;
       
   284 	}
       
   285 }
       
   286 
       
   287 Py_complex
       
   288 PyComplex_AsCComplex(PyObject *op)
       
   289 {
       
   290 	Py_complex cv;
       
   291 	PyObject *newop = NULL;
       
   292 	static PyObject *complex_str = NULL;
       
   293 
       
   294 	assert(op);
       
   295 	/* If op is already of type PyComplex_Type, return its value */
       
   296 	if (PyComplex_Check(op)) {
       
   297 		return ((PyComplexObject *)op)->cval;
       
   298 	}
       
   299 	/* If not, use op's __complex__  method, if it exists */
       
   300 
       
   301 	/* return -1 on failure */
       
   302 	cv.real = -1.;
       
   303 	cv.imag = 0.;
       
   304 
       
   305 	if (complex_str == NULL) {
       
   306 		if (!(complex_str = PyString_InternFromString("__complex__")))
       
   307 			return cv;
       
   308 	}
       
   309 	
       
   310 	if (PyInstance_Check(op)) {
       
   311 		/* this can go away in python 3000 */
       
   312 		if (PyObject_HasAttr(op, complex_str)) {
       
   313 			newop = PyObject_CallMethod(op, "__complex__", NULL);
       
   314 			if (!newop)
       
   315 				return cv;
       
   316 		}
       
   317 		/* else try __float__ */
       
   318 	} else {
       
   319 		PyObject *complexfunc;
       
   320 		complexfunc = _PyType_Lookup(op->ob_type, complex_str);
       
   321 		/* complexfunc is a borrowed reference */
       
   322 		if (complexfunc) {
       
   323 			newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
       
   324 			if (!newop)
       
   325 				return cv;
       
   326 		}
       
   327 	}
       
   328 
       
   329 	if (newop) {
       
   330 		if (!PyComplex_Check(newop)) {
       
   331 			PyErr_SetString(PyExc_TypeError,
       
   332 				"__complex__ should return a complex object");
       
   333 			Py_DECREF(newop);
       
   334 			return cv;
       
   335 		}
       
   336 		cv = ((PyComplexObject *)newop)->cval;
       
   337 		Py_DECREF(newop);
       
   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 void
       
   350 complex_dealloc(PyObject *op)
       
   351 {
       
   352 	op->ob_type->tp_free(op);
       
   353 }
       
   354 
       
   355 
       
   356 static void
       
   357 complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
       
   358 {
       
   359 	char format[32];
       
   360 	if (v->cval.real == 0.) {
       
   361 		if (!Py_IS_FINITE(v->cval.imag)) {
       
   362 			if (Py_IS_NAN(v->cval.imag))
       
   363 				strncpy(buf, "nan*j", 6);
       
   364 			else if (copysign(1, v->cval.imag) == 1)
       
   365 				strncpy(buf, "inf*j", 6);
       
   366 			else
       
   367 				strncpy(buf, "-inf*j", 7);
       
   368 		}
       
   369 		else {
       
   370 			PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
       
   371 			PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
       
   372 			strncat(buf, "j", 1);
       
   373 		}
       
   374 	} else {
       
   375 		char re[64], im[64];
       
   376 		/* Format imaginary part with sign, real part without */
       
   377 		if (!Py_IS_FINITE(v->cval.real)) {
       
   378 			if (Py_IS_NAN(v->cval.real))
       
   379 				strncpy(re, "nan", 4);
       
   380 			/* else if (copysign(1, v->cval.real) == 1) */
       
   381 			else if (v->cval.real > 0)
       
   382 				strncpy(re, "inf", 4);
       
   383 			else
       
   384 				strncpy(re, "-inf", 5);
       
   385 		}
       
   386 		else {
       
   387 			PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
       
   388 			PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
       
   389 		}
       
   390 		if (!Py_IS_FINITE(v->cval.imag)) {
       
   391 			if (Py_IS_NAN(v->cval.imag))
       
   392 				strncpy(im, "+nan*", 6);
       
   393 			/* else if (copysign(1, v->cval.imag) == 1) */
       
   394 			else if (v->cval.imag > 0)
       
   395 				strncpy(im, "+inf*", 6);
       
   396 			else
       
   397 				strncpy(im, "-inf*", 6);
       
   398 		}
       
   399 		else {
       
   400 			PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
       
   401 			PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
       
   402 		}
       
   403 		PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
       
   404 	}
       
   405 }
       
   406 
       
   407 static int
       
   408 complex_print(PyComplexObject *v, FILE *fp, int flags)
       
   409 {
       
   410 	char buf[100];
       
   411 	complex_to_buf(buf, sizeof(buf), v,
       
   412 		       (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
       
   413 	Py_BEGIN_ALLOW_THREADS
       
   414 	fputs(buf, fp);
       
   415 	Py_END_ALLOW_THREADS
       
   416 	return 0;
       
   417 }
       
   418 
       
   419 static PyObject *
       
   420 complex_repr(PyComplexObject *v)
       
   421 {
       
   422 	char buf[100];
       
   423 	complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
       
   424 	return PyString_FromString(buf);
       
   425 }
       
   426 
       
   427 static PyObject *
       
   428 complex_str(PyComplexObject *v)
       
   429 {
       
   430 	char buf[100];
       
   431 	complex_to_buf(buf, sizeof(buf), v, PREC_STR);
       
   432 	return PyString_FromString(buf);
       
   433 }
       
   434 
       
   435 static long
       
   436 complex_hash(PyComplexObject *v)
       
   437 {
       
   438 	long hashreal, hashimag, combined;
       
   439 	hashreal = _Py_HashDouble(v->cval.real);
       
   440 	if (hashreal == -1)
       
   441 		return -1;
       
   442 	hashimag = _Py_HashDouble(v->cval.imag);
       
   443 	if (hashimag == -1)
       
   444 		return -1;
       
   445 	/* Note:  if the imaginary part is 0, hashimag is 0 now,
       
   446 	 * so the following returns hashreal unchanged.  This is
       
   447 	 * important because numbers of different types that
       
   448 	 * compare equal must have the same hash value, so that
       
   449 	 * hash(x + 0*j) must equal hash(x).
       
   450 	 */
       
   451 	combined = hashreal + 1000003 * hashimag;
       
   452 	if (combined == -1)
       
   453 		combined = -2;
       
   454 	return combined;
       
   455 }
       
   456 
       
   457 /* This macro may return! */
       
   458 #define TO_COMPLEX(obj, c) \
       
   459 	if (PyComplex_Check(obj)) \
       
   460 		c = ((PyComplexObject *)(obj))->cval; \
       
   461 	else if (to_complex(&(obj), &(c)) < 0) \
       
   462 		return (obj)
       
   463 
       
   464 static int
       
   465 to_complex(PyObject **pobj, Py_complex *pc)
       
   466 {
       
   467     PyObject *obj = *pobj;
       
   468 
       
   469     pc->real = pc->imag = 0.0;
       
   470     if (PyInt_Check(obj)) {
       
   471         pc->real = PyInt_AS_LONG(obj);
       
   472         return 0;
       
   473     }
       
   474     if (PyLong_Check(obj)) {
       
   475         pc->real = PyLong_AsDouble(obj);
       
   476         if (pc->real == -1.0 && PyErr_Occurred()) {
       
   477             *pobj = NULL;
       
   478             return -1;
       
   479         }
       
   480         return 0;
       
   481     }
       
   482     if (PyFloat_Check(obj)) {
       
   483         pc->real = PyFloat_AsDouble(obj);
       
   484         return 0;
       
   485     }
       
   486     Py_INCREF(Py_NotImplemented);
       
   487     *pobj = Py_NotImplemented;
       
   488     return -1;
       
   489 }
       
   490 		
       
   491 
       
   492 static PyObject *
       
   493 complex_add(PyComplexObject *v, PyComplexObject *w)
       
   494 {
       
   495 	Py_complex result;
       
   496 	PyFPE_START_PROTECT("complex_add", return 0)
       
   497 	result = c_sum(v->cval,w->cval);
       
   498 	PyFPE_END_PROTECT(result)
       
   499 	return PyComplex_FromCComplex(result);
       
   500 }
       
   501 
       
   502 static PyObject *
       
   503 complex_sub(PyComplexObject *v, PyComplexObject *w)
       
   504 {
       
   505 	Py_complex result;
       
   506 	PyFPE_START_PROTECT("complex_sub", return 0)
       
   507 	result = c_diff(v->cval,w->cval);
       
   508 	PyFPE_END_PROTECT(result)
       
   509 	return PyComplex_FromCComplex(result);
       
   510 }
       
   511 
       
   512 static PyObject *
       
   513 complex_mul(PyComplexObject *v, PyComplexObject *w)
       
   514 {
       
   515 	Py_complex result;
       
   516 	PyFPE_START_PROTECT("complex_mul", return 0)
       
   517 	result = c_prod(v->cval,w->cval);
       
   518 	PyFPE_END_PROTECT(result)
       
   519 	return PyComplex_FromCComplex(result);
       
   520 }
       
   521 
       
   522 static PyObject *
       
   523 complex_div(PyComplexObject *v, PyComplexObject *w)
       
   524 {
       
   525 	Py_complex quot;
       
   526 
       
   527 	PyFPE_START_PROTECT("complex_div", return 0)
       
   528 	errno = 0;
       
   529 	quot = c_quot(v->cval,w->cval);
       
   530 	PyFPE_END_PROTECT(quot)
       
   531 	if (errno == EDOM) {
       
   532 		PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
       
   533 		return NULL;
       
   534 	}
       
   535 	return PyComplex_FromCComplex(quot);
       
   536 }
       
   537 
       
   538 static PyObject *
       
   539 complex_classic_div(PyComplexObject *v, PyComplexObject *w)
       
   540 {
       
   541 	Py_complex quot;
       
   542 
       
   543 	if (Py_DivisionWarningFlag >= 2 &&
       
   544 	    PyErr_Warn(PyExc_DeprecationWarning,
       
   545 		       "classic complex division") < 0)
       
   546 		return NULL;
       
   547 
       
   548 	PyFPE_START_PROTECT("complex_classic_div", return 0)
       
   549 	errno = 0;
       
   550 	quot = c_quot(v->cval,w->cval);
       
   551 	PyFPE_END_PROTECT(quot)
       
   552 	if (errno == EDOM) {
       
   553 		PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
       
   554 		return NULL;
       
   555 	}
       
   556 	return PyComplex_FromCComplex(quot);
       
   557 }
       
   558 
       
   559 static PyObject *
       
   560 complex_remainder(PyComplexObject *v, PyComplexObject *w)
       
   561 {
       
   562 	Py_complex div, mod;
       
   563 
       
   564 	if (PyErr_Warn(PyExc_DeprecationWarning,
       
   565 		       "complex divmod(), // and % are deprecated") < 0)
       
   566 		return NULL;
       
   567 
       
   568 	errno = 0;
       
   569 	div = c_quot(v->cval,w->cval); /* The raw divisor value. */
       
   570 	if (errno == EDOM) {
       
   571 		PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
       
   572 		return NULL;
       
   573 	}
       
   574 	div.real = floor(div.real); /* Use the floor of the real part. */
       
   575 	div.imag = 0.0;
       
   576 	mod = c_diff(v->cval, c_prod(w->cval, div));
       
   577 
       
   578 	return PyComplex_FromCComplex(mod);
       
   579 }
       
   580 
       
   581 
       
   582 static PyObject *
       
   583 complex_divmod(PyComplexObject *v, PyComplexObject *w)
       
   584 {
       
   585 	Py_complex div, mod;
       
   586 	PyObject *d, *m, *z;
       
   587 
       
   588 	if (PyErr_Warn(PyExc_DeprecationWarning,
       
   589 		       "complex divmod(), // and % are deprecated") < 0)
       
   590 		return NULL;
       
   591 
       
   592 	errno = 0;
       
   593 	div = c_quot(v->cval,w->cval); /* The raw divisor value. */
       
   594 	if (errno == EDOM) {
       
   595 		PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
       
   596 		return NULL;
       
   597 	}
       
   598 	div.real = floor(div.real); /* Use the floor of the real part. */
       
   599 	div.imag = 0.0;
       
   600 	mod = c_diff(v->cval, c_prod(w->cval, div));
       
   601 	d = PyComplex_FromCComplex(div);
       
   602 	m = PyComplex_FromCComplex(mod);
       
   603 	z = PyTuple_Pack(2, d, m);
       
   604 	Py_XDECREF(d);
       
   605 	Py_XDECREF(m);
       
   606 	return z;
       
   607 }
       
   608 
       
   609 static PyObject *
       
   610 complex_pow(PyObject *v, PyObject *w, PyObject *z)
       
   611 {
       
   612 	Py_complex p;
       
   613 	Py_complex exponent;
       
   614 	long int_exponent;
       
   615 	Py_complex a, b;
       
   616 	TO_COMPLEX(v, a);
       
   617 	TO_COMPLEX(w, b);
       
   618 
       
   619  	if (z!=Py_None) {
       
   620 		PyErr_SetString(PyExc_ValueError, "complex modulo");
       
   621 		return NULL;
       
   622 	}
       
   623 	PyFPE_START_PROTECT("complex_pow", return 0)
       
   624 	errno = 0;
       
   625 	exponent = b;
       
   626 	int_exponent = (long)exponent.real;
       
   627 	if (exponent.imag == 0. && exponent.real == int_exponent)
       
   628 		p = c_powi(a,int_exponent);
       
   629 	else
       
   630 		p = c_pow(a,exponent);
       
   631 
       
   632 	PyFPE_END_PROTECT(p)
       
   633 	Py_ADJUST_ERANGE2(p.real, p.imag);
       
   634 	if (errno == EDOM) {
       
   635 		PyErr_SetString(PyExc_ZeroDivisionError,
       
   636 				"0.0 to a negative or complex power");
       
   637 		return NULL;
       
   638 	}
       
   639 	else if (errno == ERANGE) {
       
   640 		PyErr_SetString(PyExc_OverflowError,
       
   641 				"complex exponentiation");
       
   642 		return NULL;
       
   643 	}
       
   644 	return PyComplex_FromCComplex(p);
       
   645 }
       
   646 
       
   647 static PyObject *
       
   648 complex_int_div(PyComplexObject *v, PyComplexObject *w)
       
   649 {
       
   650 	PyObject *t, *r;
       
   651 	
       
   652 	if (PyErr_Warn(PyExc_DeprecationWarning,
       
   653 		       "complex divmod(), // and % are deprecated") < 0)
       
   654 		return NULL;
       
   655 
       
   656 	t = complex_divmod(v, w);
       
   657 	if (t != NULL) {
       
   658 		r = PyTuple_GET_ITEM(t, 0);
       
   659 		Py_INCREF(r);
       
   660 		Py_DECREF(t);
       
   661 		return r;
       
   662 	}
       
   663 	return NULL;
       
   664 }
       
   665 
       
   666 static PyObject *
       
   667 complex_neg(PyComplexObject *v)
       
   668 {
       
   669 	Py_complex neg;
       
   670 	neg.real = -v->cval.real;
       
   671 	neg.imag = -v->cval.imag;
       
   672 	return PyComplex_FromCComplex(neg);
       
   673 }
       
   674 
       
   675 static PyObject *
       
   676 complex_pos(PyComplexObject *v)
       
   677 {
       
   678 	if (PyComplex_CheckExact(v)) {
       
   679 		Py_INCREF(v);
       
   680 		return (PyObject *)v;
       
   681 	}
       
   682 	else
       
   683 		return PyComplex_FromCComplex(v->cval);
       
   684 }
       
   685 
       
   686 static PyObject *
       
   687 complex_abs(PyComplexObject *v)
       
   688 {
       
   689 	double result;
       
   690 
       
   691 	PyFPE_START_PROTECT("complex_abs", return 0)
       
   692 	result = c_abs(v->cval);
       
   693 	PyFPE_END_PROTECT(result)
       
   694 
       
   695 	if (errno == ERANGE) {
       
   696 		PyErr_SetString(PyExc_OverflowError,
       
   697 				"absolute value too large");
       
   698 		return NULL;
       
   699 	}
       
   700 	return PyFloat_FromDouble(result);
       
   701 }
       
   702 
       
   703 static int
       
   704 complex_nonzero(PyComplexObject *v)
       
   705 {
       
   706 	return v->cval.real != 0.0 || v->cval.imag != 0.0;
       
   707 }
       
   708 
       
   709 static int
       
   710 complex_coerce(PyObject **pv, PyObject **pw)
       
   711 {
       
   712 	Py_complex cval;
       
   713 	cval.imag = 0.;
       
   714 	if (PyInt_Check(*pw)) {
       
   715 		cval.real = (double)PyInt_AsLong(*pw);
       
   716 		*pw = PyComplex_FromCComplex(cval);
       
   717 		Py_INCREF(*pv);
       
   718 		return 0;
       
   719 	}
       
   720 	else if (PyLong_Check(*pw)) {
       
   721 		cval.real = PyLong_AsDouble(*pw);
       
   722 		if (cval.real == -1.0 && PyErr_Occurred())
       
   723 			return -1;
       
   724 		*pw = PyComplex_FromCComplex(cval);
       
   725 		Py_INCREF(*pv);
       
   726 		return 0;
       
   727 	}
       
   728 	else if (PyFloat_Check(*pw)) {
       
   729 		cval.real = PyFloat_AsDouble(*pw);
       
   730 		*pw = PyComplex_FromCComplex(cval);
       
   731 		Py_INCREF(*pv);
       
   732 		return 0;
       
   733 	}
       
   734 	else if (PyComplex_Check(*pw)) {
       
   735 		Py_INCREF(*pv);
       
   736 		Py_INCREF(*pw);
       
   737 		return 0;
       
   738 	}
       
   739 	return 1; /* Can't do it */
       
   740 }
       
   741 
       
   742 static PyObject *
       
   743 complex_richcompare(PyObject *v, PyObject *w, int op)
       
   744 {
       
   745 	int c;
       
   746 	Py_complex i, j;
       
   747 	PyObject *res;
       
   748 
       
   749 	c = PyNumber_CoerceEx(&v, &w);
       
   750 	if (c < 0)
       
   751 		return NULL;
       
   752 	if (c > 0) {
       
   753 		Py_INCREF(Py_NotImplemented);
       
   754 		return Py_NotImplemented;
       
   755 	}
       
   756 	/* Make sure both arguments are complex. */
       
   757 	if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
       
   758 		Py_DECREF(v);
       
   759 		Py_DECREF(w);
       
   760 		Py_INCREF(Py_NotImplemented);
       
   761 		return Py_NotImplemented;
       
   762 	}
       
   763 
       
   764 	i = ((PyComplexObject *)v)->cval;
       
   765 	j = ((PyComplexObject *)w)->cval;
       
   766 	Py_DECREF(v);
       
   767 	Py_DECREF(w);
       
   768 
       
   769 	if (op != Py_EQ && op != Py_NE) {
       
   770 		PyErr_SetString(PyExc_TypeError,
       
   771 			"no ordering relation is defined for complex numbers");
       
   772 		return NULL;
       
   773 	}
       
   774 
       
   775 	if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
       
   776 		res = Py_True;
       
   777 	else
       
   778 		res = Py_False;
       
   779 
       
   780 	Py_INCREF(res);
       
   781 	return res;
       
   782 }
       
   783 
       
   784 static PyObject *
       
   785 complex_int(PyObject *v)
       
   786 {
       
   787 	PyErr_SetString(PyExc_TypeError,
       
   788 		   "can't convert complex to int; use int(abs(z))");
       
   789 	return NULL;
       
   790 }
       
   791 
       
   792 static PyObject *
       
   793 complex_long(PyObject *v)
       
   794 {
       
   795 	PyErr_SetString(PyExc_TypeError,
       
   796 		   "can't convert complex to long; use long(abs(z))");
       
   797 	return NULL;
       
   798 }
       
   799 
       
   800 static PyObject *
       
   801 complex_float(PyObject *v)
       
   802 {
       
   803 	PyErr_SetString(PyExc_TypeError,
       
   804 		   "can't convert complex to float; use abs(z)");
       
   805 	return NULL;
       
   806 }
       
   807 
       
   808 static PyObject *
       
   809 complex_conjugate(PyObject *self)
       
   810 {
       
   811 	Py_complex c;
       
   812 	c = ((PyComplexObject *)self)->cval;
       
   813 	c.imag = -c.imag;
       
   814 	return PyComplex_FromCComplex(c);
       
   815 }
       
   816 
       
   817 PyDoc_STRVAR(complex_conjugate_doc,
       
   818 "complex.conjugate() -> complex\n"
       
   819 "\n"
       
   820 "Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
       
   821 
       
   822 static PyObject *
       
   823 complex_getnewargs(PyComplexObject *v)
       
   824 {
       
   825 	Py_complex c = v->cval;
       
   826 	return Py_BuildValue("(dd)", c.real, c.imag);
       
   827 }
       
   828 
       
   829 #if 0
       
   830 static PyObject *
       
   831 complex_is_finite(PyObject *self)
       
   832 {
       
   833 	Py_complex c;
       
   834 	c = ((PyComplexObject *)self)->cval;
       
   835 	return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
       
   836 				      Py_IS_FINITE(c.imag)));
       
   837 }
       
   838 
       
   839 PyDoc_STRVAR(complex_is_finite_doc,
       
   840 "complex.is_finite() -> bool\n"
       
   841 "\n"
       
   842 "Returns True if the real and the imaginary part is finite.");
       
   843 #endif
       
   844 
       
   845 static PyMethodDef complex_methods[] = {
       
   846 	{"conjugate",	(PyCFunction)complex_conjugate,	METH_NOARGS,
       
   847 	 complex_conjugate_doc},
       
   848 #if 0
       
   849 	{"is_finite",	(PyCFunction)complex_is_finite,	METH_NOARGS,
       
   850 	 complex_is_finite_doc},
       
   851 #endif
       
   852 	{"__getnewargs__",	(PyCFunction)complex_getnewargs,	METH_NOARGS},
       
   853 	{NULL,		NULL}		/* sentinel */
       
   854 };
       
   855 
       
   856 static PyMemberDef complex_members[] = {
       
   857 	{"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
       
   858 	 "the real part of a complex number"},
       
   859 	{"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
       
   860 	 "the imaginary part of a complex number"},
       
   861 	{0},
       
   862 };
       
   863 
       
   864 static PyObject *
       
   865 complex_subtype_from_string(PyTypeObject *type, PyObject *v)
       
   866 {
       
   867 	const char *s, *start;
       
   868 	char *end;
       
   869 	double x=0.0, y=0.0, z;
       
   870 	int got_re=0, got_im=0, got_bracket=0, done=0;
       
   871 	int digit_or_dot;
       
   872 	int sw_error=0;
       
   873 	int sign;
       
   874 	char buffer[256]; /* For errors */
       
   875 #ifdef Py_USING_UNICODE
       
   876 	char s_buffer[256];
       
   877 #endif
       
   878 	Py_ssize_t len;
       
   879 
       
   880 	if (PyString_Check(v)) {
       
   881 		s = PyString_AS_STRING(v);
       
   882 		len = PyString_GET_SIZE(v);
       
   883 	}
       
   884 #ifdef Py_USING_UNICODE
       
   885 	else if (PyUnicode_Check(v)) {
       
   886 		if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
       
   887 			PyErr_SetString(PyExc_ValueError,
       
   888 				 "complex() literal too large to convert");
       
   889 			return NULL;
       
   890 		}
       
   891 		if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
       
   892 					    PyUnicode_GET_SIZE(v),
       
   893 					    s_buffer,
       
   894 					    NULL))
       
   895 			return NULL;
       
   896 		s = s_buffer;
       
   897 		len = strlen(s);
       
   898 	}
       
   899 #endif
       
   900 	else if (PyObject_AsCharBuffer(v, &s, &len)) {
       
   901 		PyErr_SetString(PyExc_TypeError,
       
   902 				"complex() arg is not a string");
       
   903 		return NULL;
       
   904 	}
       
   905 
       
   906 	/* position on first nonblank */
       
   907 	start = s;
       
   908 	while (*s && isspace(Py_CHARMASK(*s)))
       
   909 		s++;
       
   910 	if (s[0] == '\0') {
       
   911 		PyErr_SetString(PyExc_ValueError,
       
   912 				"complex() arg is an empty string");
       
   913 		return NULL;
       
   914 	}
       
   915 	if (s[0] == '(') {
       
   916 		/* Skip over possible bracket from repr(). */
       
   917 		got_bracket = 1;
       
   918 		s++;
       
   919 		while (*s && isspace(Py_CHARMASK(*s)))
       
   920 			s++;
       
   921 	}
       
   922 
       
   923 	z = -1.0;
       
   924 	sign = 1;
       
   925 	do {
       
   926 
       
   927 		switch (*s) {
       
   928 
       
   929 		case '\0':
       
   930 			if (s-start != len) {
       
   931 				PyErr_SetString(
       
   932 					PyExc_ValueError,
       
   933 					"complex() arg contains a null byte");
       
   934 				return NULL;
       
   935 			}
       
   936 			if(!done) sw_error=1;
       
   937 			break;
       
   938 
       
   939 		case ')':
       
   940 			if (!got_bracket || !(got_re || got_im)) {
       
   941 				sw_error=1;
       
   942 				break;
       
   943 			}
       
   944 			got_bracket=0;
       
   945 			done=1;
       
   946 			s++;
       
   947 			while (*s && isspace(Py_CHARMASK(*s)))
       
   948 				s++;
       
   949 			if (*s) sw_error=1;
       
   950 			break;
       
   951 
       
   952 		case '-':
       
   953 			sign = -1;
       
   954 				/* Fallthrough */
       
   955 		case '+':
       
   956 			if (done)  sw_error=1;
       
   957 			s++;
       
   958 			if  (  *s=='\0'||*s=='+'||*s=='-'||*s==')'||
       
   959 			       isspace(Py_CHARMASK(*s))  )  sw_error=1;
       
   960 			break;
       
   961 
       
   962 		case 'J':
       
   963 		case 'j':
       
   964 			if (got_im || done) {
       
   965 				sw_error = 1;
       
   966 				break;
       
   967 			}
       
   968 			if  (z<0.0) {
       
   969 				y=sign;
       
   970 			}
       
   971 			else{
       
   972 				y=sign*z;
       
   973 			}
       
   974 			got_im=1;
       
   975 			s++;
       
   976 			if  (*s!='+' && *s!='-' )
       
   977 				done=1;
       
   978 			break;
       
   979 
       
   980 		default:
       
   981 			if (isspace(Py_CHARMASK(*s))) {
       
   982 				while (*s && isspace(Py_CHARMASK(*s)))
       
   983 					s++;
       
   984 				if (*s && *s != ')')
       
   985 					sw_error=1;
       
   986 				else
       
   987 					done = 1;
       
   988 				break;
       
   989 			}
       
   990 			digit_or_dot =
       
   991 				(*s=='.' || isdigit(Py_CHARMASK(*s)));
       
   992 			if  (done||!digit_or_dot) {
       
   993 				sw_error=1;
       
   994 				break;
       
   995 			}
       
   996 			errno = 0;
       
   997 			PyFPE_START_PROTECT("strtod", return 0)
       
   998 				z = PyOS_ascii_strtod(s, &end) ;
       
   999 			PyFPE_END_PROTECT(z)
       
  1000 				if (errno != 0) {
       
  1001 					PyOS_snprintf(buffer, sizeof(buffer),
       
  1002 					  "float() out of range: %.150s", s);
       
  1003 					PyErr_SetString(
       
  1004 						PyExc_ValueError,
       
  1005 						buffer);
       
  1006 					return NULL;
       
  1007 				}
       
  1008 			s=end;
       
  1009 			if  (*s=='J' || *s=='j') {
       
  1010 
       
  1011 				break;
       
  1012 			}
       
  1013 			if  (got_re) {
       
  1014 				sw_error=1;
       
  1015 				break;
       
  1016 			}
       
  1017 
       
  1018 				/* accept a real part */
       
  1019 			x=sign*z;
       
  1020 			got_re=1;
       
  1021 			if  (got_im)  done=1;
       
  1022 			z = -1.0;
       
  1023 			sign = 1;
       
  1024 			break;
       
  1025 
       
  1026 		}  /* end of switch  */
       
  1027 
       
  1028 	} while (s - start < len && !sw_error);
       
  1029 
       
  1030 	if (sw_error || got_bracket) {
       
  1031 		PyErr_SetString(PyExc_ValueError,
       
  1032 				"complex() arg is a malformed string");
       
  1033 		return NULL;
       
  1034 	}
       
  1035 
       
  1036 	return complex_subtype_from_doubles(type, x, y);
       
  1037 }
       
  1038 
       
  1039 static PyObject *
       
  1040 complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
       
  1041 {
       
  1042 	PyObject *r, *i, *tmp, *f;
       
  1043 	PyNumberMethods *nbr, *nbi = NULL;
       
  1044 	Py_complex cr, ci;
       
  1045 	int own_r = 0;
       
  1046 	int cr_is_complex = 0;
       
  1047 	int ci_is_complex = 0;
       
  1048 	static PyObject *complexstr;
       
  1049 	static char *kwlist[] = {"real", "imag", 0};
       
  1050 
       
  1051 	r = Py_False;
       
  1052 	i = NULL;
       
  1053 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
       
  1054 					 &r, &i))
       
  1055 		return NULL;
       
  1056 
       
  1057 	/* Special-case for a single argument when type(arg) is complex. */
       
  1058 	if (PyComplex_CheckExact(r) && i == NULL &&
       
  1059 	    type == &PyComplex_Type) {
       
  1060 		/* Note that we can't know whether it's safe to return
       
  1061 		   a complex *subclass* instance as-is, hence the restriction
       
  1062 		   to exact complexes here.  If either the input or the
       
  1063 		   output is a complex subclass, it will be handled below 
       
  1064 		   as a non-orthogonal vector.  */
       
  1065 		Py_INCREF(r);
       
  1066 		return r;
       
  1067 	}
       
  1068 	if (PyString_Check(r) || PyUnicode_Check(r)) {
       
  1069 		if (i != NULL) {
       
  1070 			PyErr_SetString(PyExc_TypeError,
       
  1071 					"complex() can't take second arg"
       
  1072 					" if first is a string");
       
  1073 			return NULL;
       
  1074 		}
       
  1075 		return complex_subtype_from_string(type, r);
       
  1076 	}
       
  1077 	if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
       
  1078 		PyErr_SetString(PyExc_TypeError,
       
  1079 				"complex() second arg can't be a string");
       
  1080 		return NULL;
       
  1081 	}
       
  1082 
       
  1083 	/* XXX Hack to support classes with __complex__ method */
       
  1084 	if (complexstr == NULL) {
       
  1085 		complexstr = PyString_InternFromString("__complex__");
       
  1086 		if (complexstr == NULL)
       
  1087 			return NULL;
       
  1088 	}
       
  1089 	f = PyObject_GetAttr(r, complexstr);
       
  1090 	if (f == NULL)
       
  1091 		PyErr_Clear();
       
  1092 	else {
       
  1093 		PyObject *args = PyTuple_New(0);
       
  1094 		if (args == NULL)
       
  1095 			return NULL;
       
  1096 		r = PyEval_CallObject(f, args);
       
  1097 		Py_DECREF(args);
       
  1098 		Py_DECREF(f);
       
  1099 		if (r == NULL)
       
  1100 			return NULL;
       
  1101 		own_r = 1;
       
  1102 	}
       
  1103 	nbr = r->ob_type->tp_as_number;
       
  1104 	if (i != NULL)
       
  1105 		nbi = i->ob_type->tp_as_number;
       
  1106 	if (nbr == NULL || nbr->nb_float == NULL ||
       
  1107 	    ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
       
  1108 		PyErr_SetString(PyExc_TypeError,
       
  1109 			   "complex() argument must be a string or a number");
       
  1110 		if (own_r) {
       
  1111 			Py_DECREF(r);
       
  1112 		}
       
  1113 		return NULL;
       
  1114 	}
       
  1115 
       
  1116 	/* If we get this far, then the "real" and "imag" parts should
       
  1117 	   both be treated as numbers, and the constructor should return a
       
  1118 	   complex number equal to (real + imag*1j).
       
  1119 
       
  1120  	   Note that we do NOT assume the input to already be in canonical
       
  1121 	   form; the "real" and "imag" parts might themselves be complex
       
  1122 	   numbers, which slightly complicates the code below. */
       
  1123 	if (PyComplex_Check(r)) {
       
  1124 		/* Note that if r is of a complex subtype, we're only
       
  1125 		   retaining its real & imag parts here, and the return
       
  1126 		   value is (properly) of the builtin complex type. */
       
  1127 		cr = ((PyComplexObject*)r)->cval;
       
  1128 		cr_is_complex = 1;
       
  1129 		if (own_r) {
       
  1130 			Py_DECREF(r);
       
  1131 		}
       
  1132 	}
       
  1133 	else {
       
  1134 		/* The "real" part really is entirely real, and contributes
       
  1135 		   nothing in the imaginary direction.  
       
  1136 		   Just treat it as a double. */
       
  1137 		tmp = PyNumber_Float(r);
       
  1138 		if (own_r) {
       
  1139 			/* r was a newly created complex number, rather
       
  1140 			   than the original "real" argument. */
       
  1141 			Py_DECREF(r);
       
  1142 		}
       
  1143 		if (tmp == NULL)
       
  1144 			return NULL;
       
  1145 		if (!PyFloat_Check(tmp)) {
       
  1146 			PyErr_SetString(PyExc_TypeError,
       
  1147 					"float(r) didn't return a float");
       
  1148 			Py_DECREF(tmp);
       
  1149 			return NULL;
       
  1150 		}
       
  1151 		cr.real = PyFloat_AsDouble(tmp);
       
  1152 		cr.imag = 0.0; /* Shut up compiler warning */
       
  1153 		Py_DECREF(tmp);
       
  1154 	}
       
  1155 	if (i == NULL) {
       
  1156 		ci.real = 0.0;
       
  1157 	}
       
  1158 	else if (PyComplex_Check(i)) {
       
  1159 		ci = ((PyComplexObject*)i)->cval;
       
  1160 		ci_is_complex = 1;
       
  1161 	} else {
       
  1162 		/* The "imag" part really is entirely imaginary, and
       
  1163 		   contributes nothing in the real direction.
       
  1164 		   Just treat it as a double. */
       
  1165 		tmp = (*nbi->nb_float)(i);
       
  1166 		if (tmp == NULL)
       
  1167 			return NULL;
       
  1168 		ci.real = PyFloat_AsDouble(tmp);
       
  1169 		Py_DECREF(tmp);
       
  1170 	}
       
  1171 	/*  If the input was in canonical form, then the "real" and "imag"
       
  1172 	    parts are real numbers, so that ci.imag and cr.imag are zero.
       
  1173 	    We need this correction in case they were not real numbers. */
       
  1174 
       
  1175 	if (ci_is_complex) {
       
  1176 		cr.real -= ci.imag;
       
  1177 	}
       
  1178 	if (cr_is_complex) {
       
  1179 		ci.real += cr.imag;
       
  1180 	}
       
  1181 	return complex_subtype_from_doubles(type, cr.real, ci.real);
       
  1182 }
       
  1183 
       
  1184 PyDoc_STRVAR(complex_doc,
       
  1185 "complex(real[, imag]) -> complex number\n"
       
  1186 "\n"
       
  1187 "Create a complex number from a real part and an optional imaginary part.\n"
       
  1188 "This is equivalent to (real + imag*1j) where imag defaults to 0.");
       
  1189 
       
  1190 static PyNumberMethods complex_as_number = {
       
  1191 	(binaryfunc)complex_add, 		/* nb_add */
       
  1192 	(binaryfunc)complex_sub, 		/* nb_subtract */
       
  1193 	(binaryfunc)complex_mul, 		/* nb_multiply */
       
  1194 	(binaryfunc)complex_classic_div,	/* nb_divide */
       
  1195 	(binaryfunc)complex_remainder,		/* nb_remainder */
       
  1196 	(binaryfunc)complex_divmod,		/* nb_divmod */
       
  1197 	(ternaryfunc)complex_pow,		/* nb_power */
       
  1198 	(unaryfunc)complex_neg,			/* nb_negative */
       
  1199 	(unaryfunc)complex_pos,			/* nb_positive */
       
  1200 	(unaryfunc)complex_abs,			/* nb_absolute */
       
  1201 	(inquiry)complex_nonzero,		/* nb_nonzero */
       
  1202 	0,					/* nb_invert */
       
  1203 	0,					/* nb_lshift */
       
  1204 	0,					/* nb_rshift */
       
  1205 	0,					/* nb_and */
       
  1206 	0,					/* nb_xor */
       
  1207 	0,					/* nb_or */
       
  1208 	complex_coerce,				/* nb_coerce */
       
  1209 	complex_int,				/* nb_int */
       
  1210 	complex_long,				/* nb_long */
       
  1211 	complex_float,				/* nb_float */
       
  1212 	0,					/* nb_oct */
       
  1213 	0,					/* nb_hex */
       
  1214 	0,					/* nb_inplace_add */
       
  1215 	0,					/* nb_inplace_subtract */
       
  1216 	0,					/* nb_inplace_multiply*/
       
  1217 	0,					/* nb_inplace_divide */
       
  1218 	0,					/* nb_inplace_remainder */
       
  1219 	0, 					/* nb_inplace_power */
       
  1220 	0,					/* nb_inplace_lshift */
       
  1221 	0,					/* nb_inplace_rshift */
       
  1222 	0,					/* nb_inplace_and */
       
  1223 	0,					/* nb_inplace_xor */
       
  1224 	0,					/* nb_inplace_or */
       
  1225 	(binaryfunc)complex_int_div,		/* nb_floor_divide */
       
  1226 	(binaryfunc)complex_div,		/* nb_true_divide */
       
  1227 	0,					/* nb_inplace_floor_divide */
       
  1228 	0,					/* nb_inplace_true_divide */
       
  1229 };
       
  1230 
       
  1231 PyTypeObject PyComplex_Type = {
       
  1232 	PyVarObject_HEAD_INIT(&PyType_Type, 0)
       
  1233 	"complex",
       
  1234 	sizeof(PyComplexObject),
       
  1235 	0,
       
  1236 	complex_dealloc,			/* tp_dealloc */
       
  1237 	(printfunc)complex_print,		/* tp_print */
       
  1238 	0,					/* tp_getattr */
       
  1239 	0,					/* tp_setattr */
       
  1240 	0,					/* tp_compare */
       
  1241 	(reprfunc)complex_repr,			/* tp_repr */
       
  1242 	&complex_as_number,    			/* tp_as_number */
       
  1243 	0,					/* tp_as_sequence */
       
  1244 	0,					/* tp_as_mapping */
       
  1245 	(hashfunc)complex_hash, 		/* tp_hash */
       
  1246 	0,					/* tp_call */
       
  1247 	(reprfunc)complex_str,			/* tp_str */
       
  1248 	PyObject_GenericGetAttr,		/* tp_getattro */
       
  1249 	0,					/* tp_setattro */
       
  1250 	0,					/* tp_as_buffer */
       
  1251 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
       
  1252 	complex_doc,				/* tp_doc */
       
  1253 	0,					/* tp_traverse */
       
  1254 	0,					/* tp_clear */
       
  1255 	complex_richcompare,			/* tp_richcompare */
       
  1256 	0,					/* tp_weaklistoffset */
       
  1257 	0,					/* tp_iter */
       
  1258 	0,					/* tp_iternext */
       
  1259 	complex_methods,			/* tp_methods */
       
  1260 	complex_members,			/* tp_members */
       
  1261 	0,					/* tp_getset */
       
  1262 	0,					/* tp_base */
       
  1263 	0,					/* tp_dict */
       
  1264 	0,					/* tp_descr_get */
       
  1265 	0,					/* tp_descr_set */
       
  1266 	0,					/* tp_dictoffset */
       
  1267 	0,					/* tp_init */
       
  1268 	PyType_GenericAlloc,			/* tp_alloc */
       
  1269 	complex_new,				/* tp_new */
       
  1270 	PyObject_Del,           		/* tp_free */
       
  1271 };
       
  1272 
       
  1273 #endif