From: Alex M. <al...@us...> - 2006-02-26 07:37:06
|
Update of /cvsroot/gmpy/gmpy/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24545/src Modified Files: gmpy.c Log Message: Added fixes for 64-bit build (from dmcooke's patch) Index: gmpy.c =================================================================== RCS file: /cvsroot/gmpy/gmpy/src/gmpy.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** gmpy.c 26 Feb 2006 07:08:18 -0000 1.19 --- gmpy.c 26 Feb 2006 07:36:59 -0000 1.20 *************** *** 167,177 **** static struct gmpy_options { ! long debug; /* != 0 if debug messages desired on stderr */ unsigned long minprec; /* min #of bits' precision on new mpf's built */ ! long tagoff; /* 0 for full tags 'gmpy.mpz()', else 5 for 'mpz()' */ ! long zcache; /* size of cache for mpz objects */ ! long minzco; /* min mpz that will come as constant (inclusive) */ ! long maxzco; /* max mpz that will come as constant (exclusive) */ ! long qcache; /* size of cache for mpq objects */ PyObject* fcoform; /* if non-NULL, format for float->mpf (via string) */ /* experimental callbacks for various anomalous cases; if a callback --- 167,177 ---- static struct gmpy_options { ! int debug; /* != 0 if debug messages desired on stderr */ unsigned long minprec; /* min #of bits' precision on new mpf's built */ ! int tagoff; /* 0 for full tags 'gmpy.mpz()', else 5 for 'mpz()' */ ! int zcache; /* size of cache for mpz objects */ ! int minzco; /* min mpz that will come as constant (inclusive) */ ! int maxzco; /* max mpz that will come as constant (exclusive) */ ! int qcache; /* size of cache for mpq objects */ PyObject* fcoform; /* if non-NULL, format for float->mpf (via string) */ /* experimental callbacks for various anomalous cases; if a callback *************** *** 186,190 **** PyObject* AT_cb; /* getattr-like "as last resort try calling this" for getting of attributes from mpz &c instances */ ! } options = { 0, 0, 5, 20, -2, 11, 20, 0, 0, 0, 0 }; /* sanity check: do NOT let cache sizes become wildly large! */ --- 186,190 ---- PyObject* AT_cb; /* getattr-like "as last resort try calling this" for getting of attributes from mpz &c instances */ ! } options = { 0, 0, 5, 20, -2, 11, 20, 0, 0, 0, 0, 0 }; /* sanity check: do NOT let cache sizes become wildly large! */ *************** *** 237,241 **** } else { \ if(options.debug) \ ! fprintf(stderr, "Not placing in full zcache(%d/%ld)\n", \ in_zcache, options.zcache); \ mpz_clear(oldo); \ --- 237,241 ---- } else { \ if(options.debug) \ ! fprintf(stderr, "Not placing in full zcache(%d/%d)\n", \ in_zcache, options.zcache); \ mpz_clear(oldo); \ *************** *** 304,308 **** } else { \ if(options.debug) \ ! fprintf(stderr, "Not placing in full qcache(%d/%ld)\n", \ in_qcache, options.qcache); \ mpq_clear(oldo); \ --- 304,308 ---- } else { \ if(options.debug) \ ! fprintf(stderr, "Not placing in full qcache(%d/%d)\n", \ in_qcache, options.qcache); \ mpq_clear(oldo); \ *************** *** 658,664 **** Pygmpy_set_tagoff(PyObject *self, PyObject *args) { ! long old = options.tagoff; ! ONE_ARG("set_tagoff", "l", &options.tagoff); if(options.tagoff) options.tagoff=5; return Py_BuildValue("i", old!=0); --- 658,664 ---- Pygmpy_set_tagoff(PyObject *self, PyObject *args) { ! int old = options.tagoff; ! ONE_ARG("set_tagoff", "i", &options.tagoff); if(options.tagoff) options.tagoff=5; return Py_BuildValue("i", old!=0); *************** *** 676,680 **** int i; ! ONE_ARG("set_minprec", "l", &i); if(i<0) { PyErr_SetString(PyExc_ValueError, --- 676,680 ---- int i; ! ONE_ARG("set_minprec", "i", &i); if(i<0) { PyErr_SetString(PyExc_ValueError, *************** *** 808,818 **** { PympfObject *newob; assert(PyInt_Check(i)); ! if(!bits) bits = SIZEOF_LONG*8; if(!(newob = Pympf_new(bits))) return NULL; ! mpf_set_si(newob->f, PyInt_AsLong(i)); return newob; } --- 808,829 ---- { PympfObject *newob; + long li; assert(PyInt_Check(i)); ! li = PyInt_AsLong(i); ! /* on a 64-bit machine, SIZEOF_LONG*8 > double_mantissa, so to simplify ! the representation, only use that many bits if we have an integer that ! won't fit in an int. */ ! if(!bits) { ! if ((li > INT_MAX) || (li < (-INT_MAX-1))) { ! bits = SIZEOF_LONG*8; ! } else { ! bits = SIZEOF_INT*8; ! } ! } if(!(newob = Pympf_new(bits))) return NULL; ! mpf_set_si(newob->f, li); return newob; } *************** *** 1141,1144 **** --- 1152,1159 ---- numerator = str2mpz(s,256); Py_DECREF(s); + if (!numerator) { + Py_DECREF((PyObject*)newob); + return 0; + } if(mpz_sgn(numerator->z) < 0) { PyErr_SetString(PyExc_ValueError, "invalid mpq binary (num sgn)"); *************** *** 1152,1155 **** --- 1167,1175 ---- denominator = str2mpz(s,256); Py_DECREF(s); + if (!denominator) { + Py_DECREF((PyObject*)newob); + Py_DECREF((PyObject*)numerator); + return 0; + } if(mpz_sgn(denominator->z) != 1) { PyErr_SetString(PyExc_ValueError, "invalid mpq binary (den sgn)"); *************** *** 1490,1494 **** { mpz_t temp; ! int size, usize, negative, i, needtrail; char *buffer; PyObject *s; --- 1510,1515 ---- { mpz_t temp; ! size_t size, usize; ! int negative, i, needtrail; char *buffer; PyObject *s; *************** *** 2154,2158 **** if(options.debug) fprintf(stderr, "anynum2mpf(%p,%d)->%p (%d)\n", obj, ! bits, newob, newob?newob->rebits:-1); return newob; --- 2175,2179 ---- if(options.debug) fprintf(stderr, "anynum2mpf(%p,%d)->%p (%d)\n", obj, ! bits, newob, newob != 0 ? newob->rebits : -1); return newob; *************** *** 2281,2286 **** { PyObject *s; ! int bits=0; ! SELF_ONE_ARG("mpf_copy", Pympf_convert_arg,"|i",&bits); assert(Pympf_Check(self)); --- 2302,2307 ---- { PyObject *s; ! unsigned int bits=0; ! SELF_ONE_ARG("mpf_copy", Pympf_convert_arg,"|I",&bits); assert(Pympf_Check(self)); *************** *** 2389,2393 **** Pympz_digits(PyObject *self, PyObject *args) { ! long base = 10; PyObject *s; --- 2410,2414 ---- Pympz_digits(PyObject *self, PyObject *args) { ! int base = 10; PyObject *s; *************** *** 2418,2422 **** Pympz_numdigits(PyObject *self, PyObject *args) { ! long base = 10; PyObject *s; --- 2439,2443 ---- Pympz_numdigits(PyObject *self, PyObject *args) { ! int base = 10; PyObject *s; *************** *** 2429,2433 **** return NULL; } ! s = Py_BuildValue("i", mpz_sizeinbase(Pympz_AS_MPZ(self), base)); Py_DECREF(self); return s; --- 2450,2454 ---- return NULL; } ! s = Py_BuildValue("l", (long) mpz_sizeinbase(Pympz_AS_MPZ(self), base)); Py_DECREF(self); return s; *************** *** 2449,2453 **** Pympq_digits(PyObject *self, PyObject *args) { ! long base = 10; PyObject *s; --- 2470,2474 ---- Pympq_digits(PyObject *self, PyObject *args) { ! int base = 10; PyObject *s; *************** *** 2481,2485 **** PyObject *s; ! SELF_ONE_ARG("scan0",Pympz_convert_arg,"|i",&starting_bit); assert(Pympz_Check(self)); if(starting_bit < 0) { --- 2502,2506 ---- PyObject *s; ! SELF_ONE_ARG("scan0",Pympz_convert_arg,"|l",&starting_bit); assert(Pympz_Check(self)); if(starting_bit < 0) { *************** *** 2487,2491 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOi", "scan0", msg, self, starting_bit); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 2508,2512 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOl", "scan0", msg, self, starting_bit); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 2501,2507 **** s = Py_BuildValue(""); else ! s = Py_BuildValue("i", starting_bit); } else { ! s = Py_BuildValue("i", mpz_scan0(Pympz_AS_MPZ(self), starting_bit)); } Py_DECREF(self); --- 2522,2528 ---- s = Py_BuildValue(""); else ! s = Py_BuildValue("l", starting_bit); } else { ! s = Py_BuildValue("l", mpz_scan0(Pympz_AS_MPZ(self), starting_bit)); } Py_DECREF(self); *************** *** 2529,2533 **** PyObject *s; ! SELF_ONE_ARG("scan1",Pympz_convert_arg,"|i",&starting_bit); assert(Pympz_Check(self)); if(starting_bit < 0) { --- 2550,2554 ---- PyObject *s; ! SELF_ONE_ARG("scan1",Pympz_convert_arg,"|l",&starting_bit); assert(Pympz_Check(self)); if(starting_bit < 0) { *************** *** 2535,2539 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOi", "scan1", msg, self, starting_bit); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 2556,2560 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOl", "scan1", msg, self, starting_bit); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 2549,2555 **** s = Py_BuildValue(""); else ! s = Py_BuildValue("i", starting_bit); } else { ! s = Py_BuildValue("i", mpz_scan1(Pympz_AS_MPZ(self), starting_bit)); } Py_DECREF(self); --- 2570,2576 ---- s = Py_BuildValue(""); else ! s = Py_BuildValue("l", starting_bit); } else { ! s = Py_BuildValue("l", mpz_scan1(Pympz_AS_MPZ(self), starting_bit)); } Py_DECREF(self); *************** *** 2574,2578 **** SELF_NO_ARG("popcount", Pympz_convert_arg); assert(Pympz_Check(self)); ! s = Py_BuildValue("i", mpz_popcount(Pympz_AS_MPZ(self))); Py_DECREF(self); return s; --- 2595,2599 ---- SELF_NO_ARG("popcount", Pympz_convert_arg); assert(Pympz_Check(self)); ! s = Py_BuildValue("l", mpz_popcount(Pympz_AS_MPZ(self))); Py_DECREF(self); return s; *************** *** 2595,2599 **** PympzObject *s; ! SELF_ONE_ARG("lowbits", Pympz_convert_arg,"i",&nbits); assert(Pympz_Check(self)); if(nbits <= 0) { --- 2616,2620 ---- PympzObject *s; ! SELF_ONE_ARG("lowbits", Pympz_convert_arg,"l",&nbits); assert(Pympz_Check(self)); if(nbits <= 0) { *************** *** 2601,2605 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOi", "lowbits", msg, self, nbits); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 2622,2626 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOl", "lowbits", msg, self, nbits); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 2628,2632 **** PyObject *s; ! SELF_ONE_ARG("getbit", Pympz_convert_arg,"i",&bit_index); assert(Pympz_Check(self)); if(bit_index < 0) { --- 2649,2653 ---- PyObject *s; ! SELF_ONE_ARG("getbit", Pympz_convert_arg,"l",&bit_index); assert(Pympz_Check(self)); if(bit_index < 0) { *************** *** 2634,2638 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOi", "getbit", msg, self, bit_index); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 2655,2659 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOl", "getbit", msg, self, bit_index); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 2660,2668 **** if(self) { ! if(!PyArg_ParseTuple(args, "i|i", &bit_index, &bit_value)) return last_try_self("setbit", 1, 2, args, self); Py_INCREF(self); } else { ! if(!PyArg_ParseTuple(args, "O&i|i", Pympz_convert_arg, &self, &bit_index, &bit_value)) return last_try("setbit", 2, 3, args); --- 2681,2689 ---- if(self) { ! if(!PyArg_ParseTuple(args, "l|l", &bit_index, &bit_value)) return last_try_self("setbit", 1, 2, args, self); Py_INCREF(self); } else { ! if(!PyArg_ParseTuple(args, "O&l|l", Pympz_convert_arg, &self, &bit_index, &bit_value)) return last_try("setbit", 2, 3, args); *************** *** 2673,2677 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOi", "setbit", msg, self, bit_index); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 2694,2698 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOl", "setbit", msg, self, bit_index); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 2709,2713 **** PympzObject *s; ! SELF_ONE_ARG("mpz_root", Pympz_convert_arg,"i",&n); assert(Pympz_Check(self)); if(n <= 0) { --- 2730,2734 ---- PympzObject *s; ! SELF_ONE_ARG("mpz_root", Pympz_convert_arg,"l",&n); assert(Pympz_Check(self)); if(n <= 0) { *************** *** 2715,2719 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOi", "mpz_root", msg, self, n); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 2736,2740 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOl", "mpz_root", msg, self, n); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 2724,2728 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOi", "mpz_root", msg, self, n); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 2745,2749 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssOl", "mpz_root", msg, self, n); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 2779,2787 **** Pympf_digits(PyObject *self, PyObject *args) { ! long base = 10; ! long digs = 0; ! long mine = 0; ! long maxe = -1; ! long opts = 0; PyObject *s; --- 2800,2808 ---- Pympf_digits(PyObject *self, PyObject *args) { ! int base = 10; ! int digs = 0; ! int mine = 0; ! int maxe = -1; ! int opts = 0; PyObject *s; *************** *** 3162,3165 **** --- 3183,3189 ---- } newob = str2mpz(obj, base); + if (!newob) { + return NULL; + } } else { if(argc==2) { *************** *** 3240,3243 **** --- 3264,3270 ---- } newob = str2mpq(obj, base); + if (!newob) { + return NULL; + } } else { wasnumeric=1; *************** *** 3360,3363 **** --- 3387,3393 ---- } newob = str2mpf(obj, base, bits); + if (!newob) { + return NULL; + } } else { if(argc==3) { *************** *** 4500,4504 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssi", "fac", msg, n); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 4530,4534 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssl", "fac", msg, n); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 4527,4531 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssi", "fib", msg, n); PyErr_SetString(PyExc_ValueError, msg); return NULL; --- 4557,4561 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssl", "fib", msg, n); PyErr_SetString(PyExc_ValueError, msg); return NULL; *************** *** 4639,4643 **** long k; ! SELF_ONE_ARG("bincoef", Pympz_convert_arg,"i",&k); assert(Pympz_Check(self)); --- 4669,4673 ---- long k; ! SELF_ONE_ARG("bincoef", Pympz_convert_arg,"l",&k); assert(Pympz_Check(self)); *************** *** 4647,4651 **** if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssNi", "bincoef", msg, self, k); PyErr_SetString(PyExc_ValueError, msg); Py_DECREF(self); --- 4677,4681 ---- if(options.ER_cb) return PyObject_CallFunction(options.ER_cb, ! "ssNl", "bincoef", msg, self, k); PyErr_SetString(PyExc_ValueError, msg); Py_DECREF(self); *************** *** 5111,5115 **** Pympf_getprec(PyObject *self, PyObject *args) { ! int precres; SELF_NO_ARG("getprec", Pympf_convert_arg); --- 5141,5145 ---- Pympf_getprec(PyObject *self, PyObject *args) { ! unsigned long precres; SELF_NO_ARG("getprec", Pympf_convert_arg); *************** *** 5118,5122 **** precres = mpf_get_prec(Pympf_AS_MPF(self)); Py_DECREF(self); ! return Py_BuildValue("i", precres); } --- 5148,5152 ---- precres = mpf_get_prec(Pympf_AS_MPF(self)); Py_DECREF(self); ! return Py_BuildValue("l", precres); } *************** *** 5150,5159 **** Pympf_setprec(PyObject *self, PyObject *args) { ! int precres; assert(self); /* exists _as method, ONLY_ */ assert(Pympf_Check(self)); ! ONE_ARG("setprec", "i", &precres); if(precres<0) { PyErr_SetString(PyExc_ValueError, "n must be >=0"); --- 5180,5189 ---- Pympf_setprec(PyObject *self, PyObject *args) { ! long precres; assert(self); /* exists _as method, ONLY_ */ assert(Pympf_Check(self)); ! ONE_ARG("setprec", "l", &precres); if(precres<0) { PyErr_SetString(PyExc_ValueError, "n must be >=0"); |