longintrepr.h 3.9 KB
Newer Older
1
#ifndef Py_LIMITED_API
2 3 4 5 6 7
#ifndef Py_LONGINTREPR_H
#define Py_LONGINTREPR_H
#ifdef __cplusplus
extern "C" {
#endif

Guido van Rossum's avatar
Guido van Rossum committed
8

9
/* This is published for the benefit of "friends" marshal.c and _decimal.c. */
10

11
/* Parameters of the integer representation.  There are two different
12 13 14 15
   sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit
   integer type, and one set for 15-bit digits with each digit stored in an
   unsigned short.  The value of PYLONG_BITS_IN_DIGIT, defined either at
   configure time or in pyport.h, is used to decide which digit size to use.
Guido van Rossum's avatar
Guido van Rossum committed
16

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   Type 'digit' should be able to hold 2*PyLong_BASE-1, and type 'twodigits'
   should be an unsigned integer type able to hold all integers up to
   PyLong_BASE*PyLong_BASE-1.  x_sub assumes that 'digit' is an unsigned type,
   and that overflow is handled by taking the result modulo 2**N for some N >
   PyLong_SHIFT.  The majority of the code doesn't care about the precise
   value of PyLong_SHIFT, but there are some notable exceptions:

   - long_pow() requires that PyLong_SHIFT be divisible by 5

   - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8

   - long_hash() requires that PyLong_SHIFT is *strictly* less than the number
     of bits in an unsigned long, as do the PyLong <-> long (or unsigned long)
     conversion functions

32
   - the Python int <-> size_t/Py_ssize_t conversion functions expect that
33 34 35 36 37 38
     PyLong_SHIFT is strictly less than the number of bits in a size_t

   - the marshal code currently expects that PyLong_SHIFT is a multiple of 15

   - NSMALLNEGINTS and NSMALLPOSINTS should be small enough to fit in a single
     digit; with the current values this forces PyLong_SHIFT >= 9
Guido van Rossum's avatar
Guido van Rossum committed
39

40 41 42 43 44 45 46 47 48 49 50 51 52 53
  The values 15 and 30 should fit all of the above requirements, on any
  platform.
*/

#if PYLONG_BITS_IN_DIGIT == 30
#if !(defined HAVE_UINT64_T && defined HAVE_UINT32_T &&          \
      defined HAVE_INT64_T && defined HAVE_INT32_T)
#error "30-bit long digits requested, but the necessary types are not available on this platform"
#endif
typedef PY_UINT32_T digit;
typedef PY_INT32_T sdigit; /* signed variant of digit */
typedef PY_UINT64_T twodigits;
typedef PY_INT64_T stwodigits; /* signed variant of twodigits */
#define PyLong_SHIFT	30
54 55
#define _PyLong_DECIMAL_SHIFT	9 /* max(e such that 10**e fits in a digit) */
#define _PyLong_DECIMAL_BASE	((digit)1000000000) /* 10 ** DECIMAL_SHIFT */
56 57 58 59 60
#elif PYLONG_BITS_IN_DIGIT == 15
typedef unsigned short digit;
typedef short sdigit; /* signed variant of digit */
typedef unsigned long twodigits;
typedef long stwodigits; /* signed variant of twodigits */
61
#define PyLong_SHIFT	15
62 63
#define _PyLong_DECIMAL_SHIFT	4 /* max(e such that 10**e fits in a digit) */
#define _PyLong_DECIMAL_BASE	((digit)10000) /* 10 ** DECIMAL_SHIFT */
64 65 66
#else
#error "PYLONG_BITS_IN_DIGIT should be 15 or 30"
#endif
67
#define PyLong_BASE	((digit)1 << PyLong_SHIFT)
68
#define PyLong_MASK	((digit)(PyLong_BASE - 1))
Guido van Rossum's avatar
Guido van Rossum committed
69

70
#if PyLong_SHIFT % 5 != 0
71
#error "longobject.c requires that PyLong_SHIFT be divisible by 5"
72 73
#endif

Guido van Rossum's avatar
Guido van Rossum committed
74 75 76 77 78 79 80 81
/* Long integer representation.
   The absolute value of a number is equal to
   	SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
   Negative numbers are represented with ob_size < 0;
   zero is represented by ob_size == 0.
   In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
   digit) is never zero.  Also, in all cases, for all valid i,
   	0 <= ob_digit[i] <= MASK.
82
   The allocation function takes care of allocating extra memory
83 84 85
   so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.

   CAUTION:  Generic code manipulating subtypes of PyVarObject has to
86
   aware that ints abuse  ob_size's sign bit.
87
*/
Guido van Rossum's avatar
Guido van Rossum committed
88

89
struct _longobject {
90
	PyObject_VAR_HEAD
Guido van Rossum's avatar
Guido van Rossum committed
91
	digit ob_digit[1];
92
};
Guido van Rossum's avatar
Guido van Rossum committed
93

Martin v. Löwis's avatar
Martin v. Löwis committed
94
PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t);
95

96
/* Return a copy of src. */
97
PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src);
98

99 100 101 102
#ifdef __cplusplus
}
#endif
#endif /* !Py_LONGINTREPR_H */
103
#endif /* Py_LIMITED_API */