]> granicus.if.org Git - python/commitdiff
Reduce the size of the _PyLong_DigitValue table.
authorRaymond Hettinger <python@rcn.com>
Fri, 9 Jan 2009 03:58:09 +0000 (03:58 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 9 Jan 2009 03:58:09 +0000 (03:58 +0000)
Include/longobject.h
Misc/NEWS
Objects/longobject.c

index 73ca95119645e17c5bdbeb73cdfd0af09ddc8dc2..7adf9c735e945945af7594aa0bf659c1bad98c1d 100644 (file)
@@ -41,7 +41,7 @@ PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *);
 #endif
 
 /* For use by intobject.c only */
-PyAPI_DATA(int) _PyLong_DigitValue[256];
+PyAPI_DATA(unsigned char) _PyLong_DigitValue[256];
 
 /* _PyLong_AsScaledDouble returns a double x and an exponent e such that
    the true value is approximately equal to x * 2**(SHIFT*e).  e is >= 0.
index 685033c469b8fe504b079cbee8161388ba5dc60e..0ce7f7ad9c0f7316f69d81361dd367a0cf46be07 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 3.1 alpha 0
 Core and Builtins
 -----------------
 
+- The internal table, _PyLong_DigitValue, is now an array of unsigned chars
+  instead of ints (reducing its size from 4 to 8 times thereby reducing
+  Python's overall memory).
+
 - Issue #1180193: When importing a module from a .pyc (or .pyo) file with
   an existing .py counterpart, override the co_filename attributes of all
   code objects if the original filename is obsolete (which can happen if the
index 362d0ad23993d2d510ed0248fddbb22055910710..9993d103ea24644bc2e5f858d7305e3af27ab28d 100644 (file)
@@ -1646,7 +1646,7 @@ _PyLong_Format(PyObject *aa, int base)
  * Note that when converting a base B string, a char c is a legitimate
  * base B digit iff _PyLong_DigitValue[Py_CHARPyLong_MASK(c)] < B.
  */
-int _PyLong_DigitValue[256] = {
+unsigned char _PyLong_DigitValue[256] = {
        37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
        37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
        37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
@@ -1710,7 +1710,7 @@ long_from_binary_base(char **str, int base)
        bits_in_accum = 0;
        pdigit = z->ob_digit;
        while (--p >= start) {
-               int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
+               int k = (int)_PyLong_DigitValue[Py_CHARMASK(*p)];
                assert(k >= 0 && k < base);
                accum |= (twodigits)(k << bits_in_accum);
                bits_in_accum += bits_per_char;
@@ -1926,7 +1926,7 @@ digit beyond the first.
                        c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
                        for (i = 1; i < convwidth && str != scan; ++i, ++str) {
                                c = (twodigits)(c *  base +
-                                       _PyLong_DigitValue[Py_CHARMASK(*str)]);
+                                       (int)_PyLong_DigitValue[Py_CHARMASK(*str)]);
                                assert(c < PyLong_BASE);
                        }