Add some more module maintainers.

This commit is contained in:
Mark Dickinson 2009-09-17 19:37:28 +00:00
parent 2c54e693b6
commit 2e72b0d603
2 changed files with 48 additions and 108 deletions

View file

@ -69,7 +69,7 @@ cmd
code code
codecs codecs
codeop codeop
collections collections rhettinger
colorsys colorsys
compileall compileall
configparser configparser
@ -120,7 +120,7 @@ imp
importlib brett.cannon importlib brett.cannon
inspect inspect
io pitrou, benjamin.peterson io pitrou, benjamin.peterson
itertools itertools rhettinger
json json
keyword keyword
lib2to3 benjamin.peterson lib2to3 benjamin.peterson
@ -166,13 +166,13 @@ pyclbr
pydoc pydoc
queue queue
quopri quopri
random random rhettinger
re re
readline readline
reprlib reprlib
resource resource
rlcompleter rlcompleter
runpy runpy ncoghlan
sched sched
select select
shelve shelve

View file

@ -1775,9 +1775,9 @@ _PyLong_Format(PyObject *aa, int base)
Py_ssize_t i, sz; Py_ssize_t i, sz;
Py_ssize_t size_a; Py_ssize_t size_a;
Py_UNICODE *p; Py_UNICODE *p;
int bits; int bits, negative;
char sign = '\0';
assert(base == 2 || base == 8 || base == 10 || base == 16);
if (base == 10) if (base == 10)
return long_to_decimal_string((PyObject *)a); return long_to_decimal_string((PyObject *)a);
@ -1785,23 +1785,34 @@ _PyLong_Format(PyObject *aa, int base)
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return NULL; return NULL;
} }
assert(base >= 2 && base <= 36);
size_a = ABS(Py_SIZE(a)); size_a = ABS(Py_SIZE(a));
negative = Py_SIZE(a) < 0;
/* Compute a rough upper bound for the length of the string */ /* Compute a rough upper bound for the length of the string */
i = base; switch (base) {
bits = 0; case 2:
while (i > 1) { bits = 1;
++bits; break;
i >>= 1; case 8:
bits = 3;
break;
case 16:
bits = 4;
break;
default:
assert(0); /* never get here */
} }
/* length of string required: +1 for negative sign, +2 for prefix */
i = 5; i = 5;
/* ensure we don't get signed overflow in sz calculation */ /* ensure we don't get signed overflow in sz calculation */
if (size_a > (PY_SSIZE_T_MAX - i) / PyLong_SHIFT) { if (size_a > (PY_SSIZE_T_MAX - 4) / PyLong_SHIFT) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"int is too large to format"); "int is too large to format");
return NULL; return NULL;
} }
sz = 3 + negative + (size_a * PyLong_SHIFT - 1) / bits;
sz = i + 1 + (size_a * PyLong_SHIFT - 1) / bits; sz = i + 1 + (size_a * PyLong_SHIFT - 1) / bits;
assert(sz >= 0); assert(sz >= 0);
str = PyUnicode_FromUnicode(NULL, sz); str = PyUnicode_FromUnicode(NULL, sz);
@ -1809,13 +1820,11 @@ _PyLong_Format(PyObject *aa, int base)
return NULL; return NULL;
p = PyUnicode_AS_UNICODE(str) + sz; p = PyUnicode_AS_UNICODE(str) + sz;
*p = '\0'; *p = '\0';
if (Py_SIZE(a) < 0)
sign = '-';
if (Py_SIZE(a) == 0) { if (Py_SIZE(a) == 0) {
*--p = '0'; *--p = '0';
} }
else if ((base & (base - 1)) == 0) { assert((base & (base-1)) = 0);
/* JRH: special case for power-of-2 bases */ /* JRH: special case for power-of-2 bases */
twodigits accum = 0; twodigits accum = 0;
int accumbits = 0; /* # of bits in accum */ int accumbits = 0; /* # of bits in accum */
@ -1838,83 +1847,14 @@ _PyLong_Format(PyObject *aa, int base)
} while (i < size_a-1 ? accumbits >= basebits : } while (i < size_a-1 ? accumbits >= basebits :
accum > 0); accum > 0);
} }
}
else {
/* Not 0, and base not a power of 2. Divide repeatedly by
base, but for speed use the highest power of base that
fits in a digit. */
Py_ssize_t size = size_a;
digit *pin = a->ob_digit;
PyLongObject *scratch;
/* powbasw <- largest power of base that fits in a digit. */
digit powbase = base; /* powbase == base ** power */
int power = 1;
for (;;) {
twodigits newpow = powbase * (twodigits)base;
if (newpow >> PyLong_SHIFT)
/* doesn't fit in a digit */
break;
powbase = (digit)newpow;
++power;
}
/* Get a scratch area for repeated division. */ if (base == 16)
scratch = _PyLong_New(size);
if (scratch == NULL) {
Py_DECREF(str);
return NULL;
}
/* Repeatedly divide by powbase. */
do {
int ntostore = power;
digit rem = inplace_divrem1(scratch->ob_digit,
pin, size, powbase);
pin = scratch->ob_digit; /* no need to use a again */
if (pin[size - 1] == 0)
--size;
SIGCHECK({
Py_DECREF(scratch);
Py_DECREF(str);
return NULL;
})
/* Break rem into digits. */
assert(ntostore > 0);
do {
digit nextrem = (digit)(rem / base);
char c = (char)(rem - nextrem * base);
assert(p > PyUnicode_AS_UNICODE(str));
c += (c < 10) ? '0' : 'a'-10;
*--p = c;
rem = nextrem;
--ntostore;
/* Termination is a bit delicate: must not
store leading zeroes, so must get out if
remaining quotient and rem are both 0. */
} while (ntostore && (size || rem));
} while (size != 0);
Py_DECREF(scratch);
}
if (base == 16) {
*--p = 'x'; *--p = 'x';
*--p = '0'; else if (base == 8)
}
else if (base == 8) {
*--p = 'o'; *--p = 'o';
*--p = '0'; else /* base == 2 */
}
else if (base == 2) {
*--p = 'b'; *--p = 'b';
*--p = '0'; *--p = '0';
}
else if (base != 10) {
*--p = '#';
*--p = '0' + base%10;
if (base > 10)
*--p = '0' + base/10;
}
if (sign) if (sign)
*--p = sign; *--p = sign;
if (p != PyUnicode_AS_UNICODE(str)) { if (p != PyUnicode_AS_UNICODE(str)) {