| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 /* Long (arbitrary precision) integer object implementation */ | 1 /* Long (arbitrary precision) integer object implementation */ |
| 2 | 2 |
| 3 /* XXX The functional organization of this file is terrible */ | 3 /* XXX The functional organization of this file is terrible */ |
| 4 | 4 |
| 5 #include "Python.h" | 5 #include "Python.h" |
| 6 #include "longintrepr.h" | 6 #include "longintrepr.h" |
| 7 #include "structseq.h" | 7 #include "structseq.h" |
| 8 | 8 |
| 9 #include <float.h> | 9 #include <float.h> |
| 10 #include <ctype.h> | 10 #include <ctype.h> |
| (...skipping 2554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2565 case -1: return v->ob_digit[0]==1 ? -2 : -(sdigit)v->ob_digit[0]; | 2565 case -1: return v->ob_digit[0]==1 ? -2 : -(sdigit)v->ob_digit[0]; |
| 2566 case 0: return 0; | 2566 case 0: return 0; |
| 2567 case 1: return v->ob_digit[0]; | 2567 case 1: return v->ob_digit[0]; |
| 2568 } | 2568 } |
| 2569 sign = 1; | 2569 sign = 1; |
| 2570 x = 0; | 2570 x = 0; |
| 2571 if (i < 0) { | 2571 if (i < 0) { |
| 2572 sign = -1; | 2572 sign = -1; |
| 2573 i = -(i); | 2573 i = -(i); |
| 2574 } | 2574 } |
| 2575 /* The following loop produces a C unsigned long x such that x is | |
| 2576 congruent to the absolute value of v modulo ULONG_MAX. The | |
| 2577 resulting x is nonzero if and only if v is. */ | |
| 2578 while (--i >= 0) { | 2575 while (--i >= 0) { |
| 2579 » » /* Force a native long #-bits (32 or 64) circular shift */ | 2576 » » /* Rotate bottom 31 bits left by PyLong_SHIFT bits; in effect, |
| 2580 » » x = (x >> (8*SIZEOF_LONG-PyLong_SHIFT)) | (x << PyLong_SHIFT); | 2577 » » this multiplies by 2**PyLong_SHIFT modulo 2**31 - 1. */ |
|
GvR
2010/03/21 17:04:48
Can't say I understand all this. I guess my number
dickinsm
2010/03/23 11:56:56
I'll add some explanatory comments. (That 2**31 -
| |
| 2578 » » x = ((x << PyLong_SHIFT) & _PyHASH_MASK) | | |
| 2579 » » » (x >> (_PyHASH_BITS - PyLong_SHIFT)); | |
| 2581 x += v->ob_digit[i]; | 2580 x += v->ob_digit[i]; |
| 2582 /* If the addition above overflowed we compensate by | 2581 /* If the addition above overflowed we compensate by |
| 2583 incrementing. This preserves the value modulo | 2582 incrementing. This preserves the value modulo |
|
GvR
2010/03/21 17:04:48
incrementing? This comment seems outdated now.
dickinsm
2010/03/23 11:56:56
Agreed. I'll remove it.
| |
| 2584 ULONG_MAX. */ | 2583 ULONG_MAX. */ |
| 2585 » » if (x < v->ob_digit[i]) | 2584 » » if (x > _PyHASH_MASK) |
| 2586 » » » x++; | 2585 » » » x -= _PyHASH_MASK; |
| 2587 } | 2586 } |
| 2588 x = x * sign; | 2587 x = x * sign; |
| 2589 if (x == (unsigned long)-1) | 2588 if (x == (unsigned long)-1) |
| 2590 x = (unsigned long)-2; | 2589 x = (unsigned long)-2; |
| 2591 return (long)x; | 2590 return (long)x; |
| 2592 } | 2591 } |
| 2593 | 2592 |
| 2594 | 2593 |
| 2595 /* Add the absolute values of two long integers. */ | 2594 /* Add the absolute values of two long integers. */ |
| 2596 | 2595 |
| (...skipping 2214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4811 reinitializations will fail. */ | 4810 reinitializations will fail. */ |
| 4812 #if NSMALLNEGINTS + NSMALLPOSINTS > 0 | 4811 #if NSMALLNEGINTS + NSMALLPOSINTS > 0 |
| 4813 int i; | 4812 int i; |
| 4814 PyLongObject *v = small_ints; | 4813 PyLongObject *v = small_ints; |
| 4815 for (i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++, v++) { | 4814 for (i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++, v++) { |
| 4816 _Py_DEC_REFTOTAL; | 4815 _Py_DEC_REFTOTAL; |
| 4817 _Py_ForgetReference((PyObject*)v); | 4816 _Py_ForgetReference((PyObject*)v); |
| 4818 } | 4817 } |
| 4819 #endif | 4818 #endif |
| 4820 } | 4819 } |
| OLD | NEW |