Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(52)

Side by Side Diff: Objects/longobject.c

Issue 660042: Compatible numeric hashes Base URL: http://svn.python.org/view/*checkout*/python/branches/py3k/
Patch Set: Updated patch, with less repetition and more tests. Created 2 years, 1 month ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « Lib/test/test_numeric_tower.py ('k') | Objects/object.c » ('j') | Objects/object.c » ('J')

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld 855:fffdfa546f68