symbian-qemu-0.9.1-12/python-2.6.1/Modules/arraymodule.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /* Array object implementation */
       
     2 
       
     3 /* An array is a uniform list -- all items have the same type.
       
     4    The item type is restricted to simple C types like int or float */
       
     5 
       
     6 #define PY_SSIZE_T_CLEAN
       
     7 #include "Python.h"
       
     8 #include "structmember.h"
       
     9 
       
    10 #ifdef STDC_HEADERS
       
    11 #include <stddef.h>
       
    12 #else /* !STDC_HEADERS */
       
    13 #ifdef HAVE_SYS_TYPES_H
       
    14 #include <sys/types.h>		/* For size_t */
       
    15 #endif /* HAVE_SYS_TYPES_H */
       
    16 #endif /* !STDC_HEADERS */
       
    17 
       
    18 struct arrayobject; /* Forward */
       
    19 
       
    20 /* All possible arraydescr values are defined in the vector "descriptors"
       
    21  * below.  That's defined later because the appropriate get and set
       
    22  * functions aren't visible yet.
       
    23  */
       
    24 struct arraydescr {
       
    25 	int typecode;
       
    26 	int itemsize;
       
    27 	PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
       
    28 	int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
       
    29 };
       
    30 
       
    31 typedef struct arrayobject {
       
    32 	PyObject_VAR_HEAD
       
    33 	char *ob_item;
       
    34 	Py_ssize_t allocated;
       
    35 	struct arraydescr *ob_descr;
       
    36 	PyObject *weakreflist; /* List of weak references */
       
    37 } arrayobject;
       
    38 
       
    39 static PyTypeObject Arraytype;
       
    40 
       
    41 #define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
       
    42 #define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
       
    43 
       
    44 static int
       
    45 array_resize(arrayobject *self, Py_ssize_t newsize)
       
    46 {
       
    47 	char *items;
       
    48 	size_t _new_size;
       
    49 
       
    50 	/* Bypass realloc() when a previous overallocation is large enough
       
    51 	   to accommodate the newsize.  If the newsize is 16 smaller than the
       
    52 	   current size, then proceed with the realloc() to shrink the list.
       
    53 	*/
       
    54 
       
    55 	if (self->allocated >= newsize &&
       
    56 	    Py_SIZE(self) < newsize + 16 &&
       
    57 	    self->ob_item != NULL) {
       
    58 		Py_SIZE(self) = newsize;
       
    59 		return 0;
       
    60 	}
       
    61 
       
    62 	/* This over-allocates proportional to the array size, making room
       
    63 	 * for additional growth.  The over-allocation is mild, but is
       
    64 	 * enough to give linear-time amortized behavior over a long
       
    65 	 * sequence of appends() in the presence of a poorly-performing
       
    66 	 * system realloc().
       
    67 	 * The growth pattern is:  0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
       
    68 	 * Note, the pattern starts out the same as for lists but then
       
    69 	 * grows at a smaller rate so that larger arrays only overallocate
       
    70 	 * by about 1/16th -- this is done because arrays are presumed to be more
       
    71 	 * memory critical.
       
    72 	 */
       
    73 
       
    74 	_new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
       
    75 	items = self->ob_item;
       
    76 	/* XXX The following multiplication and division does not optimize away 
       
    77 	   like it does for lists since the size is not known at compile time */
       
    78 	if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
       
    79 		PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
       
    80 	else
       
    81 		items = NULL;
       
    82 	if (items == NULL) {
       
    83 		PyErr_NoMemory();
       
    84 		return -1;
       
    85 	}
       
    86 	self->ob_item = items;
       
    87 	Py_SIZE(self) = newsize;
       
    88 	self->allocated = _new_size;
       
    89 	return 0;
       
    90 }
       
    91 
       
    92 /****************************************************************************
       
    93 Get and Set functions for each type.
       
    94 A Get function takes an arrayobject* and an integer index, returning the
       
    95 array value at that index wrapped in an appropriate PyObject*.
       
    96 A Set function takes an arrayobject, integer index, and PyObject*; sets
       
    97 the array value at that index to the raw C data extracted from the PyObject*,
       
    98 and returns 0 if successful, else nonzero on failure (PyObject* not of an
       
    99 appropriate type or value).
       
   100 Note that the basic Get and Set functions do NOT check that the index is
       
   101 in bounds; that's the responsibility of the caller.
       
   102 ****************************************************************************/
       
   103 
       
   104 static PyObject *
       
   105 c_getitem(arrayobject *ap, Py_ssize_t i)
       
   106 {
       
   107 	return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
       
   108 }
       
   109 
       
   110 static int
       
   111 c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   112 {
       
   113 	char x;
       
   114 	if (!PyArg_Parse(v, "c;array item must be char", &x))
       
   115 		return -1;
       
   116 	if (i >= 0)
       
   117 		((char *)ap->ob_item)[i] = x;
       
   118 	return 0;
       
   119 }
       
   120 
       
   121 static PyObject *
       
   122 b_getitem(arrayobject *ap, Py_ssize_t i)
       
   123 {
       
   124 	long x = ((char *)ap->ob_item)[i];
       
   125 	if (x >= 128)
       
   126 		x -= 256;
       
   127 	return PyInt_FromLong(x);
       
   128 }
       
   129 
       
   130 static int
       
   131 b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   132 {
       
   133 	short x;
       
   134 	/* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
       
   135 	   must use the next size up that is signed ('h') and manually do
       
   136 	   the overflow checking */
       
   137 	if (!PyArg_Parse(v, "h;array item must be integer", &x))
       
   138 		return -1;
       
   139 	else if (x < -128) {
       
   140 		PyErr_SetString(PyExc_OverflowError,
       
   141 			"signed char is less than minimum");
       
   142 		return -1;
       
   143 	}
       
   144 	else if (x > 127) {
       
   145 		PyErr_SetString(PyExc_OverflowError,
       
   146 			"signed char is greater than maximum");
       
   147 		return -1;
       
   148 	}
       
   149 	if (i >= 0)
       
   150 		((char *)ap->ob_item)[i] = (char)x;
       
   151 	return 0;
       
   152 }
       
   153 
       
   154 static PyObject *
       
   155 BB_getitem(arrayobject *ap, Py_ssize_t i)
       
   156 {
       
   157 	long x = ((unsigned char *)ap->ob_item)[i];
       
   158 	return PyInt_FromLong(x);
       
   159 }
       
   160 
       
   161 static int
       
   162 BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   163 {
       
   164 	unsigned char x;
       
   165 	/* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
       
   166 	if (!PyArg_Parse(v, "b;array item must be integer", &x))
       
   167 		return -1;
       
   168 	if (i >= 0)
       
   169 		((char *)ap->ob_item)[i] = x;
       
   170 	return 0;
       
   171 }
       
   172 
       
   173 #ifdef Py_USING_UNICODE
       
   174 static PyObject *
       
   175 u_getitem(arrayobject *ap, Py_ssize_t i)
       
   176 {
       
   177 	return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
       
   178 }
       
   179 
       
   180 static int
       
   181 u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   182 {
       
   183 	Py_UNICODE *p;
       
   184 	Py_ssize_t len;
       
   185 
       
   186 	if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
       
   187 		return -1;
       
   188 	if (len != 1) {
       
   189 		PyErr_SetString(PyExc_TypeError,
       
   190 				"array item must be unicode character");
       
   191 		return -1;
       
   192 	}
       
   193 	if (i >= 0)
       
   194 		((Py_UNICODE *)ap->ob_item)[i] = p[0];
       
   195 	return 0;
       
   196 }
       
   197 #endif
       
   198 
       
   199 static PyObject *
       
   200 h_getitem(arrayobject *ap, Py_ssize_t i)
       
   201 {
       
   202 	return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
       
   203 }
       
   204 
       
   205 static int
       
   206 h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   207 {
       
   208 	short x;
       
   209 	/* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
       
   210 	if (!PyArg_Parse(v, "h;array item must be integer", &x))
       
   211 		return -1;
       
   212 	if (i >= 0)
       
   213 		     ((short *)ap->ob_item)[i] = x;
       
   214 	return 0;
       
   215 }
       
   216 
       
   217 static PyObject *
       
   218 HH_getitem(arrayobject *ap, Py_ssize_t i)
       
   219 {
       
   220 	return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
       
   221 }
       
   222 
       
   223 static int
       
   224 HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   225 {
       
   226 	int x;
       
   227 	/* PyArg_Parse's 'h' formatter is for a signed short, therefore
       
   228 	   must use the next size up and manually do the overflow checking */
       
   229 	if (!PyArg_Parse(v, "i;array item must be integer", &x))
       
   230 		return -1;
       
   231 	else if (x < 0) {
       
   232 		PyErr_SetString(PyExc_OverflowError,
       
   233 			"unsigned short is less than minimum");
       
   234 		return -1;
       
   235 	}
       
   236 	else if (x > USHRT_MAX) {
       
   237 		PyErr_SetString(PyExc_OverflowError,
       
   238 			"unsigned short is greater than maximum");
       
   239 		return -1;
       
   240 	}
       
   241 	if (i >= 0)
       
   242 		((short *)ap->ob_item)[i] = (short)x;
       
   243 	return 0;
       
   244 }
       
   245 
       
   246 static PyObject *
       
   247 i_getitem(arrayobject *ap, Py_ssize_t i)
       
   248 {
       
   249 	return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
       
   250 }
       
   251 
       
   252 static int
       
   253 i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   254 {
       
   255 	int x;
       
   256 	/* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
       
   257 	if (!PyArg_Parse(v, "i;array item must be integer", &x))
       
   258 		return -1;
       
   259 	if (i >= 0)
       
   260 		     ((int *)ap->ob_item)[i] = x;
       
   261 	return 0;
       
   262 }
       
   263 
       
   264 static PyObject *
       
   265 II_getitem(arrayobject *ap, Py_ssize_t i)
       
   266 {
       
   267 	return PyLong_FromUnsignedLong(
       
   268 		(unsigned long) ((unsigned int *)ap->ob_item)[i]);
       
   269 }
       
   270 
       
   271 static int
       
   272 II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   273 {
       
   274 	unsigned long x;
       
   275 	if (PyLong_Check(v)) {
       
   276 		x = PyLong_AsUnsignedLong(v);
       
   277 		if (x == (unsigned long) -1 && PyErr_Occurred())
       
   278 			return -1;
       
   279 	}
       
   280 	else {
       
   281 		long y;
       
   282 		if (!PyArg_Parse(v, "l;array item must be integer", &y))
       
   283 			return -1;
       
   284 		if (y < 0) {
       
   285 			PyErr_SetString(PyExc_OverflowError,
       
   286 				"unsigned int is less than minimum");
       
   287 			return -1;
       
   288 		}
       
   289 		x = (unsigned long)y;
       
   290 
       
   291 	}
       
   292 	if (x > UINT_MAX) {
       
   293 		PyErr_SetString(PyExc_OverflowError,
       
   294 			"unsigned int is greater than maximum");
       
   295 		return -1;
       
   296 	}
       
   297 
       
   298 	if (i >= 0)
       
   299 		((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
       
   300 	return 0;
       
   301 }
       
   302 
       
   303 static PyObject *
       
   304 l_getitem(arrayobject *ap, Py_ssize_t i)
       
   305 {
       
   306 	return PyInt_FromLong(((long *)ap->ob_item)[i]);
       
   307 }
       
   308 
       
   309 static int
       
   310 l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   311 {
       
   312 	long x;
       
   313 	if (!PyArg_Parse(v, "l;array item must be integer", &x))
       
   314 		return -1;
       
   315 	if (i >= 0)
       
   316 		     ((long *)ap->ob_item)[i] = x;
       
   317 	return 0;
       
   318 }
       
   319 
       
   320 static PyObject *
       
   321 LL_getitem(arrayobject *ap, Py_ssize_t i)
       
   322 {
       
   323 	return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
       
   324 }
       
   325 
       
   326 static int
       
   327 LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   328 {
       
   329 	unsigned long x;
       
   330 	if (PyLong_Check(v)) {
       
   331 		x = PyLong_AsUnsignedLong(v);
       
   332 		if (x == (unsigned long) -1 && PyErr_Occurred())
       
   333 			return -1;
       
   334 	}
       
   335 	else {
       
   336 		long y;
       
   337 		if (!PyArg_Parse(v, "l;array item must be integer", &y))
       
   338 			return -1;
       
   339 		if (y < 0) {
       
   340 			PyErr_SetString(PyExc_OverflowError,
       
   341 				"unsigned long is less than minimum");
       
   342 			return -1;
       
   343 		}
       
   344 		x = (unsigned long)y;
       
   345 
       
   346 	}
       
   347 	if (x > ULONG_MAX) {
       
   348 		PyErr_SetString(PyExc_OverflowError,
       
   349 			"unsigned long is greater than maximum");
       
   350 		return -1;
       
   351 	}
       
   352 
       
   353 	if (i >= 0)
       
   354 		((unsigned long *)ap->ob_item)[i] = x;
       
   355 	return 0;
       
   356 }
       
   357 
       
   358 static PyObject *
       
   359 f_getitem(arrayobject *ap, Py_ssize_t i)
       
   360 {
       
   361 	return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
       
   362 }
       
   363 
       
   364 static int
       
   365 f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   366 {
       
   367 	float x;
       
   368 	if (!PyArg_Parse(v, "f;array item must be float", &x))
       
   369 		return -1;
       
   370 	if (i >= 0)
       
   371 		     ((float *)ap->ob_item)[i] = x;
       
   372 	return 0;
       
   373 }
       
   374 
       
   375 static PyObject *
       
   376 d_getitem(arrayobject *ap, Py_ssize_t i)
       
   377 {
       
   378 	return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
       
   379 }
       
   380 
       
   381 static int
       
   382 d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
       
   383 {
       
   384 	double x;
       
   385 	if (!PyArg_Parse(v, "d;array item must be float", &x))
       
   386 		return -1;
       
   387 	if (i >= 0)
       
   388 		     ((double *)ap->ob_item)[i] = x;
       
   389 	return 0;
       
   390 }
       
   391 
       
   392 /* Description of types */
       
   393 static struct arraydescr descriptors[] = {
       
   394 	{'c', sizeof(char), c_getitem, c_setitem},
       
   395 	{'b', sizeof(char), b_getitem, b_setitem},
       
   396 	{'B', sizeof(char), BB_getitem, BB_setitem},
       
   397 #ifdef Py_USING_UNICODE
       
   398 	{'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
       
   399 #endif
       
   400 	{'h', sizeof(short), h_getitem, h_setitem},
       
   401 	{'H', sizeof(short), HH_getitem, HH_setitem},
       
   402 	{'i', sizeof(int), i_getitem, i_setitem},
       
   403 	{'I', sizeof(int), II_getitem, II_setitem},
       
   404 	{'l', sizeof(long), l_getitem, l_setitem},
       
   405 	{'L', sizeof(long), LL_getitem, LL_setitem},
       
   406 	{'f', sizeof(float), f_getitem, f_setitem},
       
   407 	{'d', sizeof(double), d_getitem, d_setitem},
       
   408 	{'\0', 0, 0, 0} /* Sentinel */
       
   409 };
       
   410 
       
   411 /****************************************************************************
       
   412 Implementations of array object methods.
       
   413 ****************************************************************************/
       
   414 
       
   415 static PyObject *
       
   416 newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
       
   417 {
       
   418 	arrayobject *op;
       
   419 	size_t nbytes;
       
   420 
       
   421 	if (size < 0) {
       
   422 		PyErr_BadInternalCall();
       
   423 		return NULL;
       
   424 	}
       
   425 
       
   426 	nbytes = size * descr->itemsize;
       
   427 	/* Check for overflow */
       
   428 	if (nbytes / descr->itemsize != (size_t)size) {
       
   429 		return PyErr_NoMemory();
       
   430 	}
       
   431 	op = (arrayobject *) type->tp_alloc(type, 0);
       
   432 	if (op == NULL) {
       
   433 		return NULL;
       
   434 	}
       
   435 	op->ob_descr = descr;
       
   436 	op->allocated = size;
       
   437 	op->weakreflist = NULL;
       
   438 	Py_SIZE(op) = size;
       
   439 	if (size <= 0) {
       
   440 		op->ob_item = NULL;
       
   441 	}
       
   442 	else {
       
   443 		op->ob_item = PyMem_NEW(char, nbytes);
       
   444 		if (op->ob_item == NULL) {
       
   445 			Py_DECREF(op);
       
   446 			return PyErr_NoMemory();
       
   447 		}
       
   448 	}
       
   449 	return (PyObject *) op;
       
   450 }
       
   451 
       
   452 static PyObject *
       
   453 getarrayitem(PyObject *op, Py_ssize_t i)
       
   454 {
       
   455 	register arrayobject *ap;
       
   456 	assert(array_Check(op));
       
   457 	ap = (arrayobject *)op;
       
   458 	assert(i>=0 && i<Py_SIZE(ap));
       
   459 	return (*ap->ob_descr->getitem)(ap, i);
       
   460 }
       
   461 
       
   462 static int
       
   463 ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
       
   464 {
       
   465 	char *items;
       
   466 	Py_ssize_t n = Py_SIZE(self);
       
   467 	if (v == NULL) {
       
   468 		PyErr_BadInternalCall();
       
   469 		return -1;
       
   470 	}
       
   471 	if ((*self->ob_descr->setitem)(self, -1, v) < 0)
       
   472 		return -1;
       
   473 
       
   474 	if (array_resize(self, n+1) == -1)
       
   475 		return -1;
       
   476 	items = self->ob_item;
       
   477 	if (where < 0) {
       
   478 		where += n;
       
   479 		if (where < 0)
       
   480 			where = 0;
       
   481 	}
       
   482 	if (where > n)
       
   483 		where = n;
       
   484 	/* appends don't need to call memmove() */
       
   485 	if (where != n)
       
   486 		memmove(items + (where+1)*self->ob_descr->itemsize,
       
   487 			items + where*self->ob_descr->itemsize,
       
   488 			(n-where)*self->ob_descr->itemsize);
       
   489 	return (*self->ob_descr->setitem)(self, where, v);
       
   490 }
       
   491 
       
   492 /* Methods */
       
   493 
       
   494 static void
       
   495 array_dealloc(arrayobject *op)
       
   496 {
       
   497 	if (op->weakreflist != NULL)
       
   498 		PyObject_ClearWeakRefs((PyObject *) op);
       
   499 	if (op->ob_item != NULL)
       
   500 		PyMem_DEL(op->ob_item);
       
   501 	Py_TYPE(op)->tp_free((PyObject *)op);
       
   502 }
       
   503 
       
   504 static PyObject *
       
   505 array_richcompare(PyObject *v, PyObject *w, int op)
       
   506 {
       
   507 	arrayobject *va, *wa;
       
   508 	PyObject *vi = NULL;
       
   509 	PyObject *wi = NULL;
       
   510 	Py_ssize_t i, k;
       
   511 	PyObject *res;
       
   512 
       
   513 	if (!array_Check(v) || !array_Check(w)) {
       
   514 		Py_INCREF(Py_NotImplemented);
       
   515 		return Py_NotImplemented;
       
   516 	}
       
   517 
       
   518 	va = (arrayobject *)v;
       
   519 	wa = (arrayobject *)w;
       
   520 
       
   521 	if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
       
   522 		/* Shortcut: if the lengths differ, the arrays differ */
       
   523 		if (op == Py_EQ)
       
   524 			res = Py_False;
       
   525 		else
       
   526 			res = Py_True;
       
   527 		Py_INCREF(res);
       
   528 		return res;
       
   529 	}
       
   530 
       
   531 	/* Search for the first index where items are different */
       
   532 	k = 1;
       
   533 	for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
       
   534 		vi = getarrayitem(v, i);
       
   535 		wi = getarrayitem(w, i);
       
   536 		if (vi == NULL || wi == NULL) {
       
   537 			Py_XDECREF(vi);
       
   538 			Py_XDECREF(wi);
       
   539 			return NULL;
       
   540 		}
       
   541 		k = PyObject_RichCompareBool(vi, wi, Py_EQ);
       
   542 		if (k == 0)
       
   543 			break; /* Keeping vi and wi alive! */
       
   544 		Py_DECREF(vi);
       
   545 		Py_DECREF(wi);
       
   546 		if (k < 0)
       
   547 			return NULL;
       
   548 	}
       
   549 
       
   550 	if (k) {
       
   551 		/* No more items to compare -- compare sizes */
       
   552 		Py_ssize_t vs = Py_SIZE(va);
       
   553 		Py_ssize_t ws = Py_SIZE(wa);
       
   554 		int cmp;
       
   555 		switch (op) {
       
   556 		case Py_LT: cmp = vs <  ws; break;
       
   557 		case Py_LE: cmp = vs <= ws; break;
       
   558 		case Py_EQ: cmp = vs == ws; break;
       
   559 		case Py_NE: cmp = vs != ws; break;
       
   560 		case Py_GT: cmp = vs >  ws; break;
       
   561 		case Py_GE: cmp = vs >= ws; break;
       
   562 		default: return NULL; /* cannot happen */
       
   563 		}
       
   564 		if (cmp)
       
   565 			res = Py_True;
       
   566 		else
       
   567 			res = Py_False;
       
   568 		Py_INCREF(res);
       
   569 		return res;
       
   570 	}
       
   571 
       
   572 	/* We have an item that differs.  First, shortcuts for EQ/NE */
       
   573 	if (op == Py_EQ) {
       
   574 		Py_INCREF(Py_False);
       
   575 		res = Py_False;
       
   576 	}
       
   577 	else if (op == Py_NE) {
       
   578 		Py_INCREF(Py_True);
       
   579 		res = Py_True;
       
   580 	}
       
   581 	else {
       
   582 		/* Compare the final item again using the proper operator */
       
   583 		res = PyObject_RichCompare(vi, wi, op);
       
   584 	}
       
   585 	Py_DECREF(vi);
       
   586 	Py_DECREF(wi);
       
   587 	return res;
       
   588 }
       
   589 
       
   590 static Py_ssize_t
       
   591 array_length(arrayobject *a)
       
   592 {
       
   593 	return Py_SIZE(a);
       
   594 }
       
   595 
       
   596 static PyObject *
       
   597 array_item(arrayobject *a, Py_ssize_t i)
       
   598 {
       
   599 	if (i < 0 || i >= Py_SIZE(a)) {
       
   600 		PyErr_SetString(PyExc_IndexError, "array index out of range");
       
   601 		return NULL;
       
   602 	}
       
   603 	return getarrayitem((PyObject *)a, i);
       
   604 }
       
   605 
       
   606 static PyObject *
       
   607 array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
       
   608 {
       
   609 	arrayobject *np;
       
   610 	if (ilow < 0)
       
   611 		ilow = 0;
       
   612 	else if (ilow > Py_SIZE(a))
       
   613 		ilow = Py_SIZE(a);
       
   614 	if (ihigh < 0)
       
   615 		ihigh = 0;
       
   616 	if (ihigh < ilow)
       
   617 		ihigh = ilow;
       
   618 	else if (ihigh > Py_SIZE(a))
       
   619 		ihigh = Py_SIZE(a);
       
   620 	np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
       
   621 	if (np == NULL)
       
   622 		return NULL;
       
   623 	memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
       
   624 	       (ihigh-ilow) * a->ob_descr->itemsize);
       
   625 	return (PyObject *)np;
       
   626 }
       
   627 
       
   628 static PyObject *
       
   629 array_copy(arrayobject *a, PyObject *unused)
       
   630 {
       
   631 	return array_slice(a, 0, Py_SIZE(a));
       
   632 }
       
   633 
       
   634 PyDoc_STRVAR(copy_doc,
       
   635 "copy(array)\n\
       
   636 \n\
       
   637  Return a copy of the array.");
       
   638 
       
   639 static PyObject *
       
   640 array_concat(arrayobject *a, PyObject *bb)
       
   641 {
       
   642 	Py_ssize_t size;
       
   643 	arrayobject *np;
       
   644 	if (!array_Check(bb)) {
       
   645 		PyErr_Format(PyExc_TypeError,
       
   646 		     "can only append array (not \"%.200s\") to array",
       
   647 			     Py_TYPE(bb)->tp_name);
       
   648 		return NULL;
       
   649 	}
       
   650 #define b ((arrayobject *)bb)
       
   651 	if (a->ob_descr != b->ob_descr) {
       
   652 		PyErr_BadArgument();
       
   653 		return NULL;
       
   654 	}
       
   655 	if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
       
   656 		return PyErr_NoMemory();
       
   657 	}
       
   658 	size = Py_SIZE(a) + Py_SIZE(b);
       
   659 	np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
       
   660 	if (np == NULL) {
       
   661 		return NULL;
       
   662 	}
       
   663 	memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
       
   664 	memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
       
   665 	       b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
       
   666 	return (PyObject *)np;
       
   667 #undef b
       
   668 }
       
   669 
       
   670 static PyObject *
       
   671 array_repeat(arrayobject *a, Py_ssize_t n)
       
   672 {
       
   673 	Py_ssize_t i;
       
   674 	Py_ssize_t size;
       
   675 	arrayobject *np;
       
   676 	char *p;
       
   677 	Py_ssize_t nbytes;
       
   678 	if (n < 0)
       
   679 		n = 0;
       
   680 	if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
       
   681 		return PyErr_NoMemory();
       
   682 	}
       
   683 	size = Py_SIZE(a) * n;
       
   684 	np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
       
   685 	if (np == NULL)
       
   686 		return NULL;
       
   687 	p = np->ob_item;
       
   688 	nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
       
   689 	for (i = 0; i < n; i++) {
       
   690 		memcpy(p, a->ob_item, nbytes);
       
   691 		p += nbytes;
       
   692 	}
       
   693 	return (PyObject *) np;
       
   694 }
       
   695 
       
   696 static int
       
   697 array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
       
   698 {
       
   699 	char *item;
       
   700 	Py_ssize_t n; /* Size of replacement array */
       
   701 	Py_ssize_t d; /* Change in size */
       
   702 #define b ((arrayobject *)v)
       
   703 	if (v == NULL)
       
   704 		n = 0;
       
   705 	else if (array_Check(v)) {
       
   706 		n = Py_SIZE(b);
       
   707 		if (a == b) {
       
   708 			/* Special case "a[i:j] = a" -- copy b first */
       
   709 			int ret;
       
   710 			v = array_slice(b, 0, n);
       
   711 			if (!v)
       
   712 				return -1;
       
   713 			ret = array_ass_slice(a, ilow, ihigh, v);
       
   714 			Py_DECREF(v);
       
   715 			return ret;
       
   716 		}
       
   717 		if (b->ob_descr != a->ob_descr) {
       
   718 			PyErr_BadArgument();
       
   719 			return -1;
       
   720 		}
       
   721 	}
       
   722 	else {
       
   723 		PyErr_Format(PyExc_TypeError,
       
   724 	     "can only assign array (not \"%.200s\") to array slice",
       
   725 			     Py_TYPE(v)->tp_name);
       
   726 		return -1;
       
   727 	}
       
   728 	if (ilow < 0)
       
   729 		ilow = 0;
       
   730 	else if (ilow > Py_SIZE(a))
       
   731 		ilow = Py_SIZE(a);
       
   732 	if (ihigh < 0)
       
   733 		ihigh = 0;
       
   734 	if (ihigh < ilow)
       
   735 		ihigh = ilow;
       
   736 	else if (ihigh > Py_SIZE(a))
       
   737 		ihigh = Py_SIZE(a);
       
   738 	item = a->ob_item;
       
   739 	d = n - (ihigh-ilow);
       
   740 	if (d < 0) { /* Delete -d items */
       
   741 		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
       
   742 			item + ihigh*a->ob_descr->itemsize,
       
   743 			(Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
       
   744 		Py_SIZE(a) += d;
       
   745 		PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
       
   746 						/* Can't fail */
       
   747 		a->ob_item = item;
       
   748 		a->allocated = Py_SIZE(a);
       
   749 	}
       
   750 	else if (d > 0) { /* Insert d items */
       
   751 		PyMem_RESIZE(item, char,
       
   752 			     (Py_SIZE(a) + d)*a->ob_descr->itemsize);
       
   753 		if (item == NULL) {
       
   754 			PyErr_NoMemory();
       
   755 			return -1;
       
   756 		}
       
   757 		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
       
   758 			item + ihigh*a->ob_descr->itemsize,
       
   759 			(Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
       
   760 		a->ob_item = item;
       
   761 		Py_SIZE(a) += d;
       
   762 		a->allocated = Py_SIZE(a);
       
   763 	}
       
   764 	if (n > 0)
       
   765 		memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
       
   766 		       n*b->ob_descr->itemsize);
       
   767 	return 0;
       
   768 #undef b
       
   769 }
       
   770 
       
   771 static int
       
   772 array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
       
   773 {
       
   774 	if (i < 0 || i >= Py_SIZE(a)) {
       
   775 		PyErr_SetString(PyExc_IndexError,
       
   776 			         "array assignment index out of range");
       
   777 		return -1;
       
   778 	}
       
   779 	if (v == NULL)
       
   780 		return array_ass_slice(a, i, i+1, v);
       
   781 	return (*a->ob_descr->setitem)(a, i, v);
       
   782 }
       
   783 
       
   784 static int
       
   785 setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
       
   786 {
       
   787 	assert(array_Check(a));
       
   788 	return array_ass_item((arrayobject *)a, i, v);
       
   789 }
       
   790 
       
   791 static int
       
   792 array_iter_extend(arrayobject *self, PyObject *bb)
       
   793 {
       
   794 	PyObject *it, *v;
       
   795 
       
   796 	it = PyObject_GetIter(bb);
       
   797 	if (it == NULL)
       
   798 		return -1;
       
   799 
       
   800 	while ((v = PyIter_Next(it)) != NULL) {
       
   801 		if (ins1(self, (int) Py_SIZE(self), v) != 0) {
       
   802 			Py_DECREF(v);
       
   803 			Py_DECREF(it);
       
   804 			return -1;
       
   805 		}
       
   806 		Py_DECREF(v);
       
   807 	}
       
   808 	Py_DECREF(it);
       
   809 	if (PyErr_Occurred())
       
   810 		return -1;
       
   811 	return 0;
       
   812 }
       
   813 
       
   814 static int
       
   815 array_do_extend(arrayobject *self, PyObject *bb)
       
   816 {
       
   817 	Py_ssize_t size;
       
   818 	char *old_item;
       
   819 
       
   820 	if (!array_Check(bb))
       
   821 		return array_iter_extend(self, bb);
       
   822 #define b ((arrayobject *)bb)
       
   823 	if (self->ob_descr != b->ob_descr) {
       
   824 		PyErr_SetString(PyExc_TypeError,
       
   825 			     "can only extend with array of same kind");
       
   826 		return -1;
       
   827 	}
       
   828 	if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
       
   829 		((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
       
   830 		PyErr_NoMemory();
       
   831 		return -1;
       
   832 	}
       
   833 	size = Py_SIZE(self) + Py_SIZE(b);
       
   834 	old_item = self->ob_item;
       
   835         PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
       
   836         if (self->ob_item == NULL) {
       
   837 		self->ob_item = old_item;
       
   838 		PyErr_NoMemory();
       
   839 		return -1;
       
   840         }
       
   841 	memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
       
   842                b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
       
   843 	Py_SIZE(self) = size;
       
   844 	self->allocated = size;
       
   845 
       
   846 	return 0;
       
   847 #undef b
       
   848 }
       
   849 
       
   850 static PyObject *
       
   851 array_inplace_concat(arrayobject *self, PyObject *bb)
       
   852 {
       
   853 	if (!array_Check(bb)) {
       
   854 		PyErr_Format(PyExc_TypeError,
       
   855 			"can only extend array with array (not \"%.200s\")",
       
   856 			Py_TYPE(bb)->tp_name);
       
   857 		return NULL;
       
   858 	}
       
   859 	if (array_do_extend(self, bb) == -1)
       
   860 		return NULL;
       
   861 	Py_INCREF(self);
       
   862 	return (PyObject *)self;
       
   863 }
       
   864 
       
   865 static PyObject *
       
   866 array_inplace_repeat(arrayobject *self, Py_ssize_t n)
       
   867 {
       
   868 	char *items, *p;
       
   869 	Py_ssize_t size, i;
       
   870 
       
   871 	if (Py_SIZE(self) > 0) {
       
   872 		if (n < 0)
       
   873 			n = 0;
       
   874 		items = self->ob_item;
       
   875 		if ((self->ob_descr->itemsize != 0) && 
       
   876 			(Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
       
   877 			return PyErr_NoMemory();
       
   878 		}
       
   879 		size = Py_SIZE(self) * self->ob_descr->itemsize;
       
   880 		if (n == 0) {
       
   881 			PyMem_FREE(items);
       
   882 			self->ob_item = NULL;
       
   883 			Py_SIZE(self) = 0;
       
   884 			self->allocated = 0;
       
   885 		}
       
   886 		else {
       
   887 			if (size > PY_SSIZE_T_MAX / n) {
       
   888 				return PyErr_NoMemory();
       
   889 			}
       
   890 			PyMem_RESIZE(items, char, n * size);
       
   891 			if (items == NULL)
       
   892 				return PyErr_NoMemory();
       
   893 			p = items;
       
   894 			for (i = 1; i < n; i++) {
       
   895 				p += size;
       
   896 				memcpy(p, items, size);
       
   897 			}
       
   898 			self->ob_item = items;
       
   899 			Py_SIZE(self) *= n;
       
   900 			self->allocated = Py_SIZE(self);
       
   901 		}
       
   902 	}
       
   903 	Py_INCREF(self);
       
   904 	return (PyObject *)self;
       
   905 }
       
   906 
       
   907 
       
   908 static PyObject *
       
   909 ins(arrayobject *self, Py_ssize_t where, PyObject *v)
       
   910 {
       
   911 	if (ins1(self, where, v) != 0)
       
   912 		return NULL;
       
   913 	Py_INCREF(Py_None);
       
   914 	return Py_None;
       
   915 }
       
   916 
       
   917 static PyObject *
       
   918 array_count(arrayobject *self, PyObject *v)
       
   919 {
       
   920 	Py_ssize_t count = 0;
       
   921 	Py_ssize_t i;
       
   922 
       
   923 	for (i = 0; i < Py_SIZE(self); i++) {
       
   924 		PyObject *selfi = getarrayitem((PyObject *)self, i);
       
   925 		int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
       
   926 		Py_DECREF(selfi);
       
   927 		if (cmp > 0)
       
   928 			count++;
       
   929 		else if (cmp < 0)
       
   930 			return NULL;
       
   931 	}
       
   932 	return PyInt_FromSsize_t(count);
       
   933 }
       
   934 
       
   935 PyDoc_STRVAR(count_doc,
       
   936 "count(x)\n\
       
   937 \n\
       
   938 Return number of occurences of x in the array.");
       
   939 
       
   940 static PyObject *
       
   941 array_index(arrayobject *self, PyObject *v)
       
   942 {
       
   943 	Py_ssize_t i;
       
   944 
       
   945 	for (i = 0; i < Py_SIZE(self); i++) {
       
   946 		PyObject *selfi = getarrayitem((PyObject *)self, i);
       
   947 		int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
       
   948 		Py_DECREF(selfi);
       
   949 		if (cmp > 0) {
       
   950 			return PyInt_FromLong((long)i);
       
   951 		}
       
   952 		else if (cmp < 0)
       
   953 			return NULL;
       
   954 	}
       
   955 	PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
       
   956 	return NULL;
       
   957 }
       
   958 
       
   959 PyDoc_STRVAR(index_doc,
       
   960 "index(x)\n\
       
   961 \n\
       
   962 Return index of first occurence of x in the array.");
       
   963 
       
   964 static int
       
   965 array_contains(arrayobject *self, PyObject *v)
       
   966 {
       
   967 	Py_ssize_t i;
       
   968 	int cmp;
       
   969 
       
   970 	for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
       
   971 		PyObject *selfi = getarrayitem((PyObject *)self, i);
       
   972 		cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
       
   973 		Py_DECREF(selfi);
       
   974 	}
       
   975 	return cmp;
       
   976 }
       
   977 
       
   978 static PyObject *
       
   979 array_remove(arrayobject *self, PyObject *v)
       
   980 {
       
   981 	int i;
       
   982 
       
   983 	for (i = 0; i < Py_SIZE(self); i++) {
       
   984 		PyObject *selfi = getarrayitem((PyObject *)self,i);
       
   985 		int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
       
   986 		Py_DECREF(selfi);
       
   987 		if (cmp > 0) {
       
   988 			if (array_ass_slice(self, i, i+1,
       
   989 					   (PyObject *)NULL) != 0)
       
   990 				return NULL;
       
   991 			Py_INCREF(Py_None);
       
   992 			return Py_None;
       
   993 		}
       
   994 		else if (cmp < 0)
       
   995 			return NULL;
       
   996 	}
       
   997 	PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
       
   998 	return NULL;
       
   999 }
       
  1000 
       
  1001 PyDoc_STRVAR(remove_doc,
       
  1002 "remove(x)\n\
       
  1003 \n\
       
  1004 Remove the first occurence of x in the array.");
       
  1005 
       
  1006 static PyObject *
       
  1007 array_pop(arrayobject *self, PyObject *args)
       
  1008 {
       
  1009 	Py_ssize_t i = -1;
       
  1010 	PyObject *v;
       
  1011 	if (!PyArg_ParseTuple(args, "|n:pop", &i))
       
  1012 		return NULL;
       
  1013 	if (Py_SIZE(self) == 0) {
       
  1014 		/* Special-case most common failure cause */
       
  1015 		PyErr_SetString(PyExc_IndexError, "pop from empty array");
       
  1016 		return NULL;
       
  1017 	}
       
  1018 	if (i < 0)
       
  1019 		i += Py_SIZE(self);
       
  1020 	if (i < 0 || i >= Py_SIZE(self)) {
       
  1021 		PyErr_SetString(PyExc_IndexError, "pop index out of range");
       
  1022 		return NULL;
       
  1023 	}
       
  1024 	v = getarrayitem((PyObject *)self,i);
       
  1025 	if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
       
  1026 		Py_DECREF(v);
       
  1027 		return NULL;
       
  1028 	}
       
  1029 	return v;
       
  1030 }
       
  1031 
       
  1032 PyDoc_STRVAR(pop_doc,
       
  1033 "pop([i])\n\
       
  1034 \n\
       
  1035 Return the i-th element and delete it from the array. i defaults to -1.");
       
  1036 
       
  1037 static PyObject *
       
  1038 array_extend(arrayobject *self, PyObject *bb)
       
  1039 {
       
  1040 	if (array_do_extend(self, bb) == -1)
       
  1041 		return NULL;
       
  1042 	Py_INCREF(Py_None);
       
  1043 	return Py_None;
       
  1044 }
       
  1045 
       
  1046 PyDoc_STRVAR(extend_doc,
       
  1047 "extend(array or iterable)\n\
       
  1048 \n\
       
  1049  Append items to the end of the array.");
       
  1050 
       
  1051 static PyObject *
       
  1052 array_insert(arrayobject *self, PyObject *args)
       
  1053 {
       
  1054 	Py_ssize_t i;
       
  1055 	PyObject *v;
       
  1056         if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
       
  1057 		return NULL;
       
  1058 	return ins(self, i, v);
       
  1059 }
       
  1060 
       
  1061 PyDoc_STRVAR(insert_doc,
       
  1062 "insert(i,x)\n\
       
  1063 \n\
       
  1064 Insert a new item x into the array before position i.");
       
  1065 
       
  1066 
       
  1067 static PyObject *
       
  1068 array_buffer_info(arrayobject *self, PyObject *unused)
       
  1069 {
       
  1070 	PyObject* retval = NULL;
       
  1071 	retval = PyTuple_New(2);
       
  1072 	if (!retval)
       
  1073 		return NULL;
       
  1074 
       
  1075 	PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
       
  1076 	PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));
       
  1077 
       
  1078 	return retval;
       
  1079 }
       
  1080 
       
  1081 PyDoc_STRVAR(buffer_info_doc,
       
  1082 "buffer_info() -> (address, length)\n\
       
  1083 \n\
       
  1084 Return a tuple (address, length) giving the current memory address and\n\
       
  1085 the length in items of the buffer used to hold array's contents\n\
       
  1086 The length should be multiplied by the itemsize attribute to calculate\n\
       
  1087 the buffer length in bytes.");
       
  1088 
       
  1089 
       
  1090 static PyObject *
       
  1091 array_append(arrayobject *self, PyObject *v)
       
  1092 {
       
  1093 	return ins(self, (int) Py_SIZE(self), v);
       
  1094 }
       
  1095 
       
  1096 PyDoc_STRVAR(append_doc,
       
  1097 "append(x)\n\
       
  1098 \n\
       
  1099 Append new value x to the end of the array.");
       
  1100 
       
  1101 
       
  1102 static PyObject *
       
  1103 array_byteswap(arrayobject *self, PyObject *unused)
       
  1104 {
       
  1105 	char *p;
       
  1106 	Py_ssize_t i;
       
  1107 
       
  1108 	switch (self->ob_descr->itemsize) {
       
  1109 	case 1:
       
  1110 		break;
       
  1111 	case 2:
       
  1112 		for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
       
  1113 			char p0 = p[0];
       
  1114 			p[0] = p[1];
       
  1115 			p[1] = p0;
       
  1116 		}
       
  1117 		break;
       
  1118 	case 4:
       
  1119 		for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
       
  1120 			char p0 = p[0];
       
  1121 			char p1 = p[1];
       
  1122 			p[0] = p[3];
       
  1123 			p[1] = p[2];
       
  1124 			p[2] = p1;
       
  1125 			p[3] = p0;
       
  1126 		}
       
  1127 		break;
       
  1128 	case 8:
       
  1129 		for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
       
  1130 			char p0 = p[0];
       
  1131 			char p1 = p[1];
       
  1132 			char p2 = p[2];
       
  1133 			char p3 = p[3];
       
  1134 			p[0] = p[7];
       
  1135 			p[1] = p[6];
       
  1136 			p[2] = p[5];
       
  1137 			p[3] = p[4];
       
  1138 			p[4] = p3;
       
  1139 			p[5] = p2;
       
  1140 			p[6] = p1;
       
  1141 			p[7] = p0;
       
  1142 		}
       
  1143 		break;
       
  1144 	default:
       
  1145 		PyErr_SetString(PyExc_RuntimeError,
       
  1146 			   "don't know how to byteswap this array type");
       
  1147 		return NULL;
       
  1148 	}
       
  1149 	Py_INCREF(Py_None);
       
  1150 	return Py_None;
       
  1151 }
       
  1152 
       
  1153 PyDoc_STRVAR(byteswap_doc,
       
  1154 "byteswap()\n\
       
  1155 \n\
       
  1156 Byteswap all items of the array.  If the items in the array are not 1, 2,\n\
       
  1157 4, or 8 bytes in size, RuntimeError is raised.");
       
  1158 
       
  1159 static PyObject *
       
  1160 array_reduce(arrayobject *array)
       
  1161 {
       
  1162 	PyObject *dict, *result;
       
  1163 
       
  1164 	dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
       
  1165 	if (dict == NULL) {
       
  1166 		PyErr_Clear();
       
  1167 		dict = Py_None;
       
  1168 		Py_INCREF(dict);
       
  1169 	}
       
  1170 	if (Py_SIZE(array) > 0) {
       
  1171 		if (array->ob_descr->itemsize 
       
  1172 				> PY_SSIZE_T_MAX / array->ob_size) {
       
  1173 			return PyErr_NoMemory();
       
  1174 		}
       
  1175 		result = Py_BuildValue("O(cs#)O", 
       
  1176 			Py_TYPE(array), 
       
  1177 			array->ob_descr->typecode,
       
  1178 			array->ob_item,
       
  1179 			Py_SIZE(array) * array->ob_descr->itemsize,
       
  1180 			dict);
       
  1181 	} else {
       
  1182 		result = Py_BuildValue("O(c)O", 
       
  1183 			Py_TYPE(array), 
       
  1184 			array->ob_descr->typecode,
       
  1185 			dict);
       
  1186 	}
       
  1187 	Py_DECREF(dict);
       
  1188 	return result;
       
  1189 }
       
  1190 
       
  1191 PyDoc_STRVAR(array_doc, "Return state information for pickling.");
       
  1192 
       
  1193 static PyObject *
       
  1194 array_reverse(arrayobject *self, PyObject *unused)
       
  1195 {
       
  1196 	register Py_ssize_t itemsize = self->ob_descr->itemsize;
       
  1197 	register char *p, *q;
       
  1198 	/* little buffer to hold items while swapping */
       
  1199 	char tmp[256];	/* 8 is probably enough -- but why skimp */
       
  1200 	assert((size_t)itemsize <= sizeof(tmp));
       
  1201 
       
  1202 	if (Py_SIZE(self) > 1) {
       
  1203 		for (p = self->ob_item,
       
  1204 		     q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
       
  1205 		     p < q;
       
  1206 		     p += itemsize, q -= itemsize) {
       
  1207 			/* memory areas guaranteed disjoint, so memcpy
       
  1208 			 * is safe (& memmove may be slower).
       
  1209 			 */
       
  1210 			memcpy(tmp, p, itemsize);
       
  1211 			memcpy(p, q, itemsize);
       
  1212 			memcpy(q, tmp, itemsize);
       
  1213 		}
       
  1214 	}
       
  1215 
       
  1216 	Py_INCREF(Py_None);
       
  1217 	return Py_None;
       
  1218 }
       
  1219 
       
  1220 PyDoc_STRVAR(reverse_doc,
       
  1221 "reverse()\n\
       
  1222 \n\
       
  1223 Reverse the order of the items in the array.");
       
  1224 
       
  1225 static PyObject *
       
  1226 array_fromfile(arrayobject *self, PyObject *args)
       
  1227 {
       
  1228 	PyObject *f;
       
  1229 	Py_ssize_t n;
       
  1230 	FILE *fp;
       
  1231         if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
       
  1232 		return NULL;
       
  1233 	fp = PyFile_AsFile(f);
       
  1234 	if (fp == NULL) {
       
  1235 		PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
       
  1236 		return NULL;
       
  1237 	}
       
  1238 	if (n > 0) {
       
  1239 		char *item = self->ob_item;
       
  1240 		Py_ssize_t itemsize = self->ob_descr->itemsize;
       
  1241 		size_t nread;
       
  1242 		Py_ssize_t newlength;
       
  1243 		size_t newbytes;
       
  1244 		/* Be careful here about overflow */
       
  1245 		if ((newlength = Py_SIZE(self) + n) <= 0 ||
       
  1246 		    (newbytes = newlength * itemsize) / itemsize !=
       
  1247 		    (size_t)newlength)
       
  1248 			goto nomem;
       
  1249 		PyMem_RESIZE(item, char, newbytes);
       
  1250 		if (item == NULL) {
       
  1251 		  nomem:
       
  1252 			PyErr_NoMemory();
       
  1253 			return NULL;
       
  1254 		}
       
  1255 		self->ob_item = item;
       
  1256 		Py_SIZE(self) += n;
       
  1257 		self->allocated = Py_SIZE(self);
       
  1258 		nread = fread(item + (Py_SIZE(self) - n) * itemsize,
       
  1259 			      itemsize, n, fp);
       
  1260 		if (nread < (size_t)n) {
       
  1261 		  Py_SIZE(self) -= (n - nread);
       
  1262 			PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
       
  1263 			self->ob_item = item;
       
  1264 			self->allocated = Py_SIZE(self);
       
  1265 			PyErr_SetString(PyExc_EOFError,
       
  1266 				         "not enough items in file");
       
  1267 			return NULL;
       
  1268 		}
       
  1269 	}
       
  1270 	Py_INCREF(Py_None);
       
  1271 	return Py_None;
       
  1272 }
       
  1273 
       
  1274 PyDoc_STRVAR(fromfile_doc,
       
  1275 "fromfile(f, n)\n\
       
  1276 \n\
       
  1277 Read n objects from the file object f and append them to the end of the\n\
       
  1278 array.  Also called as read.");
       
  1279 
       
  1280 
       
  1281 static PyObject *
       
  1282 array_fromfile_as_read(arrayobject *self, PyObject *args)
       
  1283 {
       
  1284 	if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
       
  1285 			   "use array.fromfile()", 1) < 0)
       
  1286 		return NULL;
       
  1287 	return array_fromfile(self, args);
       
  1288 }
       
  1289 
       
  1290 
       
  1291 static PyObject *
       
  1292 array_tofile(arrayobject *self, PyObject *f)
       
  1293 {
       
  1294 	FILE *fp;
       
  1295 
       
  1296 	fp = PyFile_AsFile(f);
       
  1297 	if (fp == NULL) {
       
  1298 		PyErr_SetString(PyExc_TypeError, "arg must be open file");
       
  1299 		return NULL;
       
  1300 	}
       
  1301 	if (self->ob_size > 0) {
       
  1302 		if (fwrite(self->ob_item, self->ob_descr->itemsize,
       
  1303 			   self->ob_size, fp) != (size_t)self->ob_size) {
       
  1304 			PyErr_SetFromErrno(PyExc_IOError);
       
  1305 			clearerr(fp);
       
  1306 			return NULL;
       
  1307 		}
       
  1308 	}
       
  1309 	Py_INCREF(Py_None);
       
  1310 	return Py_None;
       
  1311 }
       
  1312 
       
  1313 PyDoc_STRVAR(tofile_doc,
       
  1314 "tofile(f)\n\
       
  1315 \n\
       
  1316 Write all items (as machine values) to the file object f.  Also called as\n\
       
  1317 write.");
       
  1318 
       
  1319 
       
  1320 static PyObject *
       
  1321 array_tofile_as_write(arrayobject *self, PyObject *f)
       
  1322 {
       
  1323 	if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
       
  1324 			   "use array.tofile()", 1) < 0)
       
  1325 		return NULL;
       
  1326 	return array_tofile(self, f);
       
  1327 }
       
  1328 
       
  1329 
       
  1330 static PyObject *
       
  1331 array_fromlist(arrayobject *self, PyObject *list)
       
  1332 {
       
  1333 	Py_ssize_t n;
       
  1334 	Py_ssize_t itemsize = self->ob_descr->itemsize;
       
  1335 
       
  1336 	if (!PyList_Check(list)) {
       
  1337 		PyErr_SetString(PyExc_TypeError, "arg must be list");
       
  1338 		return NULL;
       
  1339 	}
       
  1340 	n = PyList_Size(list);
       
  1341 	if (n > 0) {
       
  1342 		char *item = self->ob_item;
       
  1343 		Py_ssize_t i;
       
  1344 		PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
       
  1345 		if (item == NULL) {
       
  1346 			PyErr_NoMemory();
       
  1347 			return NULL;
       
  1348 		}
       
  1349 		self->ob_item = item;
       
  1350 		Py_SIZE(self) += n;
       
  1351 		self->allocated = Py_SIZE(self);
       
  1352 		for (i = 0; i < n; i++) {
       
  1353 			PyObject *v = PyList_GetItem(list, i);
       
  1354 			if ((*self->ob_descr->setitem)(self,
       
  1355 					Py_SIZE(self) - n + i, v) != 0) {
       
  1356 				Py_SIZE(self) -= n;
       
  1357 				if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
       
  1358 					return PyErr_NoMemory();
       
  1359 				}
       
  1360 				PyMem_RESIZE(item, char,
       
  1361 					          Py_SIZE(self) * itemsize);
       
  1362 				self->ob_item = item;
       
  1363 				self->allocated = Py_SIZE(self);
       
  1364 				return NULL;
       
  1365 			}
       
  1366 		}
       
  1367 	}
       
  1368 	Py_INCREF(Py_None);
       
  1369 	return Py_None;
       
  1370 }
       
  1371 
       
  1372 PyDoc_STRVAR(fromlist_doc,
       
  1373 "fromlist(list)\n\
       
  1374 \n\
       
  1375 Append items to array from list.");
       
  1376 
       
  1377 
       
  1378 static PyObject *
       
  1379 array_tolist(arrayobject *self, PyObject *unused)
       
  1380 {
       
  1381 	PyObject *list = PyList_New(Py_SIZE(self));
       
  1382 	Py_ssize_t i;
       
  1383 
       
  1384 	if (list == NULL)
       
  1385 		return NULL;
       
  1386 	for (i = 0; i < Py_SIZE(self); i++) {
       
  1387 		PyObject *v = getarrayitem((PyObject *)self, i);
       
  1388 		if (v == NULL) {
       
  1389 			Py_DECREF(list);
       
  1390 			return NULL;
       
  1391 		}
       
  1392 		PyList_SetItem(list, i, v);
       
  1393 	}
       
  1394 	return list;
       
  1395 }
       
  1396 
       
  1397 PyDoc_STRVAR(tolist_doc,
       
  1398 "tolist() -> list\n\
       
  1399 \n\
       
  1400 Convert array to an ordinary list with the same items.");
       
  1401 
       
  1402 
       
  1403 static PyObject *
       
  1404 array_fromstring(arrayobject *self, PyObject *args)
       
  1405 {
       
  1406 	char *str;
       
  1407 	Py_ssize_t n;
       
  1408 	int itemsize = self->ob_descr->itemsize;
       
  1409         if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
       
  1410 		return NULL;
       
  1411 	if (n % itemsize != 0) {
       
  1412 		PyErr_SetString(PyExc_ValueError,
       
  1413 			   "string length not a multiple of item size");
       
  1414 		return NULL;
       
  1415 	}
       
  1416 	n = n / itemsize;
       
  1417 	if (n > 0) {
       
  1418 		char *item = self->ob_item;
       
  1419 		if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
       
  1420 			((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
       
  1421 				return PyErr_NoMemory();
       
  1422 		}
       
  1423 		PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
       
  1424 		if (item == NULL) {
       
  1425 			PyErr_NoMemory();
       
  1426 			return NULL;
       
  1427 		}
       
  1428 		self->ob_item = item;
       
  1429 		Py_SIZE(self) += n;
       
  1430 		self->allocated = Py_SIZE(self);
       
  1431 		memcpy(item + (Py_SIZE(self) - n) * itemsize,
       
  1432 		       str, itemsize*n);
       
  1433 	}
       
  1434 	Py_INCREF(Py_None);
       
  1435 	return Py_None;
       
  1436 }
       
  1437 
       
  1438 PyDoc_STRVAR(fromstring_doc,
       
  1439 "fromstring(string)\n\
       
  1440 \n\
       
  1441 Appends items from the string, interpreting it as an array of machine\n\
       
  1442 values,as if it had been read from a file using the fromfile() method).");
       
  1443 
       
  1444 
       
  1445 static PyObject *
       
  1446 array_tostring(arrayobject *self, PyObject *unused)
       
  1447 {
       
  1448 	if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
       
  1449 		return PyString_FromStringAndSize(self->ob_item,
       
  1450 				    Py_SIZE(self) * self->ob_descr->itemsize);
       
  1451 	} else {
       
  1452 		return PyErr_NoMemory();
       
  1453 	}
       
  1454 }
       
  1455 
       
  1456 PyDoc_STRVAR(tostring_doc,
       
  1457 "tostring() -> string\n\
       
  1458 \n\
       
  1459 Convert the array to an array of machine values and return the string\n\
       
  1460 representation.");
       
  1461 
       
  1462 
       
  1463 
       
  1464 #ifdef Py_USING_UNICODE
       
  1465 static PyObject *
       
  1466 array_fromunicode(arrayobject *self, PyObject *args)
       
  1467 {
       
  1468 	Py_UNICODE *ustr;
       
  1469 	Py_ssize_t n;
       
  1470 
       
  1471         if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
       
  1472 		return NULL;
       
  1473 	if (self->ob_descr->typecode != 'u') {
       
  1474 		PyErr_SetString(PyExc_ValueError,
       
  1475 			"fromunicode() may only be called on "
       
  1476 			"type 'u' arrays");
       
  1477 		return NULL;
       
  1478 	}
       
  1479 	if (n > 0) {
       
  1480 		Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
       
  1481 		if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
       
  1482 			return PyErr_NoMemory();
       
  1483 		}
       
  1484 		PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
       
  1485 		if (item == NULL) {
       
  1486 			PyErr_NoMemory();
       
  1487 			return NULL;
       
  1488 		}
       
  1489 		self->ob_item = (char *) item;
       
  1490 		Py_SIZE(self) += n;
       
  1491 		self->allocated = Py_SIZE(self);
       
  1492 		memcpy(item + Py_SIZE(self) - n,
       
  1493 		       ustr, n * sizeof(Py_UNICODE));
       
  1494 	}
       
  1495 
       
  1496 	Py_INCREF(Py_None);
       
  1497 	return Py_None;
       
  1498 }
       
  1499 
       
  1500 PyDoc_STRVAR(fromunicode_doc,
       
  1501 "fromunicode(ustr)\n\
       
  1502 \n\
       
  1503 Extends this array with data from the unicode string ustr.\n\
       
  1504 The array must be a type 'u' array; otherwise a ValueError\n\
       
  1505 is raised.  Use array.fromstring(ustr.decode(...)) to\n\
       
  1506 append Unicode data to an array of some other type.");
       
  1507 
       
  1508 
       
  1509 static PyObject *
       
  1510 array_tounicode(arrayobject *self, PyObject *unused)
       
  1511 {
       
  1512 	if (self->ob_descr->typecode != 'u') {
       
  1513 		PyErr_SetString(PyExc_ValueError,
       
  1514 			"tounicode() may only be called on type 'u' arrays");
       
  1515 		return NULL;
       
  1516 	}
       
  1517 	return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
       
  1518 }
       
  1519 
       
  1520 PyDoc_STRVAR(tounicode_doc,
       
  1521 "tounicode() -> unicode\n\
       
  1522 \n\
       
  1523 Convert the array to a unicode string.  The array must be\n\
       
  1524 a type 'u' array; otherwise a ValueError is raised.  Use\n\
       
  1525 array.tostring().decode() to obtain a unicode string from\n\
       
  1526 an array of some other type.");
       
  1527 
       
  1528 #endif /* Py_USING_UNICODE */
       
  1529 
       
  1530 
       
  1531 static PyObject *
       
  1532 array_get_typecode(arrayobject *a, void *closure)
       
  1533 {
       
  1534 	char tc = a->ob_descr->typecode;
       
  1535 	return PyString_FromStringAndSize(&tc, 1);
       
  1536 }
       
  1537 
       
  1538 static PyObject *
       
  1539 array_get_itemsize(arrayobject *a, void *closure)
       
  1540 {
       
  1541 	return PyInt_FromLong((long)a->ob_descr->itemsize);
       
  1542 }
       
  1543 
       
  1544 static PyGetSetDef array_getsets [] = {
       
  1545 	{"typecode", (getter) array_get_typecode, NULL,
       
  1546 	 "the typecode character used to create the array"},
       
  1547 	{"itemsize", (getter) array_get_itemsize, NULL,
       
  1548 	 "the size, in bytes, of one array item"},
       
  1549 	{NULL}
       
  1550 };
       
  1551 
       
  1552 static PyMethodDef array_methods[] = {
       
  1553 	{"append",	(PyCFunction)array_append,	METH_O,
       
  1554 	 append_doc},
       
  1555 	{"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
       
  1556 	 buffer_info_doc},
       
  1557 	{"byteswap",	(PyCFunction)array_byteswap,	METH_NOARGS,
       
  1558 	 byteswap_doc},
       
  1559 	{"__copy__",	(PyCFunction)array_copy,	METH_NOARGS,
       
  1560 	 copy_doc},
       
  1561 	{"count",	(PyCFunction)array_count,	METH_O,
       
  1562 	 count_doc},
       
  1563 	{"__deepcopy__",(PyCFunction)array_copy,	METH_O,
       
  1564 	 copy_doc},
       
  1565 	{"extend",      (PyCFunction)array_extend,	METH_O,
       
  1566 	 extend_doc},
       
  1567 	{"fromfile",	(PyCFunction)array_fromfile,	METH_VARARGS,
       
  1568 	 fromfile_doc},
       
  1569 	{"fromlist",	(PyCFunction)array_fromlist,	METH_O,
       
  1570 	 fromlist_doc},
       
  1571 	{"fromstring",	(PyCFunction)array_fromstring,	METH_VARARGS,
       
  1572 	 fromstring_doc},
       
  1573 #ifdef Py_USING_UNICODE
       
  1574 	{"fromunicode",	(PyCFunction)array_fromunicode,	METH_VARARGS,
       
  1575 	 fromunicode_doc},
       
  1576 #endif
       
  1577 	{"index",	(PyCFunction)array_index,	METH_O,
       
  1578 	 index_doc},
       
  1579 	{"insert",	(PyCFunction)array_insert,	METH_VARARGS,
       
  1580 	 insert_doc},
       
  1581 	{"pop",		(PyCFunction)array_pop,		METH_VARARGS,
       
  1582 	 pop_doc},
       
  1583 	{"read",	(PyCFunction)array_fromfile_as_read,	METH_VARARGS,
       
  1584 	 fromfile_doc},
       
  1585 	{"__reduce__",	(PyCFunction)array_reduce,	METH_NOARGS,
       
  1586 	 array_doc},
       
  1587 	{"remove",	(PyCFunction)array_remove,	METH_O,
       
  1588 	 remove_doc},
       
  1589 	{"reverse",	(PyCFunction)array_reverse,	METH_NOARGS,
       
  1590 	 reverse_doc},
       
  1591 /*	{"sort",	(PyCFunction)array_sort,	METH_VARARGS,
       
  1592 	sort_doc},*/
       
  1593 	{"tofile",	(PyCFunction)array_tofile,	METH_O,
       
  1594 	 tofile_doc},
       
  1595 	{"tolist",	(PyCFunction)array_tolist,	METH_NOARGS,
       
  1596 	 tolist_doc},
       
  1597 	{"tostring",	(PyCFunction)array_tostring,	METH_NOARGS,
       
  1598 	 tostring_doc},
       
  1599 #ifdef Py_USING_UNICODE
       
  1600 	{"tounicode",   (PyCFunction)array_tounicode,	METH_NOARGS,
       
  1601 	 tounicode_doc},
       
  1602 #endif
       
  1603 	{"write",	(PyCFunction)array_tofile_as_write,	METH_O,
       
  1604 	 tofile_doc},
       
  1605 	{NULL,		NULL}		/* sentinel */
       
  1606 };
       
  1607 
       
  1608 static PyObject *
       
  1609 array_repr(arrayobject *a)
       
  1610 {
       
  1611 	char buf[256], typecode;
       
  1612 	PyObject *s, *t, *v = NULL;
       
  1613 	Py_ssize_t len;
       
  1614 
       
  1615 	len = Py_SIZE(a);
       
  1616 	typecode = a->ob_descr->typecode;
       
  1617 	if (len == 0) {
       
  1618 		PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
       
  1619 		return PyString_FromString(buf);
       
  1620 	}
       
  1621 		
       
  1622 	if (typecode == 'c')
       
  1623 		v = array_tostring(a, NULL);
       
  1624 #ifdef Py_USING_UNICODE
       
  1625 	else if (typecode == 'u')
       
  1626 		v = array_tounicode(a, NULL);
       
  1627 #endif
       
  1628 	else
       
  1629 		v = array_tolist(a, NULL);
       
  1630 	t = PyObject_Repr(v);
       
  1631 	Py_XDECREF(v);
       
  1632 
       
  1633 	PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
       
  1634 	s = PyString_FromString(buf);
       
  1635 	PyString_ConcatAndDel(&s, t);
       
  1636 	PyString_ConcatAndDel(&s, PyString_FromString(")"));
       
  1637 	return s;
       
  1638 }
       
  1639 
       
  1640 static PyObject*
       
  1641 array_subscr(arrayobject* self, PyObject* item)
       
  1642 {
       
  1643 	if (PyIndex_Check(item)) {
       
  1644 		Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
       
  1645 		if (i==-1 && PyErr_Occurred()) {
       
  1646 			return NULL;
       
  1647 		}
       
  1648 		if (i < 0)
       
  1649 			i += Py_SIZE(self);
       
  1650 		return array_item(self, i);
       
  1651 	}
       
  1652 	else if (PySlice_Check(item)) {
       
  1653 		Py_ssize_t start, stop, step, slicelength, cur, i;
       
  1654 		PyObject* result;
       
  1655 		arrayobject* ar;
       
  1656 		int itemsize = self->ob_descr->itemsize;
       
  1657 
       
  1658 		if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
       
  1659 				 &start, &stop, &step, &slicelength) < 0) {
       
  1660 			return NULL;
       
  1661 		}
       
  1662 
       
  1663 		if (slicelength <= 0) {
       
  1664 			return newarrayobject(&Arraytype, 0, self->ob_descr);
       
  1665 		}
       
  1666 		else if (step == 1) {
       
  1667 			PyObject *result = newarrayobject(&Arraytype,
       
  1668 						slicelength, self->ob_descr);
       
  1669 			if (result == NULL)
       
  1670 				return NULL;
       
  1671 			memcpy(((arrayobject *)result)->ob_item,
       
  1672 			       self->ob_item + start * itemsize,
       
  1673 			       slicelength * itemsize);
       
  1674 			return result;
       
  1675 		}
       
  1676 		else {
       
  1677 			result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
       
  1678 			if (!result) return NULL;
       
  1679 
       
  1680 			ar = (arrayobject*)result;
       
  1681 
       
  1682 			for (cur = start, i = 0; i < slicelength; 
       
  1683 			     cur += step, i++) {
       
  1684 				memcpy(ar->ob_item + i*itemsize,
       
  1685 				       self->ob_item + cur*itemsize,
       
  1686 				       itemsize);
       
  1687 			}
       
  1688 			
       
  1689 			return result;
       
  1690 		}		
       
  1691 	}
       
  1692 	else {
       
  1693 		PyErr_SetString(PyExc_TypeError, 
       
  1694 				"array indices must be integers");
       
  1695 		return NULL;
       
  1696 	}
       
  1697 }
       
  1698 
       
  1699 static int
       
  1700 array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
       
  1701 {
       
  1702 	Py_ssize_t start, stop, step, slicelength, needed;
       
  1703 	arrayobject* other;
       
  1704 	int itemsize;
       
  1705 
       
  1706 	if (PyIndex_Check(item)) {
       
  1707 		Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
       
  1708 		
       
  1709 		if (i == -1 && PyErr_Occurred())
       
  1710 			return -1;
       
  1711 		if (i < 0)
       
  1712 			i += Py_SIZE(self);
       
  1713 		if (i < 0 || i >= Py_SIZE(self)) {
       
  1714 			PyErr_SetString(PyExc_IndexError,
       
  1715 				"array assignment index out of range");
       
  1716 			return -1;
       
  1717 		}
       
  1718 		if (value == NULL) {
       
  1719 			/* Fall through to slice assignment */
       
  1720 			start = i;
       
  1721 			stop = i + 1;
       
  1722 			step = 1;
       
  1723 			slicelength = 1;
       
  1724 		}
       
  1725 		else
       
  1726 			return (*self->ob_descr->setitem)(self, i, value);
       
  1727 	}
       
  1728 	else if (PySlice_Check(item)) {
       
  1729 		if (PySlice_GetIndicesEx((PySliceObject *)item,
       
  1730 					 Py_SIZE(self), &start, &stop,
       
  1731 					 &step, &slicelength) < 0) {
       
  1732 			return -1;
       
  1733 		}
       
  1734 	}
       
  1735 	else {
       
  1736 		PyErr_SetString(PyExc_TypeError,
       
  1737 				"array indices must be integer");
       
  1738 		return -1;
       
  1739 	}
       
  1740 	if (value == NULL) {
       
  1741 		other = NULL;
       
  1742 		needed = 0;
       
  1743 	}
       
  1744 	else if (array_Check(value)) {
       
  1745 		other = (arrayobject *)value;
       
  1746 		needed = Py_SIZE(other);
       
  1747 		if (self == other) {
       
  1748 			/* Special case "self[i:j] = self" -- copy self first */
       
  1749 			int ret;
       
  1750 			value = array_slice(other, 0, needed);
       
  1751 			if (value == NULL)
       
  1752 				return -1;
       
  1753 			ret = array_ass_subscr(self, item, value);
       
  1754 			Py_DECREF(value);
       
  1755 			return ret;
       
  1756 		}
       
  1757 		if (other->ob_descr != self->ob_descr) {
       
  1758 			PyErr_BadArgument();
       
  1759 			return -1;
       
  1760 		}
       
  1761 	}
       
  1762 	else {
       
  1763 		PyErr_Format(PyExc_TypeError,
       
  1764 	     "can only assign array (not \"%.200s\") to array slice",
       
  1765 			     Py_TYPE(value)->tp_name);
       
  1766 		return -1;
       
  1767 	}
       
  1768 	itemsize = self->ob_descr->itemsize;
       
  1769 	/* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
       
  1770 	if ((step > 0 && stop < start) ||
       
  1771 	    (step < 0 && stop > start))
       
  1772 		stop = start;
       
  1773 	if (step == 1) {
       
  1774 		if (slicelength > needed) {
       
  1775 			memmove(self->ob_item + (start + needed) * itemsize,
       
  1776 				self->ob_item + stop * itemsize,
       
  1777 				(Py_SIZE(self) - stop) * itemsize);
       
  1778 			if (array_resize(self, Py_SIZE(self) +
       
  1779 					 needed - slicelength) < 0)
       
  1780 				return -1;
       
  1781 		}
       
  1782 		else if (slicelength < needed) {
       
  1783 			if (array_resize(self, Py_SIZE(self) +
       
  1784 					 needed - slicelength) < 0)
       
  1785 				return -1;
       
  1786 			memmove(self->ob_item + (start + needed) * itemsize,
       
  1787 				self->ob_item + stop * itemsize,
       
  1788 				(Py_SIZE(self) - start - needed) * itemsize);
       
  1789 		}
       
  1790 		if (needed > 0)
       
  1791 			memcpy(self->ob_item + start * itemsize,
       
  1792 			       other->ob_item, needed * itemsize);
       
  1793 		return 0;
       
  1794 	}
       
  1795 	else if (needed == 0) {
       
  1796 		/* Delete slice */
       
  1797 		Py_ssize_t cur, i;
       
  1798 		
       
  1799 		if (step < 0) {
       
  1800 			stop = start + 1;
       
  1801 			start = stop + step * (slicelength - 1) - 1;
       
  1802 			step = -step;
       
  1803 		}
       
  1804 		for (cur = start, i = 0; i < slicelength;
       
  1805 		     cur += step, i++) {
       
  1806 			Py_ssize_t lim = step - 1;
       
  1807 
       
  1808 			if (cur + step >= Py_SIZE(self))
       
  1809 				lim = Py_SIZE(self) - cur - 1;
       
  1810 			memmove(self->ob_item + (cur - i) * itemsize,
       
  1811 				self->ob_item + (cur + 1) * itemsize,
       
  1812 				lim * itemsize);
       
  1813 		}
       
  1814 		cur = start + slicelength * step;
       
  1815 		if (cur < Py_SIZE(self)) {
       
  1816 			memmove(self->ob_item + (cur-slicelength) * itemsize,
       
  1817 				self->ob_item + cur * itemsize,
       
  1818 				(Py_SIZE(self) - cur) * itemsize);
       
  1819 		}
       
  1820 		if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
       
  1821 			return -1;
       
  1822 		return 0;
       
  1823 	}
       
  1824 	else {
       
  1825 		Py_ssize_t cur, i;
       
  1826 
       
  1827 		if (needed != slicelength) {
       
  1828 			PyErr_Format(PyExc_ValueError,
       
  1829 				"attempt to assign array of size %zd "
       
  1830 				"to extended slice of size %zd",
       
  1831 				needed, slicelength);
       
  1832 			return -1;
       
  1833 		}
       
  1834 		for (cur = start, i = 0; i < slicelength;
       
  1835 		     cur += step, i++) {
       
  1836 			memcpy(self->ob_item + cur * itemsize,
       
  1837 			       other->ob_item + i * itemsize,
       
  1838 			       itemsize);
       
  1839 		}
       
  1840 		return 0;
       
  1841 	}
       
  1842 }
       
  1843 
       
  1844 static PyMappingMethods array_as_mapping = {
       
  1845 	(lenfunc)array_length,
       
  1846 	(binaryfunc)array_subscr,
       
  1847 	(objobjargproc)array_ass_subscr
       
  1848 };
       
  1849 
       
  1850 static const void *emptybuf = "";
       
  1851 
       
  1852 static Py_ssize_t
       
  1853 array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
       
  1854 {
       
  1855 	if ( index != 0 ) {
       
  1856 		PyErr_SetString(PyExc_SystemError,
       
  1857 				"Accessing non-existent array segment");
       
  1858 		return -1;
       
  1859 	}
       
  1860 	*ptr = (void *)self->ob_item;
       
  1861 	if (*ptr == NULL)
       
  1862 		*ptr = emptybuf;
       
  1863 	return Py_SIZE(self)*self->ob_descr->itemsize;
       
  1864 }
       
  1865 
       
  1866 static Py_ssize_t
       
  1867 array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
       
  1868 {
       
  1869 	if ( index != 0 ) {
       
  1870 		PyErr_SetString(PyExc_SystemError,
       
  1871 				"Accessing non-existent array segment");
       
  1872 		return -1;
       
  1873 	}
       
  1874 	*ptr = (void *)self->ob_item;
       
  1875 	if (*ptr == NULL)
       
  1876 		*ptr = emptybuf;
       
  1877 	return Py_SIZE(self)*self->ob_descr->itemsize;
       
  1878 }
       
  1879 
       
  1880 static Py_ssize_t
       
  1881 array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
       
  1882 {
       
  1883 	if ( lenp )
       
  1884 		*lenp = Py_SIZE(self)*self->ob_descr->itemsize;
       
  1885 	return 1;
       
  1886 }
       
  1887 
       
  1888 static PySequenceMethods array_as_sequence = {
       
  1889 	(lenfunc)array_length,		        /*sq_length*/
       
  1890 	(binaryfunc)array_concat,               /*sq_concat*/
       
  1891 	(ssizeargfunc)array_repeat,		/*sq_repeat*/
       
  1892 	(ssizeargfunc)array_item,		        /*sq_item*/
       
  1893 	(ssizessizeargfunc)array_slice,		/*sq_slice*/
       
  1894 	(ssizeobjargproc)array_ass_item,		/*sq_ass_item*/
       
  1895 	(ssizessizeobjargproc)array_ass_slice,	/*sq_ass_slice*/
       
  1896 	(objobjproc)array_contains,		/*sq_contains*/
       
  1897 	(binaryfunc)array_inplace_concat,	/*sq_inplace_concat*/
       
  1898 	(ssizeargfunc)array_inplace_repeat	/*sq_inplace_repeat*/
       
  1899 };
       
  1900 
       
  1901 static PyBufferProcs array_as_buffer = {
       
  1902 	(readbufferproc)array_buffer_getreadbuf,
       
  1903 	(writebufferproc)array_buffer_getwritebuf,
       
  1904 	(segcountproc)array_buffer_getsegcount,
       
  1905 	NULL,
       
  1906 };
       
  1907 
       
  1908 static PyObject *
       
  1909 array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
       
  1910 {
       
  1911 	char c;
       
  1912 	PyObject *initial = NULL, *it = NULL;
       
  1913 	struct arraydescr *descr;
       
  1914 	
       
  1915 	if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
       
  1916 		return NULL;
       
  1917 
       
  1918 	if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
       
  1919 		return NULL;
       
  1920 
       
  1921 	if (!(initial == NULL || PyList_Check(initial)
       
  1922 	      || PyString_Check(initial) || PyTuple_Check(initial)
       
  1923 	      || (c == 'u' && PyUnicode_Check(initial)))) {
       
  1924 		it = PyObject_GetIter(initial);
       
  1925 		if (it == NULL)
       
  1926 			return NULL;
       
  1927 		/* We set initial to NULL so that the subsequent code
       
  1928 		   will create an empty array of the appropriate type
       
  1929 		   and afterwards we can use array_iter_extend to populate
       
  1930 		   the array.
       
  1931 		*/
       
  1932 		initial = NULL;
       
  1933 	}
       
  1934 	for (descr = descriptors; descr->typecode != '\0'; descr++) {
       
  1935 		if (descr->typecode == c) {
       
  1936 			PyObject *a;
       
  1937 			Py_ssize_t len;
       
  1938 
       
  1939 			if (initial == NULL || !(PyList_Check(initial) 
       
  1940 				|| PyTuple_Check(initial)))
       
  1941 				len = 0;
       
  1942 			else
       
  1943 				len = PySequence_Size(initial);
       
  1944 
       
  1945 			a = newarrayobject(type, len, descr);
       
  1946 			if (a == NULL)
       
  1947 				return NULL;
       
  1948 
       
  1949 			if (len > 0) {
       
  1950 				Py_ssize_t i;
       
  1951 				for (i = 0; i < len; i++) {
       
  1952 					PyObject *v =
       
  1953 					        PySequence_GetItem(initial, i);
       
  1954 					if (v == NULL) {
       
  1955 						Py_DECREF(a);
       
  1956 						return NULL;
       
  1957 					}
       
  1958 					if (setarrayitem(a, i, v) != 0) {
       
  1959 						Py_DECREF(v);
       
  1960 						Py_DECREF(a);
       
  1961 						return NULL;
       
  1962 					}
       
  1963 					Py_DECREF(v);
       
  1964 				}
       
  1965 			} else if (initial != NULL && PyString_Check(initial)) {
       
  1966 				PyObject *t_initial, *v;
       
  1967 				t_initial = PyTuple_Pack(1, initial);
       
  1968 				if (t_initial == NULL) {
       
  1969 					Py_DECREF(a);
       
  1970 					return NULL;
       
  1971 				}
       
  1972 				v = array_fromstring((arrayobject *)a,
       
  1973 							 t_initial);
       
  1974 				Py_DECREF(t_initial);
       
  1975 				if (v == NULL) {
       
  1976 					Py_DECREF(a);
       
  1977 					return NULL;
       
  1978 				}
       
  1979 				Py_DECREF(v);
       
  1980 #ifdef Py_USING_UNICODE
       
  1981 			} else if (initial != NULL && PyUnicode_Check(initial))  {
       
  1982 				Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
       
  1983 				if (n > 0) {
       
  1984 					arrayobject *self = (arrayobject *)a;
       
  1985 					char *item = self->ob_item;
       
  1986 					item = (char *)PyMem_Realloc(item, n);
       
  1987 					if (item == NULL) {
       
  1988 						PyErr_NoMemory();
       
  1989 						Py_DECREF(a);
       
  1990 						return NULL;
       
  1991 					}
       
  1992 					self->ob_item = item;
       
  1993 					Py_SIZE(self) = n / sizeof(Py_UNICODE);
       
  1994 					memcpy(item, PyUnicode_AS_DATA(initial), n);
       
  1995 					self->allocated = Py_SIZE(self);
       
  1996 				}
       
  1997 #endif
       
  1998 			}
       
  1999 			if (it != NULL) {
       
  2000 				if (array_iter_extend((arrayobject *)a, it) == -1) {
       
  2001 					Py_DECREF(it);
       
  2002 					Py_DECREF(a);
       
  2003 					return NULL;
       
  2004 				}
       
  2005 				Py_DECREF(it);
       
  2006 			}
       
  2007 			return a;
       
  2008 		}
       
  2009 	}
       
  2010 	PyErr_SetString(PyExc_ValueError,
       
  2011 		"bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");
       
  2012 	return NULL;
       
  2013 }
       
  2014 
       
  2015 
       
  2016 PyDoc_STRVAR(module_doc,
       
  2017 "This module defines an object type which can efficiently represent\n\
       
  2018 an array of basic values: characters, integers, floating point\n\
       
  2019 numbers.  Arrays are sequence types and behave very much like lists,\n\
       
  2020 except that the type of objects stored in them is constrained.  The\n\
       
  2021 type is specified at object creation time by using a type code, which\n\
       
  2022 is a single character.  The following type codes are defined:\n\
       
  2023 \n\
       
  2024     Type code   C Type             Minimum size in bytes \n\
       
  2025     'c'         character          1 \n\
       
  2026     'b'         signed integer     1 \n\
       
  2027     'B'         unsigned integer   1 \n\
       
  2028     'u'         Unicode character  2 \n\
       
  2029     'h'         signed integer     2 \n\
       
  2030     'H'         unsigned integer   2 \n\
       
  2031     'i'         signed integer     2 \n\
       
  2032     'I'         unsigned integer   2 \n\
       
  2033     'l'         signed integer     4 \n\
       
  2034     'L'         unsigned integer   4 \n\
       
  2035     'f'         floating point     4 \n\
       
  2036     'd'         floating point     8 \n\
       
  2037 \n\
       
  2038 The constructor is:\n\
       
  2039 \n\
       
  2040 array(typecode [, initializer]) -- create a new array\n\
       
  2041 ");
       
  2042 
       
  2043 PyDoc_STRVAR(arraytype_doc,
       
  2044 "array(typecode [, initializer]) -> array\n\
       
  2045 \n\
       
  2046 Return a new array whose items are restricted by typecode, and\n\
       
  2047 initialized from the optional initializer value, which must be a list,\n\
       
  2048 string. or iterable over elements of the appropriate type.\n\
       
  2049 \n\
       
  2050 Arrays represent basic values and behave very much like lists, except\n\
       
  2051 the type of objects stored in them is constrained.\n\
       
  2052 \n\
       
  2053 Methods:\n\
       
  2054 \n\
       
  2055 append() -- append a new item to the end of the array\n\
       
  2056 buffer_info() -- return information giving the current memory info\n\
       
  2057 byteswap() -- byteswap all the items of the array\n\
       
  2058 count() -- return number of occurences of an object\n\
       
  2059 extend() -- extend array by appending multiple elements from an iterable\n\
       
  2060 fromfile() -- read items from a file object\n\
       
  2061 fromlist() -- append items from the list\n\
       
  2062 fromstring() -- append items from the string\n\
       
  2063 index() -- return index of first occurence of an object\n\
       
  2064 insert() -- insert a new item into the array at a provided position\n\
       
  2065 pop() -- remove and return item (default last)\n\
       
  2066 read() -- DEPRECATED, use fromfile()\n\
       
  2067 remove() -- remove first occurence of an object\n\
       
  2068 reverse() -- reverse the order of the items in the array\n\
       
  2069 tofile() -- write all items to a file object\n\
       
  2070 tolist() -- return the array converted to an ordinary list\n\
       
  2071 tostring() -- return the array converted to a string\n\
       
  2072 write() -- DEPRECATED, use tofile()\n\
       
  2073 \n\
       
  2074 Attributes:\n\
       
  2075 \n\
       
  2076 typecode -- the typecode character used to create the array\n\
       
  2077 itemsize -- the length in bytes of one array item\n\
       
  2078 ");
       
  2079 
       
  2080 static PyObject *array_iter(arrayobject *ao);
       
  2081 
       
  2082 static PyTypeObject Arraytype = {
       
  2083 	PyVarObject_HEAD_INIT(NULL, 0)
       
  2084 	"array.array",
       
  2085 	sizeof(arrayobject),
       
  2086 	0,
       
  2087 	(destructor)array_dealloc,		/* tp_dealloc */
       
  2088 	0,					/* tp_print */
       
  2089 	0,					/* tp_getattr */
       
  2090 	0,					/* tp_setattr */
       
  2091 	0,					/* tp_compare */
       
  2092 	(reprfunc)array_repr,			/* tp_repr */
       
  2093 	0,					/* tp_as_number*/
       
  2094 	&array_as_sequence,			/* tp_as_sequence*/
       
  2095 	&array_as_mapping,			/* tp_as_mapping*/
       
  2096 	0, 					/* tp_hash */
       
  2097 	0,					/* tp_call */
       
  2098 	0,					/* tp_str */
       
  2099 	PyObject_GenericGetAttr,		/* tp_getattro */
       
  2100 	0,					/* tp_setattro */
       
  2101 	&array_as_buffer,			/* tp_as_buffer*/
       
  2102 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,  /* tp_flags */
       
  2103 	arraytype_doc,				/* tp_doc */
       
  2104  	0,					/* tp_traverse */
       
  2105 	0,					/* tp_clear */
       
  2106 	array_richcompare,			/* tp_richcompare */
       
  2107 	offsetof(arrayobject, weakreflist),	/* tp_weaklistoffset */
       
  2108 	(getiterfunc)array_iter,		/* tp_iter */
       
  2109 	0,					/* tp_iternext */
       
  2110 	array_methods,				/* tp_methods */
       
  2111 	0,					/* tp_members */
       
  2112 	array_getsets,				/* tp_getset */
       
  2113 	0,					/* tp_base */
       
  2114 	0,					/* tp_dict */
       
  2115 	0,					/* tp_descr_get */
       
  2116 	0,					/* tp_descr_set */
       
  2117 	0,					/* tp_dictoffset */
       
  2118 	0,					/* tp_init */
       
  2119 	PyType_GenericAlloc,			/* tp_alloc */
       
  2120 	array_new,				/* tp_new */
       
  2121 	PyObject_Del,				/* tp_free */
       
  2122 };
       
  2123 
       
  2124 
       
  2125 /*********************** Array Iterator **************************/
       
  2126 
       
  2127 typedef struct {
       
  2128 	PyObject_HEAD
       
  2129 	Py_ssize_t			index;
       
  2130 	arrayobject		*ao;
       
  2131 	PyObject		* (*getitem)(struct arrayobject *, Py_ssize_t);
       
  2132 } arrayiterobject;
       
  2133 
       
  2134 static PyTypeObject PyArrayIter_Type;
       
  2135 
       
  2136 #define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
       
  2137 
       
  2138 static PyObject *
       
  2139 array_iter(arrayobject *ao)
       
  2140 {
       
  2141 	arrayiterobject *it;
       
  2142 
       
  2143 	if (!array_Check(ao)) {
       
  2144 		PyErr_BadInternalCall();
       
  2145 		return NULL;
       
  2146 	}
       
  2147 
       
  2148 	it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
       
  2149 	if (it == NULL)
       
  2150 		return NULL;
       
  2151 
       
  2152 	Py_INCREF(ao);
       
  2153 	it->ao = ao;
       
  2154 	it->index = 0;
       
  2155 	it->getitem = ao->ob_descr->getitem;
       
  2156 	PyObject_GC_Track(it);
       
  2157 	return (PyObject *)it;
       
  2158 }
       
  2159 
       
  2160 static PyObject *
       
  2161 arrayiter_next(arrayiterobject *it)
       
  2162 {
       
  2163 	assert(PyArrayIter_Check(it));
       
  2164 	if (it->index < Py_SIZE(it->ao))
       
  2165 		return (*it->getitem)(it->ao, it->index++);
       
  2166 	return NULL;
       
  2167 }
       
  2168 
       
  2169 static void
       
  2170 arrayiter_dealloc(arrayiterobject *it)
       
  2171 {
       
  2172 	PyObject_GC_UnTrack(it);
       
  2173 	Py_XDECREF(it->ao);
       
  2174 	PyObject_GC_Del(it);
       
  2175 }
       
  2176 
       
  2177 static int
       
  2178 arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
       
  2179 {
       
  2180 	Py_VISIT(it->ao);
       
  2181 	return 0;
       
  2182 }
       
  2183 
       
  2184 static PyTypeObject PyArrayIter_Type = {
       
  2185 	PyVarObject_HEAD_INIT(NULL, 0)
       
  2186 	"arrayiterator",                        /* tp_name */
       
  2187 	sizeof(arrayiterobject),                /* tp_basicsize */
       
  2188 	0,                                      /* tp_itemsize */
       
  2189 	/* methods */
       
  2190 	(destructor)arrayiter_dealloc,		/* tp_dealloc */
       
  2191 	0,                                      /* tp_print */
       
  2192 	0,                                      /* tp_getattr */
       
  2193 	0,                                      /* tp_setattr */
       
  2194 	0,                                      /* tp_compare */
       
  2195 	0,                                      /* tp_repr */
       
  2196 	0,                                      /* tp_as_number */
       
  2197 	0,                                      /* tp_as_sequence */
       
  2198 	0,                                      /* tp_as_mapping */
       
  2199 	0,                                      /* tp_hash */
       
  2200 	0,                                      /* tp_call */
       
  2201 	0,                                      /* tp_str */
       
  2202 	PyObject_GenericGetAttr,                /* tp_getattro */
       
  2203 	0,                                      /* tp_setattro */
       
  2204 	0,                                      /* tp_as_buffer */
       
  2205 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
       
  2206 	0,                                      /* tp_doc */
       
  2207 	(traverseproc)arrayiter_traverse,	/* tp_traverse */
       
  2208 	0,					/* tp_clear */
       
  2209 	0,                                      /* tp_richcompare */
       
  2210 	0,                                      /* tp_weaklistoffset */
       
  2211 	PyObject_SelfIter,			/* tp_iter */
       
  2212 	(iternextfunc)arrayiter_next,		/* tp_iternext */
       
  2213 	0,					/* tp_methods */
       
  2214 };
       
  2215 
       
  2216 
       
  2217 /*********************** Install Module **************************/
       
  2218 
       
  2219 /* No functions in array module. */
       
  2220 static PyMethodDef a_methods[] = {
       
  2221     {NULL, NULL, 0, NULL}        /* Sentinel */
       
  2222 };
       
  2223 
       
  2224 
       
  2225 PyMODINIT_FUNC
       
  2226 initarray(void)
       
  2227 {
       
  2228 	PyObject *m;
       
  2229 
       
  2230 	Arraytype.ob_type = &PyType_Type;
       
  2231 	PyArrayIter_Type.ob_type = &PyType_Type;
       
  2232 	m = Py_InitModule3("array", a_methods, module_doc);
       
  2233 	if (m == NULL)
       
  2234 		return;
       
  2235 
       
  2236         Py_INCREF((PyObject *)&Arraytype);
       
  2237 	PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
       
  2238         Py_INCREF((PyObject *)&Arraytype);
       
  2239 	PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
       
  2240 	/* No need to check the error here, the caller will do that */
       
  2241 }