Update of /cvsroot/python/python/dist/src/Objects In directory usw-pr-cvs1:/tmp/cvs-serv22592/Objects Modified Files: longobject.c Log Message: Make long a new style number type. Sequence repeat is now done here now as well. Index: longobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/longobject.c,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -r1.69 -r1.70 *** longobject.c 2000/10/24 19:57:45 1.69 --- longobject.c 2001/01/04 01:46:03 1.70 *************** *** 458,461 **** --- 458,495 ---- #endif /* HAVE_LONG_LONG */ + + static int + convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) { + if (PyLong_Check(v)) { + *a = (PyLongObject *) v; + Py_INCREF(v); + } + else if (PyInt_Check(v)) { + *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v)); + } + else { + return 0; + } + if (PyLong_Check(w)) { + *b = (PyLongObject *) w; + Py_INCREF(w); + } + else if (PyInt_Check(w)) { + *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w)); + } + else { + Py_DECREF(*a); + return 0; + } + return 1; + } + + #define CONVERT_BINOP(v, w, a, b) \ + if (!convert_binop(v, w, a, b)) { \ + Py_INCREF(Py_NotImplemented); \ + return Py_NotImplemented; \ + } + + /* Multiply by a single digit, ignoring the sign. */ *************** *** 933,936 **** --- 967,983 ---- } + /* Needed for the new style number compare slots */ + static PyObject * + long_cmp(PyObject *v, PyObject *w) + { + PyLongObject *a, *b; + int c; + CONVERT_BINOP(v, w, &a, &b); + c = long_compare(a, b); + Py_DECREF(a); + Py_DECREF(b); + return PyInt_FromLong(c); + } + static long long_hash(PyLongObject *v) *************** *** 1051,1058 **** static PyObject * ! long_add(PyLongObject *a, PyLongObject *b) { ! PyLongObject *z; if (a->ob_size < 0) { if (b->ob_size < 0) { --- 1098,1107 ---- static PyObject * ! long_add(PyLongObject *v, PyLongObject *w) { ! PyLongObject *a, *b, *z; + CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); + if (a->ob_size < 0) { if (b->ob_size < 0) { *************** *** 1070,1081 **** z = x_add(a, b); } return (PyObject *)z; } static PyObject * ! long_sub(PyLongObject *a, PyLongObject *b) { ! PyLongObject *z; if (a->ob_size < 0) { if (b->ob_size < 0) --- 1119,1134 ---- z = x_add(a, b); } + Py_DECREF(a); + Py_DECREF(b); return (PyObject *)z; } static PyObject * ! long_sub(PyLongObject *v, PyLongObject *w) { ! PyLongObject *a, *b, *z; + CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); + if (a->ob_size < 0) { if (b->ob_size < 0) *************** *** 1092,1106 **** z = x_sub(a, b); } return (PyObject *)z; } static PyObject * ! long_mul(PyLongObject *a, PyLongObject *b) { int size_a; int size_b; - PyLongObject *z; int i; size_a = ABS(a->ob_size); size_b = ABS(b->ob_size); --- 1145,1183 ---- z = x_sub(a, b); } + Py_DECREF(a); + Py_DECREF(b); return (PyObject *)z; } static PyObject * ! long_repeat(PyObject *v, PyLongObject *w) { + /* sequence * long */ + long n = PyLong_AsLong((PyObject *) w); + if (n == -1 && PyErr_Occurred()) + return NULL; + else + return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n); + } + + static PyObject * + long_mul(PyLongObject *v, PyLongObject *w) + { + PyLongObject *a, *b, *z; int size_a; int size_b; int i; + if (v->ob_type->tp_as_sequence && + v->ob_type->tp_as_sequence->sq_repeat) { + return long_repeat((PyObject *)v, w); + } + else if (w->ob_type->tp_as_sequence && + w->ob_type->tp_as_sequence->sq_repeat) { + return long_repeat((PyObject *)w, v); + } + + CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); + size_a = ABS(a->ob_size); size_b = ABS(b->ob_size); *************** *** 1115,1120 **** } z = _PyLong_New(size_a + size_b); ! if (z == NULL) return NULL; for (i = 0; i < z->ob_size; ++i) z->ob_digit[i] = 0; --- 1192,1200 ---- } z = _PyLong_New(size_a + size_b); ! if (z == NULL) { ! Py_DECREF(a); ! Py_DECREF(b); return NULL; + } for (i = 0; i < z->ob_size; ++i) z->ob_digit[i] = 0; *************** *** 1125,1128 **** --- 1205,1210 ---- SIGCHECK({ + Py_DECREF(a); + Py_DECREF(b); Py_DECREF(z); return NULL; *************** *** 1144,1147 **** --- 1226,1231 ---- if (b->ob_size < 0) z->ob_size = -(z->ob_size); + Py_DECREF(a); + Py_DECREF(b); return (PyObject *) long_normalize(z); } *************** *** 1199,1207 **** static PyObject * ! long_div(PyLongObject *v, PyLongObject *w) { ! PyLongObject *div, *mod; ! if (l_divmod(v, w, &div, &mod) < 0) return NULL; Py_DECREF(mod); return (PyObject *)div; --- 1283,1299 ---- static PyObject * ! long_div(PyObject *v, PyObject *w) { ! PyLongObject *a, *b, *div, *mod; ! ! CONVERT_BINOP(v, w, &a, &b); ! ! if (l_divmod(a, b, &div, &mod) < 0) { ! Py_DECREF(a); ! Py_DECREF(b); return NULL; + } + Py_DECREF(a); + Py_DECREF(b); Py_DECREF(mod); return (PyObject *)div; *************** *** 1209,1217 **** static PyObject * ! long_mod(PyLongObject *v, PyLongObject *w) { ! PyLongObject *div, *mod; ! if (l_divmod(v, w, &div, &mod) < 0) return NULL; Py_DECREF(div); return (PyObject *)mod; --- 1301,1317 ---- static PyObject * ! long_mod(PyObject *v, PyObject *w) { ! PyLongObject *a, *b, *div, *mod; ! ! CONVERT_BINOP(v, w, &a, &b); ! ! if (l_divmod(a, b, &div, &mod) < 0) { ! Py_DECREF(a); ! Py_DECREF(b); return NULL; + } + Py_DECREF(a); + Py_DECREF(b); Py_DECREF(div); return (PyObject *)mod; *************** *** 1219,1228 **** static PyObject * ! long_divmod(PyLongObject *v, PyLongObject *w) { PyObject *z; ! PyLongObject *div, *mod; ! if (l_divmod(v, w, &div, &mod) < 0) return NULL; z = PyTuple_New(2); if (z != NULL) { --- 1319,1334 ---- static PyObject * ! long_divmod(PyObject *v, PyObject *w) { + PyLongObject *a, *b, *div, *mod; PyObject *z; ! ! CONVERT_BINOP(v, w, &a, &b); ! ! if (l_divmod(a, b, &div, &mod) < 0) { ! Py_DECREF(a); ! Py_DECREF(b); return NULL; + } z = PyTuple_New(2); if (z != NULL) { *************** *** 1234,1245 **** Py_DECREF(mod); } return z; } static PyObject * ! long_pow(PyLongObject *a, PyLongObject *b, PyLongObject *c) { PyLongObject *z, *div, *mod; int size_b, i; size_b = b->ob_size; --- 1340,1370 ---- Py_DECREF(mod); } + Py_DECREF(a); + Py_DECREF(b); return z; } static PyObject * ! long_pow(PyObject *v, PyObject *w, PyObject *x) { + PyLongObject *a, *b; + PyObject *c; PyLongObject *z, *div, *mod; int size_b, i; + + CONVERT_BINOP(v, w, &a, &b); + if (PyLong_Check(x) || Py_None == x) { + c = x; + Py_INCREF(x); + } + else if (PyInt_Check(x)) { + c = PyLong_FromLong(PyInt_AS_LONG(x)); + } + else { + Py_DECREF(a); + Py_DECREF(b); + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } size_b = b->ob_size; *************** *** 1251,1258 **** PyErr_SetString(PyExc_ZeroDivisionError, "zero to a negative power"); ! return NULL; } z = (PyLongObject *)PyLong_FromLong(1L); - Py_INCREF(a); for (i = 0; i < size_b; ++i) { digit bi = b->ob_digit[i]; --- 1376,1383 ---- PyErr_SetString(PyExc_ZeroDivisionError, "zero to a negative power"); ! z = NULL; ! goto error; } z = (PyLongObject *)PyLong_FromLong(1L); for (i = 0; i < size_b; ++i) { digit bi = b->ob_digit[i]; *************** *** 1265,1270 **** temp = (PyLongObject *)long_mul(z, a); Py_DECREF(z); ! if ((PyObject*)c!=Py_None && temp!=NULL) { ! if (l_divmod(temp,c,&div,&mod) < 0) { Py_DECREF(temp); z = NULL; --- 1390,1396 ---- temp = (PyLongObject *)long_mul(z, a); Py_DECREF(z); ! if (c!=Py_None && temp!=NULL) { ! if (l_divmod(temp,(PyLongObject *)c, ! &div,&mod) < 0) { Py_DECREF(temp); z = NULL; *************** *** 1284,1289 **** temp = (PyLongObject *)long_mul(a, a); Py_DECREF(a); ! if ((PyObject*)c!=Py_None && temp!=NULL) { ! if (l_divmod(temp, c, &div, &mod) < 0) { Py_DECREF(temp); z = NULL; --- 1410,1416 ---- temp = (PyLongObject *)long_mul(a, a); Py_DECREF(a); ! if (c!=Py_None && temp!=NULL) { ! if (l_divmod(temp, (PyLongObject *)c, &div, ! &mod) < 0) { Py_DECREF(temp); z = NULL; *************** *** 1304,1310 **** break; } ! Py_XDECREF(a); ! if ((PyObject*)c!=Py_None && z!=NULL) { ! if (l_divmod(z, c, &div, &mod) < 0) { Py_DECREF(z); z = NULL; --- 1431,1436 ---- break; } ! if (c!=Py_None && z!=NULL) { ! if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) { Py_DECREF(z); z = NULL; *************** *** 1317,1320 **** --- 1443,1449 ---- } error: + Py_XDECREF(a); + Py_DECREF(b); + Py_DECREF(c); return (PyObject *)z; } *************** *** 1383,1457 **** static PyObject * ! long_rshift(PyLongObject *a, PyLongObject *b) { ! PyLongObject *z; long shiftby; int newsize, wordshift, loshift, hishift, i, j; digit lomask, himask; if (a->ob_size < 0) { /* Right shifting negative numbers is harder */ ! PyLongObject *a1, *a2, *a3; a1 = (PyLongObject *) long_invert(a); ! if (a1 == NULL) return NULL; a2 = (PyLongObject *) long_rshift(a1, b); Py_DECREF(a1); ! if (a2 == NULL) return NULL; ! a3 = (PyLongObject *) long_invert(a2); Py_DECREF(a2); - return (PyObject *) a3; - } - - shiftby = PyLong_AsLong((PyObject *)b); - if (shiftby == -1L && PyErr_Occurred()) - return NULL; - if (shiftby < 0) { - PyErr_SetString(PyExc_ValueError, "negative shift count"); - return NULL; } ! wordshift = shiftby / SHIFT; ! newsize = ABS(a->ob_size) - wordshift; ! if (newsize <= 0) { ! z = _PyLong_New(0); ! return (PyObject *)z; ! } ! loshift = shiftby % SHIFT; ! hishift = SHIFT - loshift; ! lomask = ((digit)1 << hishift) - 1; ! himask = MASK ^ lomask; ! z = _PyLong_New(newsize); ! if (z == NULL) ! return NULL; ! if (a->ob_size < 0) ! z->ob_size = -(z->ob_size); ! for (i = 0, j = wordshift; i < newsize; i++, j++) { ! z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask; ! if (i+1 < newsize) ! z->ob_digit[i] |= ! (a->ob_digit[j+1] << hishift) & himask; } ! return (PyObject *) long_normalize(z); } static PyObject * ! long_lshift(PyLongObject *a, PyLongObject *b) { /* This version due to Tim Peters */ ! PyLongObject *z; long shiftby; int oldsize, newsize, wordshift, remshift, i, j; twodigits accum; shiftby = PyLong_AsLong((PyObject *)b); if (shiftby == -1L && PyErr_Occurred()) ! return NULL; if (shiftby < 0) { PyErr_SetString(PyExc_ValueError, "negative shift count"); ! return NULL; } if ((long)(int)shiftby != shiftby) { PyErr_SetString(PyExc_ValueError, "outrageous left shift count"); ! return NULL; } /* wordshift, remshift = divmod(shiftby, SHIFT) */ --- 1512,1603 ---- static PyObject * ! long_rshift(PyLongObject *v, PyLongObject *w) { ! PyLongObject *a, *b; ! PyLongObject *z = NULL; long shiftby; int newsize, wordshift, loshift, hishift, i, j; digit lomask, himask; + CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); + if (a->ob_size < 0) { /* Right shifting negative numbers is harder */ ! PyLongObject *a1, *a2; a1 = (PyLongObject *) long_invert(a); ! if (a1 == NULL) ! goto rshift_error; a2 = (PyLongObject *) long_rshift(a1, b); Py_DECREF(a1); ! if (a2 == NULL) ! goto rshift_error; ! z = (PyLongObject *) long_invert(a2); Py_DECREF(a2); } ! else { ! ! shiftby = PyLong_AsLong((PyObject *)b); ! if (shiftby == -1L && PyErr_Occurred()) ! goto rshift_error; ! if (shiftby < 0) { ! PyErr_SetString(PyExc_ValueError, ! "negative shift count"); ! goto rshift_error; ! } ! wordshift = shiftby / SHIFT; ! newsize = ABS(a->ob_size) - wordshift; ! if (newsize <= 0) { ! z = _PyLong_New(0); ! Py_DECREF(a); ! Py_DECREF(b); ! return (PyObject *)z; ! } ! loshift = shiftby % SHIFT; ! hishift = SHIFT - loshift; ! lomask = ((digit)1 << hishift) - 1; ! himask = MASK ^ lomask; ! z = _PyLong_New(newsize); ! if (z == NULL) ! goto rshift_error; ! if (a->ob_size < 0) ! z->ob_size = -(z->ob_size); ! for (i = 0, j = wordshift; i < newsize; i++, j++) { ! z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask; ! if (i+1 < newsize) ! z->ob_digit[i] |= ! (a->ob_digit[j+1] << hishift) & himask; ! } ! z = long_normalize(z); } ! rshift_error: ! Py_DECREF(a); ! Py_DECREF(b); ! return (PyObject *) z; ! } static PyObject * ! long_lshift(PyObject *v, PyObject *w) { /* This version due to Tim Peters */ ! PyLongObject *a, *b; ! PyLongObject *z = NULL; long shiftby; int oldsize, newsize, wordshift, remshift, i, j; twodigits accum; + CONVERT_BINOP(v, w, &a, &b); + shiftby = PyLong_AsLong((PyObject *)b); if (shiftby == -1L && PyErr_Occurred()) ! goto lshift_error; if (shiftby < 0) { PyErr_SetString(PyExc_ValueError, "negative shift count"); ! goto lshift_error; } if ((long)(int)shiftby != shiftby) { PyErr_SetString(PyExc_ValueError, "outrageous left shift count"); ! goto lshift_error; } /* wordshift, remshift = divmod(shiftby, SHIFT) */ *************** *** 1465,1469 **** z = _PyLong_New(newsize); if (z == NULL) ! return NULL; if (a->ob_size < 0) z->ob_size = -(z->ob_size); --- 1611,1615 ---- z = _PyLong_New(newsize); if (z == NULL) ! goto lshift_error; if (a->ob_size < 0) z->ob_size = -(z->ob_size); *************** *** 1480,1484 **** else assert(!accum); ! return (PyObject *) long_normalize(z); } --- 1626,1634 ---- else assert(!accum); ! z = long_normalize(z); ! lshift_error: ! Py_DECREF(a); ! Py_DECREF(b); ! return (PyObject *) z; } *************** *** 1591,1609 **** static PyObject * ! long_and(PyLongObject *a, PyLongObject *b) { ! return long_bitwise(a, '&', b); } static PyObject * ! long_xor(PyLongObject *a, PyLongObject *b) { ! return long_bitwise(a, '^', b); } static PyObject * ! long_or(PyLongObject *a, PyLongObject *b) { ! return long_bitwise(a, '|', b); } --- 1741,1777 ---- static PyObject * ! long_and(PyObject *v, PyObject *w) { ! PyLongObject *a, *b; ! PyObject *c; ! CONVERT_BINOP(v, w, &a, &b); ! c = long_bitwise(a, '&', b); ! Py_DECREF(a); ! Py_DECREF(b); ! return c; } static PyObject * ! long_xor(PyObject *v, PyObject *w) { ! PyLongObject *a, *b; ! PyObject *c; ! CONVERT_BINOP(v, w, &a, &b); ! c = long_bitwise(a, '^', b); ! Py_DECREF(a); ! Py_DECREF(b); ! return c; } static PyObject * ! long_or(PyObject *v, PyObject *w) { ! PyLongObject *a, *b; ! PyObject *c; ! CONVERT_BINOP(v, w, &a, &b); ! c = long_bitwise(a, '|', b); ! Py_DECREF(a); ! Py_DECREF(b); ! return c; } *************** *** 1612,1616 **** { if (PyInt_Check(*pw)) { ! *pw = PyLong_FromLong(PyInt_AsLong(*pw)); Py_INCREF(*pv); return 0; --- 1780,1784 ---- { if (PyInt_Check(*pw)) { ! *pw = PyLong_FromLong(PyInt_AS_LONG(*pw)); Py_INCREF(*pv); return 0; *************** *** 1682,1685 **** --- 1850,1867 ---- (unaryfunc) long_oct, /*nb_oct*/ (unaryfunc) long_hex, /*nb_hex*/ + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + 0, /*nb_inplace_divide*/ + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + + /* New style slots */ + (binaryfunc) long_cmp, /*nb_cmp*/ }; *************** *** 1702,1704 **** --- 1884,1890 ---- 0, /*tp_call*/ (reprfunc)long_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_NEWSTYLENUMBER /*tp_flags*/ };
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4