annotate DEPENDENCIES/mingw32/Python27/include/longintrepr.h @ 118:770eb830ec19 emscripten

Typo fix
author Chris Cannam
date Wed, 18 May 2016 16:14:08 +0100
parents 2a2c65a20a8b
children
rev   line source
Chris@87 1 #ifndef Py_LONGINTREPR_H
Chris@87 2 #define Py_LONGINTREPR_H
Chris@87 3 #ifdef __cplusplus
Chris@87 4 extern "C" {
Chris@87 5 #endif
Chris@87 6
Chris@87 7
Chris@87 8 /* This is published for the benefit of "friend" marshal.c only. */
Chris@87 9
Chris@87 10 /* Parameters of the long integer representation. There are two different
Chris@87 11 sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit
Chris@87 12 integer type, and one set for 15-bit digits with each digit stored in an
Chris@87 13 unsigned short. The value of PYLONG_BITS_IN_DIGIT, defined either at
Chris@87 14 configure time or in pyport.h, is used to decide which digit size to use.
Chris@87 15
Chris@87 16 Type 'digit' should be able to hold 2*PyLong_BASE-1, and type 'twodigits'
Chris@87 17 should be an unsigned integer type able to hold all integers up to
Chris@87 18 PyLong_BASE*PyLong_BASE-1. x_sub assumes that 'digit' is an unsigned type,
Chris@87 19 and that overflow is handled by taking the result modulo 2**N for some N >
Chris@87 20 PyLong_SHIFT. The majority of the code doesn't care about the precise
Chris@87 21 value of PyLong_SHIFT, but there are some notable exceptions:
Chris@87 22
Chris@87 23 - long_pow() requires that PyLong_SHIFT be divisible by 5
Chris@87 24
Chris@87 25 - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8
Chris@87 26
Chris@87 27 - long_hash() requires that PyLong_SHIFT is *strictly* less than the number
Chris@87 28 of bits in an unsigned long, as do the PyLong <-> long (or unsigned long)
Chris@87 29 conversion functions
Chris@87 30
Chris@87 31 - the long <-> size_t/Py_ssize_t conversion functions expect that
Chris@87 32 PyLong_SHIFT is strictly less than the number of bits in a size_t
Chris@87 33
Chris@87 34 - the marshal code currently expects that PyLong_SHIFT is a multiple of 15
Chris@87 35
Chris@87 36 The values 15 and 30 should fit all of the above requirements, on any
Chris@87 37 platform.
Chris@87 38 */
Chris@87 39
Chris@87 40 #if PYLONG_BITS_IN_DIGIT == 30
Chris@87 41 #if !(defined HAVE_UINT64_T && defined HAVE_UINT32_T && \
Chris@87 42 defined HAVE_INT64_T && defined HAVE_INT32_T)
Chris@87 43 #error "30-bit long digits requested, but the necessary types are not available on this platform"
Chris@87 44 #endif
Chris@87 45 typedef PY_UINT32_T digit;
Chris@87 46 typedef PY_INT32_T sdigit; /* signed variant of digit */
Chris@87 47 typedef PY_UINT64_T twodigits;
Chris@87 48 typedef PY_INT64_T stwodigits; /* signed variant of twodigits */
Chris@87 49 #define PyLong_SHIFT 30
Chris@87 50 #define _PyLong_DECIMAL_SHIFT 9 /* max(e such that 10**e fits in a digit) */
Chris@87 51 #define _PyLong_DECIMAL_BASE ((digit)1000000000) /* 10 ** DECIMAL_SHIFT */
Chris@87 52 #elif PYLONG_BITS_IN_DIGIT == 15
Chris@87 53 typedef unsigned short digit;
Chris@87 54 typedef short sdigit; /* signed variant of digit */
Chris@87 55 typedef unsigned long twodigits;
Chris@87 56 typedef long stwodigits; /* signed variant of twodigits */
Chris@87 57 #define PyLong_SHIFT 15
Chris@87 58 #define _PyLong_DECIMAL_SHIFT 4 /* max(e such that 10**e fits in a digit) */
Chris@87 59 #define _PyLong_DECIMAL_BASE ((digit)10000) /* 10 ** DECIMAL_SHIFT */
Chris@87 60 #else
Chris@87 61 #error "PYLONG_BITS_IN_DIGIT should be 15 or 30"
Chris@87 62 #endif
Chris@87 63 #define PyLong_BASE ((digit)1 << PyLong_SHIFT)
Chris@87 64 #define PyLong_MASK ((digit)(PyLong_BASE - 1))
Chris@87 65
Chris@87 66 /* b/w compatibility with Python 2.5 */
Chris@87 67 #define SHIFT PyLong_SHIFT
Chris@87 68 #define BASE PyLong_BASE
Chris@87 69 #define MASK PyLong_MASK
Chris@87 70
Chris@87 71 #if PyLong_SHIFT % 5 != 0
Chris@87 72 #error "longobject.c requires that PyLong_SHIFT be divisible by 5"
Chris@87 73 #endif
Chris@87 74
Chris@87 75 /* Long integer representation.
Chris@87 76 The absolute value of a number is equal to
Chris@87 77 SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
Chris@87 78 Negative numbers are represented with ob_size < 0;
Chris@87 79 zero is represented by ob_size == 0.
Chris@87 80 In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
Chris@87 81 digit) is never zero. Also, in all cases, for all valid i,
Chris@87 82 0 <= ob_digit[i] <= MASK.
Chris@87 83 The allocation function takes care of allocating extra memory
Chris@87 84 so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.
Chris@87 85
Chris@87 86 CAUTION: Generic code manipulating subtypes of PyVarObject has to
Chris@87 87 aware that longs abuse ob_size's sign bit.
Chris@87 88 */
Chris@87 89
Chris@87 90 struct _longobject {
Chris@87 91 PyObject_VAR_HEAD
Chris@87 92 digit ob_digit[1];
Chris@87 93 };
Chris@87 94
Chris@87 95 PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t);
Chris@87 96
Chris@87 97 /* Return a copy of src. */
Chris@87 98 PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src);
Chris@87 99
Chris@87 100 #ifdef __cplusplus
Chris@87 101 }
Chris@87 102 #endif
Chris@87 103 #endif /* !Py_LONGINTREPR_H */