| --- misc/mozilla/nsprpub/pr/src/misc/prdtoa.c 20 Mar 2009 03:41:21 -0000 4.7 |
| +++ misc/build/mozilla/nsprpub/pr/src/misc/prdtoa.c 15 Sep 2009 00:10:20 -0000 |
| @@ -169,17 +169,22 @@ void _PR_CleanupDtoa(void) |
| * Llong, #define #ULLong to be the corresponding unsigned type. |
| * #define KR_headers for old-style C function headers. |
| * #define Bad_float_h if your system lacks a float.h or if it does not |
| * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, |
| * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. |
| * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) |
| * if memory is available and otherwise does something you deem |
| * appropriate. If MALLOC is undefined, malloc will be invoked |
| - * directly -- and assumed always to succeed. |
| + * directly -- and assumed always to succeed. Similarly, if you |
| + * want something other than the system's free() to be called to |
| + * recycle memory acquired from MALLOC, #define FREE to be the |
| + * name of the alternate routine. (FREE or free is only called in |
| + * pathological cases, e.g., in a dtoa call after a dtoa return in |
| + * mode 3 with thousands of digits requested.) |
| * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making |
| * memory allocations from a private pool of memory when possible. |
| * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, |
| * unless #defined to be a different length. This default length |
| * suffices to get rid of MALLOC calls except for unusual cases, |
| * such as decimal-to-binary conversion of a very long string of |
| * digits. The longest string dtoa can return is about 751 bytes |
| * long. For conversions by strtod of strings of 800 digits and |
| @@ -553,17 +558,17 @@ extern double rnd_prod(double, double), |
| #endif |
| #endif /* NO_LONG_LONG */ |
| |
| #ifndef MULTIPLE_THREADS |
| #define ACQUIRE_DTOA_LOCK(n) /*nothing*/ |
| #define FREE_DTOA_LOCK(n) /*nothing*/ |
| #endif |
| |
| -#define Kmax 15 |
| +#define Kmax 7 |
| |
| struct |
| Bigint { |
| struct Bigint *next; |
| int k, maxwds, sign, wds; |
| ULong x[1]; |
| }; |
| |
| @@ -581,27 +586,28 @@ Balloc |
| { |
| int x; |
| Bigint *rv; |
| #ifndef Omit_Private_Memory |
| unsigned int len; |
| #endif |
| |
| ACQUIRE_DTOA_LOCK(0); |
| - if (rv = freelist[k]) { |
| + /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */ |
| + /* but this case seems very unlikely. */ |
| + if (k <= Kmax && (rv = freelist[k])) |
| freelist[k] = rv->next; |
| - } |
| else { |
| x = 1 << k; |
| #ifdef Omit_Private_Memory |
| rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); |
| #else |
| len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) |
| /sizeof(double); |
| - if (pmem_next - private_mem + len <= PRIVATE_mem) { |
| + if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { |
| rv = (Bigint*)pmem_next; |
| pmem_next += len; |
| } |
| else |
| rv = (Bigint*)MALLOC(len*sizeof(double)); |
| #endif |
| rv->k = k; |
| rv->maxwds = x; |
| @@ -615,20 +621,28 @@ Balloc |
| Bfree |
| #ifdef KR_headers |
| (v) Bigint *v; |
| #else |
| (Bigint *v) |
| #endif |
| { |
| if (v) { |
| - ACQUIRE_DTOA_LOCK(0); |
| - v->next = freelist[v->k]; |
| - freelist[v->k] = v; |
| - FREE_DTOA_LOCK(0); |
| + if (v->k > Kmax) |
| +#ifdef FREE |
| + FREE((void*)v); |
| +#else |
| + free((void*)v); |
| +#endif |
| + else { |
| + ACQUIRE_DTOA_LOCK(0); |
| + v->next = freelist[v->k]; |
| + freelist[v->k] = v; |
| + FREE_DTOA_LOCK(0); |
| + } |
| } |
| } |
| |
| #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ |
| y->wds*sizeof(Long) + 2*sizeof(int)) |
| |
| static Bigint * |
| multadd |
| --- misc/mozilla/js/src/jsdtoa.c 2 Sep 2007 22:20:41 -0000 3.41 |
| +++ misc/build/mozilla/js/src/jsdtoa.c 18 Sep 2009 16:15:13 -0000 |
| @@ -145,17 +145,22 @@ |
| * and if "unsigned Llong" does not work as an unsigned version of |
| * Llong, #define #ULLong to be the corresponding unsigned type. |
| * #define Bad_float_h if your system lacks a float.h or if it does not |
| * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, |
| * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. |
| * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) |
| * if memory is available and otherwise does something you deem |
| * appropriate. If MALLOC is undefined, malloc will be invoked |
| - * directly -- and assumed always to succeed. |
| + * directly -- and assumed always to succeed. Similarly, if you |
| + * want something other than the system's free() to be called to |
| + * recycle memory acquired from MALLOC, #define FREE to be the |
| + * name of the alternate routine. (FREE or free is only called in |
| + * pathological cases, e.g., in a dtoa call after a dtoa return in |
| + * mode 3 with thousands of digits requested.) |
| * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making |
| * memory allocations from a private pool of memory when possible. |
| * When used, the private pool is PRIVATE_MEM bytes long: 2000 bytes, |
| * unless #defined to be a different length. This default length |
| * suffices to get rid of MALLOC calls except for unusual cases, |
| * such as decimal-to-binary conversion of a very long string of |
| * digits. |
| * #define INFNAN_CHECK on IEEE systems to cause strtod to check for |
| @@ -320,17 +325,17 @@ static PRLock *freelist_lock; |
| JS_END_MACRO |
| #define RELEASE_DTOA_LOCK() PR_Unlock(freelist_lock) |
| #else |
| #undef MULTIPLE_THREADS |
| #define ACQUIRE_DTOA_LOCK() /*nothing*/ |
| #define RELEASE_DTOA_LOCK() /*nothing*/ |
| #endif |
| |
| -#define Kmax 15 |
| +#define Kmax 7 |
| |
| struct Bigint { |
| struct Bigint *next; /* Free list link */ |
| int32 k; /* lg2(maxwds) */ |
| int32 maxwds; /* Number of words allocated for x */ |
| int32 sign; /* Zero if positive, 1 if negative. Ignored by most Bigint routines! */ |
| int32 wds; /* Actual number of words. If value is nonzero, the most significant word must be nonzero. */ |
| ULong x[1]; /* wds words of number in little endian order */ |
| @@ -400,26 +405,26 @@ static Bigint *Balloc(int32 k) |
| |
| #ifdef ENABLE_OOM_TESTING |
| if (++allocationNum == desiredFailure) { |
| printf("Forced Failing Allocation number %d\n", allocationNum); |
| return NULL; |
| } |
| #endif |
| |
| - if ((rv = freelist[k]) != NULL) |
| + if (k <= Kmax && (rv = freelist[k]) != NULL) |
| freelist[k] = rv->next; |
| if (rv == NULL) { |
| x = 1 << k; |
| #ifdef Omit_Private_Memory |
| rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); |
| #else |
| len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) |
| /sizeof(double); |
| - if (pmem_next - private_mem + len <= PRIVATE_mem) { |
| + if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { |
| rv = (Bigint*)pmem_next; |
| pmem_next += len; |
| } |
| else |
| rv = (Bigint*)MALLOC(len*sizeof(double)); |
| #endif |
| if (!rv) |
| return NULL; |
| @@ -428,18 +433,26 @@ static Bigint *Balloc(int32 k) |
| } |
| rv->sign = rv->wds = 0; |
| return rv; |
| } |
| |
| static void Bfree(Bigint *v) |
| { |
| if (v) { |
| - v->next = freelist[v->k]; |
| - freelist[v->k] = v; |
| + if (v->k > Kmax) |
| +#ifdef FREE |
| + FREE((void*)v); |
| +#else |
| + free((void*)v); |
| +#endif |
| + else { |
| + v->next = freelist[v->k]; |
| + freelist[v->k] = v; |
| + } |
| } |
| } |
| |
| #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ |
| y->wds*sizeof(Long) + 2*sizeof(int32)) |
| |
| /* Return b*m + a. Deallocate the old b. Both a and m must be between 0 and |
| * 65535 inclusive. NOTE: old b is deallocated on memory failure. |
| --- misc/mozilla/js/src/jsdtoa.c 22 Sep 2009 06:16:27 -0000 3.42 |
| +++ misc/build/mozilla/js/src/jsdtoa.c 15 Oct 2009 10:34:38 -0000 |
| @@ -405,19 +405,19 @@ static Bigint *Balloc(int32 k) |
| |
| #ifdef ENABLE_OOM_TESTING |
| if (++allocationNum == desiredFailure) { |
| printf("Forced Failing Allocation number %d\n", allocationNum); |
| return NULL; |
| } |
| #endif |
| |
| - if (k <= Kmax && (rv = freelist[k]) != NULL) |
| + if (k <= Kmax && (rv = freelist[k])) |
| freelist[k] = rv->next; |
| - if (rv == NULL) { |
| + else { |
| x = 1 << k; |
| #ifdef Omit_Private_Memory |
| rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); |
| #else |
| len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) |
| /sizeof(double); |
| if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { |
| rv = (Bigint*)pmem_next; |