rangeobject.c revision 7ce3694a527afe425a2b9df65c049b0ef4e75960
112d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 212d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum/* Range object implementation */ 312d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 4c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum#include "Python.h" 50b796fa5c56611341f039c5ab6ed17a2b63833d2Fred Drake#include "structmember.h" 60b796fa5c56611341f039c5ab6ed17a2b63833d2Fred Drake#include <string.h> 712d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 8efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters#define WARN(msg) if (PyErr_Warn(PyExc_DeprecationWarning, msg) < 0) \ 9efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return NULL; 10efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 1112d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossumtypedef struct { 12c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum PyObject_HEAD 1312d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum long start; 1412d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum long step; 1512d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum long len; 16efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters int reps; 17efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters long totlen; 1812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum} rangeobject; 1912d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 20efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersstatic int 21efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouterslong_mul(long i, long j, long *kk) 22efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters{ 23efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyObject *a; 24efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyObject *b; 25efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyObject *c; 26efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 27efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if ((a = PyInt_FromLong(i)) == NULL) 28efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return 0; 29efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 30efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if ((b = PyInt_FromLong(j)) == NULL) 31efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return 0; 32efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 33efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters c = PyNumber_Multiply(a, b); 34efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 35efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters Py_DECREF(a); 36efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters Py_DECREF(b); 37efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 38efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (c == NULL) 39efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return 0; 40efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 41efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters *kk = PyInt_AS_LONG(c); 42efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters Py_DECREF(c); 43efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 44efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (*kk > INT_MAX) { 45efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyErr_SetString(PyExc_OverflowError, 46efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "integer multiplication"); 47efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return 0; 48efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters } 49efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else 50efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return 1; 51efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters} 52efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 53c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van RossumPyObject * 54efafcea2805436c12fd6544d9bff355cfac061d8Thomas WoutersPyRange_New(long start, long len, long step, int reps) 5512d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{ 56efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters long totlen = -1; 57c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum rangeobject *obj = PyObject_NEW(rangeobject, &PyRange_Type); 5812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 599e8f4ea0aa469e5818b859836a332cfed8f81af7Guido van Rossum if (obj == NULL) 609e8f4ea0aa469e5818b859836a332cfed8f81af7Guido van Rossum return NULL; 61efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 62efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (reps != 1) 63efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters WARN("PyRange_New's 'repetitions' argument is deprecated"); 649e8f4ea0aa469e5818b859836a332cfed8f81af7Guido van Rossum 65efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (len == 0 || reps <= 0) { 6665e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum start = 0; 6765e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum len = 0; 6865e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum step = 1; 69efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters reps = 1; 70efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters totlen = 0; 7165e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum } 7265e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum else { 7365e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum long last = start + (len - 1) * step; 7465e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum if ((step > 0) ? 75efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters (last > (PyInt_GetMax() - step)) : 76efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters (last < (-1 - PyInt_GetMax() - step))) { 7765e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum PyErr_SetString(PyExc_OverflowError, 7865e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum "integer addition"); 7965e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum return NULL; 80efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters } 81efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (! long_mul(len, (long) reps, &totlen)) { 82efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if(!PyErr_ExceptionMatches(PyExc_OverflowError)) 83efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return NULL; 84efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyErr_Clear(); 85efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters totlen = -1; 8665e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum } 8765e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum } 8865e0b99b611a42fd6548b2783a234f32630e6f1bGuido van Rossum 8912d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum obj->start = start; 9012d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum obj->len = len; 9112d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum obj->step = step; 92efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters obj->reps = reps; 93efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters obj->totlen = totlen; 9412d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 95c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum return (PyObject *) obj; 9612d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum} 9712d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 9812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossumstatic void 9945cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_dealloc(rangeobject *r) 10012d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{ 101b18618dab7b6b85bb05b084693706e59211fa180Guido van Rossum PyObject_DEL(r); 10212d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum} 10312d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 104c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PyObject * 10545cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_item(rangeobject *r, int i) 10612d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{ 107efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (i < 0 || i >= r->totlen) 108efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (r->totlen!=-1) { 109efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyErr_SetString(PyExc_IndexError, 1105dadf7e976c55ac3960f79aaa5741ab37a10cdf4Guido van Rossum "xrange object index out of range"); 111efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return NULL; 112efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters } 11312d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 114c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum return PyInt_FromLong(r->start + (i % r->len) * r->step); 11512d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum} 11612d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 11712d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossumstatic int 11845cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_length(rangeobject *r) 11912d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{ 120efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (r->totlen == -1) 121efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyErr_SetString(PyExc_OverflowError, 122efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "xrange object has too many items"); 123efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return r->totlen; 1247d6aa51b56c6337ad5b1cb880f7c075290777f51Guido van Rossum} 1257d6aa51b56c6337ad5b1cb880f7c075290777f51Guido van Rossum 126c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PyObject * 12745cfbcccc287ae52656737466ca071ca18f603c7Fred Drakerange_repr(rangeobject *r) 12812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{ 1297ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw PyObject *rtn; 1307ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw 13172d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters if (r->start == 0 && r->step == 1) 1327ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = PyString_FromFormat("xrange(%ld)", 1337ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start + r->len * r->step); 13472d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters 13572d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters else if (r->step == 1) 1367ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = PyString_FromFormat("xrange(%ld, %ld)", 1377ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start, 1387ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start + r->len * r->step); 13972d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters 14072d421b75ca05f54ff4f5df4aac5291d6c568ae8Tim Peters else 1417ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)", 1427ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start, 1437ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->start + r->len * r->step, 1447ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw r->step); 1457ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw if (r->reps != 1) { 1467ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw PyObject *extra = PyString_FromFormat( 1477ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw "(%s * %d)", 1487ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw PyString_AS_STRING(rtn), r->reps); 1497ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw Py_DECREF(rtn); 1507ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw rtn = extra; 1517ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw } 1527ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw return rtn; 153efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters} 154efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 155efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersstatic PyObject * 156efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersrange_repeat(rangeobject *r, int n) 157efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters{ 158efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters long lreps = 0; 159efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 160efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters WARN("xrange object multiplication is deprecated; " 161efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "convert to list instead"); 162efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 163efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (n <= 0) 164efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return (PyObject *) PyRange_New(0, 0, 1, 1); 165efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 166efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else if (n == 1) { 167efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters Py_INCREF(r); 168efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return (PyObject *) r; 169efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters } 170efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 171efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else if (! long_mul((long) r->reps, (long) n, &lreps)) 172efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return NULL; 173efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 174efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else 175efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return (PyObject *) PyRange_New( 176efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters r->start, 177efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters r->len, 178efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters r->step, 179efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters (int) lreps); 180efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters} 181efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 182efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersstatic int 183efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersrange_compare(rangeobject *r1, rangeobject *r2) 184efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters{ 185efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 186efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (PyErr_Warn(PyExc_DeprecationWarning, 187efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "xrange object comparision is deprecated; " 188efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "convert to list instead") < 0) 189efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return -1; 190efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 191efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (r1->start != r2->start) 192efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return r1->start - r2->start; 193efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 194efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else if (r1->step != r2->step) 195efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return r1->step - r2->step; 196efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 197efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else if (r1->len != r2->len) 198efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return r1->len - r2->len; 199efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 200efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else 201efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return r1->reps - r2->reps; 202efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters} 203efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 204efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersstatic PyObject * 205efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersrange_slice(rangeobject *r, int low, int high) 206efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters{ 207efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters WARN("xrange object slicing is deprecated; " 208efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "convert to list instead"); 209efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 210efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (r->reps != 1) { 211efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyErr_SetString(PyExc_TypeError, 212efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "cannot slice a replicated xrange"); 213efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return NULL; 214efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters } 215efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (low < 0) 216efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters low = 0; 217efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else if (low > r->len) 218efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters low = r->len; 219efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (high < 0) 220efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters high = 0; 221efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (high < low) 222efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters high = low; 223efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else if (high > r->len) 224efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters high = r->len; 225efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 226efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (low == 0 && high == r->len) { 227efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters Py_INCREF(r); 228efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return (PyObject *) r; 229efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters } 230efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 231efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return (PyObject *) PyRange_New( 232efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters low * r->step + r->start, 233efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters high - low, 234efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters r->step, 235efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 1); 236efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters} 237efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 238efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersstatic PyObject * 239efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersrange_tolist(rangeobject *self, PyObject *args) 240efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters{ 241efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyObject *thelist; 242efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters int j; 243efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 244efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters WARN("xrange.tolist() is deprecated; use list(xrange) instead"); 245efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 246efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (self->totlen == -1) 247efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return PyErr_NoMemory(); 248efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 249efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if ((thelist = PyList_New(self->totlen)) == NULL) 250efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return NULL; 251efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 252efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters for (j = 0; j < self->totlen; ++j) 253efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if ((PyList_SetItem(thelist, j, (PyObject *) PyInt_FromLong( 254efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters self->start + (j % self->len) * self->step))) < 0) 255efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return NULL; 256efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 257efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return thelist; 258efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters} 259efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 260efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersstatic PyObject * 261efafcea2805436c12fd6544d9bff355cfac061d8Thomas Woutersrange_getattr(rangeobject *r, char *name) 262efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters{ 263efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyObject *result; 264efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 265efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters static PyMethodDef range_methods[] = { 266e3eb1f2b2320bceb10a763ec8691200b85ec287aMartin v. Löwis {"tolist", (PyCFunction)range_tolist, METH_NOARGS, 267efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "tolist() -> list\n" 268efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "Return a list object with the same values.\n" 269efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "(This method is deprecated; use list() instead.)"}, 270efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters {NULL, NULL} 271efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters }; 272efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters static struct memberlist range_members[] = { 273efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters {"step", T_LONG, offsetof(rangeobject, step), RO}, 274efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters {"start", T_LONG, offsetof(rangeobject, start), RO}, 275efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters {"stop", T_LONG, 0, RO}, 276efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters {NULL, 0, 0, 0} 277efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters }; 278efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 279efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters result = Py_FindMethod(range_methods, (PyObject *) r, name); 280efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (result == NULL) { 281efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters PyErr_Clear(); 282efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (strcmp("stop", name) == 0) 283efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters result = PyInt_FromLong(r->start + (r->len * r->step)); 284efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters else 285efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters result = PyMember_Get((char *)r, range_members, name); 286efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters if (result) 287efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters WARN("xrange object's 'start', 'stop' and 'step' " 288efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters "attributes are deprecated"); 289efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters } 290efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters return result; 29156780257c624996758237f96ce59fe3068f86debFred Drake} 29256780257c624996758237f96ce59fe3068f86debFred Drake 293c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossumstatic PySequenceMethods range_as_sequence = { 2940b796fa5c56611341f039c5ab6ed17a2b63833d2Fred Drake (inquiry)range_length, /*sq_length*/ 2953f56166b1aff15136960dfc8ad90f571e14be01aGuido van Rossum 0, /*sq_concat*/ 296efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters (intargfunc)range_repeat, /*sq_repeat*/ 297efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters (intargfunc)range_item, /*sq_item*/ 298efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters (intintargfunc)range_slice, /*sq_slice*/ 2990b796fa5c56611341f039c5ab6ed17a2b63833d2Fred Drake 0, /*sq_ass_item*/ 3000b796fa5c56611341f039c5ab6ed17a2b63833d2Fred Drake 0, /*sq_ass_slice*/ 301efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 0, /*sq_contains*/ 30212d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum}; 30312d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 304c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van RossumPyTypeObject PyRange_Type = { 305c0b618a2ccfb0fc39e07ee96dc09da77fbcce1b1Guido van Rossum PyObject_HEAD_INIT(&PyType_Type) 30612d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 0, /* Number of items for varobject */ 3072586bf0a3434fc0430b6c16a56ad2b950eabc589Guido van Rossum "xrange", /* Name of this type */ 30812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum sizeof(rangeobject), /* Basic object size */ 30912d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum 0, /* Item size for varobject */ 3106d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (destructor)range_dealloc, /*tp_dealloc*/ 3116d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_print*/ 3126d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (getattrfunc)range_getattr, /*tp_getattr*/ 3136d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_setattr*/ 3146d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (cmpfunc)range_compare, /*tp_compare*/ 3156d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (reprfunc)range_repr, /*tp_repr*/ 3166d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_as_number*/ 3176d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters &range_as_sequence, /*tp_as_sequence*/ 3186d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_as_mapping*/ 3196d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_hash*/ 3206d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_call*/ 3216d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_str*/ 3226d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyObject_GenericGetAttr, /*tp_getattro*/ 3236d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_setattro*/ 3246d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /*tp_as_buffer*/ 3256d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters Py_TPFLAGS_DEFAULT, /*tp_flags*/ 3266d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_doc */ 3276d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_traverse */ 3286d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_clear */ 3296d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_richcompare */ 3306d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_weaklistoffset */ 3316d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_iter */ 3326d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_iternext */ 3336d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_methods */ 3346d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_members */ 3356d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_getset */ 3366d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_base */ 3376d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_dict */ 33812d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum}; 339efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters 340efafcea2805436c12fd6544d9bff355cfac061d8Thomas Wouters#undef WARN 341