FreeBSD Bugzilla – Attachment 75347 Details for
Bug 108855
please apply two patches for libgmp4
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
file.diff
file.diff (text/plain), 36.59 KB, created by
Maho Nakata
on 2007-02-07 01:30:18 UTC
(
hide
)
Description:
file.diff
Filename:
MIME Type:
Creator:
Maho Nakata
Created:
2007-02-07 01:30:18 UTC
Size:
36.59 KB
patch
obsolete
>--- ports/math/libgmp4/Makefile Thu Feb 1 11:41:47 2007 >+++ ports/math/libgmp4.new/Makefile Wed Feb 7 09:59:45 2007 >@@ -8,7 +8,7 @@ > > PORTNAME= libgmp > PORTVERSION= 4.2.1 >-PORTREVISION= 1 >+PORTREVISION= 2 > CATEGORIES= math devel > MASTER_SITES= ${MASTER_SITE_GNU} > MASTER_SITE_SUBDIR= gmp >diff -urN ports/math/libgmp4/files/patch-gmpxx.h.ternary ports/math/libgmp4.new/files/patch-gmpxx.h.ternary >--- ports/math/libgmp4/files/patch-gmpxx.h.ternary Thu Jan 1 09:00:00 1970 >+++ ports/math/libgmp4.new/files/patch-gmpxx.h.ternary Wed Feb 7 10:15:53 2007 >@@ -0,0 +1,522 @@ >+[2006-11-30] With the C++ wrapper, ternary operations such as a=c+b*a where the desination variable is also used as a source, will compute garbage. >+http://www.swox.com/gmp/patches/gmpxx.h.ternary.diff >+ >+Index: gmpxx.h >+=================================================================== >+RCS file: /home/cvsfiles/gmp42/gmpxx.h,v >+retrieving revision 1.4 >+retrieving revision 1.5 >+diff -p -2 -r1.4 -r1.5 >+*** gmpxx.h 8 Apr 2006 19:58:48 -0000 1.4 >+--- gmpxx.h 31 Oct 2006 10:40:59 -0000 1.5 >+*************** struct __gmp_cmp_function >+*** 1278,1367 **** >+ }; >+ >+- struct __gmp_ternary_addmul // z = w + v * u >+- { >+- static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, mpz_srcptr u) >+- { mpz_set(z, w); mpz_addmul(z, v, u); } >+- >+- static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, unsigned long int l) >+- { mpz_set(z, w); mpz_addmul_ui(z, v, l); } >+- static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l, mpz_srcptr v) >+- { mpz_set(z, w); mpz_addmul_ui(z, v, l); } >+- static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, signed long int l) >+- { >+- mpz_set(z, w); >+- if (l >= 0) >+- mpz_addmul_ui(z, v, l); >+- else >+- mpz_submul_ui(z, v, -l); >+- } >+- static void eval(mpz_ptr z, mpz_srcptr w, signed long int l, mpz_srcptr v) >+- { >+- mpz_set(z, w); >+- if (l >= 0) >+- mpz_addmul_ui(z, v, l); >+- else >+- mpz_submul_ui(z, v, -l); >+- } >+- static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, double d) >+- { >+- mpz_t temp; >+- mpz_init_set_d(temp, d); >+- mpz_set(z, w); >+- mpz_addmul(z, v, temp); >+- mpz_clear(temp); >+- } >+- static void eval(mpz_ptr z, mpz_srcptr w, double d, mpz_srcptr v) >+- { >+- mpz_t temp; >+- mpz_init_set_d(temp, d); >+- mpz_set(z, w); >+- mpz_addmul(z, temp, v); >+- mpz_clear(temp); >+- } >+- }; >+- >+- struct __gmp_ternary_submul // z = w - v * u >+- { >+- static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, mpz_srcptr u) >+- { mpz_set(z, w); mpz_submul(z, v, u); } >+- >+- static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, unsigned long int l) >+- { mpz_set(z, w); mpz_submul_ui(z, v, l); } >+- static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l, mpz_srcptr v) >+- { mpz_set(z, w); mpz_submul_ui(z, v, l); } >+- static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, signed long int l) >+- { >+- mpz_set(z, w); >+- if (l >= 0) >+- mpz_submul_ui(z, v, l); >+- else >+- mpz_addmul_ui(z, v, -l); >+- } >+- static void eval(mpz_ptr z, mpz_srcptr w, signed long int l, mpz_srcptr v) >+- { >+- mpz_set(z, w); >+- if (l >= 0) >+- mpz_submul_ui(z, v, l); >+- else >+- mpz_addmul_ui(z, v, -l); >+- } >+- static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, double d) >+- { >+- mpz_t temp; >+- mpz_init_set_d(temp, d); >+- mpz_set(z, w); >+- mpz_submul(z, v, temp); >+- mpz_clear(temp); >+- } >+- static void eval(mpz_ptr z, mpz_srcptr w, double d, mpz_srcptr v) >+- { >+- mpz_t temp; >+- mpz_init_set_d(temp, d); >+- mpz_set(z, w); >+- mpz_submul(z, temp, v); >+- mpz_clear(temp); >+- } >+- }; >+- >+ struct __gmp_rand_function >+ { >+--- 1278,1281 ---- >+*************** __GMPZQ_DEFINE_EXPR(__gmp_binary_minus) >+*** 2863,3277 **** >+ >+ >+- /* Integer ternary expressions of the kind `a+b*c' or `a*b+c' can be >+- evaluated directly via mpz_addmul */ >+- >+- // a + b * c >+- #define __GMP_DEFINE_TERNARY_EXPR(eval_fun1, eval_fun2, eval_both) \ >+- \ >+- template <> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef mpz_class val1_type; \ >+- typedef __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { eval_both::eval \ >+- (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \ >+- expr.val2.get_val2().get_mpz_t()); } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<mpz_class, T, eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef mpz_class val1_type; \ >+- typedef __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<mpz_class, T, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { eval_both::eval \ >+- (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \ >+- expr.val2.get_val2()); } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<T, mpz_class, eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef mpz_class val1_type; \ >+- typedef __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<T, mpz_class, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { eval_both::eval \ >+- (z, expr.val1.get_mpz_t(), expr.val2.get_val1(), \ >+- expr.val2.get_val2().get_mpz_t()); } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, T>, eval_fun1> >, \ >+- eval_fun2> > \ >+- { \ >+- private: \ >+- typedef mpz_class val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <mpz_class, __gmp_expr<mpz_t, T>, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp(expr.val2.get_val2()); \ >+- eval_both::eval \ >+- (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \ >+- temp.get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, mpz_class, eval_fun1> >, \ >+- eval_fun2> > \ >+- { \ >+- private: \ >+- typedef mpz_class val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <__gmp_expr<mpz_t, T>, mpz_class, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp(expr.val2.get_val1()); \ >+- eval_both::eval(z, expr.val1.get_mpz_t(), temp.get_mpz_t(), \ >+- expr.val2.get_val2().get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, U, eval_fun1> >, \ >+- eval_fun2> > \ >+- { \ >+- private: \ >+- typedef mpz_class val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <__gmp_expr<mpz_t, T>, U, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp(expr.val2.get_val1()); \ >+- eval_both::eval \ >+- (z, expr.val1.get_mpz_t(), temp.get_mpz_t(), expr.val2.get_val2()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<T, __gmp_expr<mpz_t, U>, eval_fun1> >, \ >+- eval_fun2> > \ >+- { \ >+- private: \ >+- typedef mpz_class val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <T, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp(expr.val2.get_val2()); \ >+- eval_both::eval \ >+- (z, expr.val1.get_mpz_t(), expr.val2.get_val1(), temp.get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, \ >+- eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef mpz_class val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp1(expr.val2.get_val1()); \ >+- mpz_class temp2(expr.val2.get_val2()); \ >+- eval_both::eval \ >+- (z, expr.val1.get_mpz_t(), temp1.get_mpz_t(), temp2.get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \ >+- __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> >, \ >+- eval_fun2> > \ >+- { \ >+- private: \ >+- typedef __gmp_expr<mpz_t, T> val1_type; \ >+- typedef __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp(expr.val1); \ >+- eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \ >+- expr.val2.get_val2().get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \ >+- __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, U, eval_fun1> >, \ >+- eval_fun2> > \ >+- { \ >+- private: \ >+- typedef __gmp_expr<mpz_t, T> val1_type; \ >+- typedef __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<mpz_class, U, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp(expr.val1); \ >+- eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \ >+- expr.val2.get_val2()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \ >+- __gmp_expr<mpz_t, __gmp_binary_expr<U, mpz_class, eval_fun1> >, \ >+- eval_fun2> > \ >+- { \ >+- private: \ >+- typedef __gmp_expr<mpz_t, T> val1_type; \ >+- typedef __gmp_expr \ >+- <mpz_t, __gmp_binary_expr<U, mpz_class, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp(expr.val1); \ >+- eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1(), \ >+- expr.val2.get_val2().get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \ >+- __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, U>, \ >+- eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef __gmp_expr<mpz_t, T> val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <mpz_class, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp1(expr.val1); \ >+- mpz_class temp2(expr.val2.get_val2()); \ >+- eval_both::eval \ >+- (z, temp1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \ >+- temp2.get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \ >+- __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, mpz_class, \ >+- eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef __gmp_expr<mpz_t, T> val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <__gmp_expr<mpz_t, U>, mpz_class, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp1(expr.val1); \ >+- mpz_class temp2(expr.val2.get_val1()); \ >+- eval_both::eval(z, temp1.get_mpz_t(), temp2.get_mpz_t(), \ >+- expr.val2.get_val2().get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U, class V> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \ >+- __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, V, \ >+- eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef __gmp_expr<mpz_t, T> val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <__gmp_expr<mpz_t, U>, V, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp1(expr.val1); \ >+- mpz_class temp2(expr.val2.get_val1()); \ >+- eval_both::eval \ >+- (z, temp1.get_mpz_t(), temp2.get_mpz_t(), expr.val2.get_val2()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U, class V> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \ >+- __gmp_expr<mpz_t, __gmp_binary_expr<U, __gmp_expr<mpz_t, V>, \ >+- eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef __gmp_expr<mpz_t, T> val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <U, __gmp_expr<mpz_t, V>, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp1(expr.val1); \ >+- mpz_class temp2(expr.val2.get_val2()); \ >+- eval_both::eval \ >+- (z, temp1.get_mpz_t(), expr.val2.get_val1(), temp2.get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; \ >+- \ >+- template <class T, class U, class V> \ >+- class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \ >+- __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, \ >+- __gmp_expr<mpz_t, V>, eval_fun1> >, eval_fun2> > \ >+- { \ >+- private: \ >+- typedef __gmp_expr<mpz_t, T> val1_type; \ >+- typedef __gmp_expr<mpz_t, __gmp_binary_expr \ >+- <__gmp_expr<mpz_t, U>, __gmp_expr<mpz_t, V>, eval_fun1> > val2_type; \ >+- \ >+- __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \ >+- public: \ >+- __gmp_expr(const val1_type &val1, const val2_type &val2) \ >+- : expr(val1, val2) { } \ >+- void eval(mpz_ptr z) const \ >+- { \ >+- mpz_class temp1(expr.val1); \ >+- mpz_class temp2(expr.val2.get_val1()); \ >+- mpz_class temp3(expr.val2.get_val2()); \ >+- eval_both::eval \ >+- (z, temp1.get_mpz_t(), temp2.get_mpz_t(), temp3.get_mpz_t()); \ >+- } \ >+- const val1_type & get_val1() const { return expr.val1; } \ >+- const val2_type & get_val2() const { return expr.val2; } \ >+- unsigned long int get_prec() const { return mpf_get_default_prec(); } \ >+- }; >+- >+- >+- __GMP_DEFINE_TERNARY_EXPR(__gmp_binary_multiplies, __gmp_binary_plus, >+- __gmp_ternary_addmul) >+- __GMP_DEFINE_TERNARY_EXPR(__gmp_binary_multiplies, __gmp_binary_minus, >+- __gmp_ternary_submul) >+ >+ /**************** Macros for defining functions ****************/ >+--- 2777,2780 ---- >diff -urN ports/math/libgmp4/files/patch-mpz_set_d ports/math/libgmp4.new/files/patch-mpz_set_d >--- ports/math/libgmp4/files/patch-mpz_set_d Thu Jan 1 09:00:00 1970 >+++ ports/math/libgmp4.new/files/patch-mpz_set_d Wed Feb 7 10:16:16 2007 >@@ -0,0 +1,15 @@ >+[2006-09-23] In mpz_set_d, arguments smaller than 1e-19 will trigger undefined behaviour, typically a crash. Note that this is a somewhat deegnerate use of mpz_set_d that should not normally happen, since any arguments < 1 will yield 0. >+http://www.swox.com/gmp/patches/mpz_set_d.diff >+ >+*** mpz/set_d.c 14 Mar 2006 15:57:54 -0000 1.1 >+--- mpz/set_d.c 31 May 2006 14:50:05 -0000 1.2 >+*************** mpz_set_d (mpz_ptr r, double d) >+*** 57,60 **** >+--- 58,64 ---- >+ _mpz_realloc (r, rn); >+ >++ if (rn <= 0) >++ rn = 0; >++ >+ rp = PTR (r); >+
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 108855
: 75347