Date: Sunday, March 24, 2019 @ 13:04:37 Author: arojas Revision: 443325
Update to 8.7 Modified: sagemath-doc/trunk/PKGBUILD sagemath-doc/trunk/sagemath-doc-segfault.patch sagemath-doc/trunk/sagemath-doc-sphinx-1.8.patch Deleted: sagemath-doc/trunk/sagemath-cypari2.patch -------------------------------+ PKGBUILD | 26 - sagemath-cypari2.patch | 711 ---------------------------------------- sagemath-doc-segfault.patch | 63 --- sagemath-doc-sphinx-1.8.patch | 50 ++ 4 files changed, 59 insertions(+), 791 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2019-03-24 12:03:29 UTC (rev 443324) +++ PKGBUILD 2019-03-24 13:04:37 UTC (rev 443325) @@ -1,26 +1,24 @@ # Maintainer: Antonio Rojas <aro...@archlinux.org> pkgname=sagemath-doc -pkgver=8.6 -pkgrel=2 +pkgver=8.7 +pkgrel=1 pkgdesc="HTML documentation and inline help for SageMath" arch=(any) url="http://www.sagemath.org" license=(GPL) -depends=(python2-sphinx gap-doc thebe) +depends=(python2-sphinx gap-doc pplpy-doc thebe) makedepends=(sagemath python2-pyzmq python2-docutils python2-jupyter_client python2-pkgconfig cython2 python2-ipywidgets) -source=("$pkgname-$pkgver.tar.gz::https://github.com/sagemath/sage/archive/$pkgver.tar.gz" +source=(sagemath-$pkgver.tar.gz::"https://github.com/sagemath/sage/archive/$pkgver.tar.gz" docbuild_main.patch sagemath-doc-sphinx-1.8.patch sagemath-doc-segfault.patch - sagemath-ecl-sigfpe.patch - sagemath-cypari2.patch) -sha256sums=('dea613fc955cada76aaa7ab379bc5a219fe8b496064824f8c798b2b1651442fa' + sagemath-ecl-sigfpe.patch) +sha256sums=('263c3b3fc956b8bebc532f3b51e68c1b0d559d3b7e7c9fadffdfc0f4dbae18ab' 'ea5e17bb7a7cb36a22e5e3872fcc2585852bc971c4b139b0b2cd69a36c1b009b' - '337d1d84749c1415c120a95d621d8cb0a4ef6e29245193c673e4b3f3a5d56fe9' - '141ac064305526785fb6d9507896876cbf893cd41ec1e42d86fc836f766c200f' - 'a42f3b152b1aedb8abf16bc70971419919d1fe30328574e7fef8305f9d07d938' - 'ca47248d2ed5edfe663ea02e261ddbb26a7cb03bef67928dbec690d9b9a8f129') + 'ec6835d555056e1f20684de015f43c46cff62a132c9cd6f5ea7243c6bacd3f1e' + '2ee218610001f906015df647881581ff1f7eb0acf923b79b72056965129bac22' + 'a42f3b152b1aedb8abf16bc70971419919d1fe30328574e7fef8305f9d07d938') prepare() { cd sage-$pkgver @@ -32,10 +30,8 @@ ln -sr src/sage_setup local-python # fix build with sphinx 1.8 patch -p1 -i ../sagemath-doc-sphinx-1.8.patch -# Partially revert https://trac.sagemath.org/ticket/24655 to workaround a segfault - patch -Rp1 -i ../sagemath-doc-segfault.patch -# Fix build with cypari 2.0 https://trac.sagemath.org/ticket/26442 - patch -p1 -i ../sagemath-cypari2.patch +# Fix segfault when pari is compiled with threads https://trac.sagemath.org/ticket/26608 + patch -p1 -i ../sagemath-doc-segfault.patch # Fix SIGFPE crashes with ecl 16.1.3 https://trac.sagemath.org/ticket/22191 patch -p1 -i ../sagemath-ecl-sigfpe.patch } Deleted: sagemath-cypari2.patch =================================================================== --- sagemath-cypari2.patch 2019-03-24 12:03:29 UTC (rev 443324) +++ sagemath-cypari2.patch 2019-03-24 13:04:37 UTC (rev 443325) @@ -1,711 +0,0 @@ -diff --git a/src/sage/matrix/matrix_integer_dense.pxd b/src/sage/matrix/matrix_integer_dense.pxd -index bc3af7c..5dd2a8e 100644 ---- a/src/sage/matrix/matrix_integer_dense.pxd -+++ b/src/sage/matrix/matrix_integer_dense.pxd -@@ -30,6 +30,5 @@ cdef class Matrix_integer_dense(Matrix_dense): - - cdef Matrix_integer_dense _new(self, Py_ssize_t nrows, Py_ssize_t ncols) - -- cdef extract_hnf_from_pari_matrix(self, GEN H, int flag, bint include_zero_rows) - - cpdef _lift_crt(Matrix_integer_dense M, residues, moduli=*) -diff --git a/src/sage/matrix/matrix_integer_dense.pyx b/src/sage/matrix/matrix_integer_dense.pyx -index 4f0b0e6..87e3391 100644 ---- a/src/sage/matrix/matrix_integer_dense.pyx -+++ b/src/sage/matrix/matrix_integer_dense.pyx -@@ -87,11 +87,11 @@ from .args cimport SparseEntry, MatrixArgs_init - ######################################################### - # PARI C library - from cypari2.gen cimport Gen -+from cypari2.stack cimport clear_stack, new_gen -+from cypari2.paridecl cimport * - from sage.libs.pari.convert_gmp cimport INT_to_mpz - from sage.libs.pari.convert_flint cimport (_new_GEN_from_fmpz_mat_t, - _new_GEN_from_fmpz_mat_t_rotate90, integer_matrix) --from cypari2.stack cimport clear_stack --from cypari2.paridecl cimport * - ######################################################### - - from sage.arith.multi_modular cimport MultiModularBasis -@@ -2016,10 +2016,7 @@ cdef class Matrix_integer_dense(Matrix_dense): - raise ValueError("transformation matrix only available with p-adic algorithm") - elif algorithm in ["pari", "pari0", "pari1", "pari4"]: - flag = int(algorithm[-1]) if algorithm != "pari" else 1 -- if self.height().ndigits() > 10000 or n >= 50: -- H_m = self._hnf_pari_big(flag, include_zero_rows=include_zero_rows) -- else: -- H_m = self._hnf_pari(flag, include_zero_rows=include_zero_rows) -+ H_m = self._hnf_pari(flag, include_zero_rows=include_zero_rows) - elif algorithm == 'ntl': - if nr != nc: - raise ValueError("ntl only computes HNF for square matrices of full rank.") -@@ -5664,6 +5661,7 @@ cdef class Matrix_integer_dense(Matrix_dense): - matrices. - - EXAMPLES:: -+ - sage: matrix(ZZ,3,[1..9])._rank_pari() - 2 - """ -@@ -5674,16 +5672,12 @@ cdef class Matrix_integer_dense(Matrix_dense): - - def _hnf_pari(self, int flag=0, bint include_zero_rows=True): - """ -- Hermite form of this matrix, computed using PARI. The -- computation is done entirely on the PARI stack, then the PARI -- stack is cleared. This function is only useful for small -- matrices, and can crash on large matrices (e.g., if the PARI -- stack overflows). -+ Hermite normal form of this matrix, computed using PARI. - - INPUT: - - - ``flag`` -- 0 (default), 1, 3 or 4 (see docstring for -- gp.mathnf). -+ ``pari.mathnf``). - - - ``include_zero_rows`` -- boolean. if False, do not include - any of the zero rows at the bottom of the matrix in the -@@ -5733,98 +5727,13 @@ cdef class Matrix_integer_dense(Matrix_dense): - sage: pari('mathnf(Mat([0,1]), 4)') - [Mat(1), [1, 0; 0, 1]] - """ -- cdef GEN A - sig_on() - A = _new_GEN_from_fmpz_mat_t_rotate90(self._matrix) -- cdef GEN H = mathnf0(A, flag) -- B = self.extract_hnf_from_pari_matrix(H, flag, include_zero_rows) -- clear_stack() # This calls sig_off() -- return B -- -- -- def _hnf_pari_big(self, int flag=0, bint include_zero_rows=True): -- """ -- Hermite form of this matrix, computed using PARI. -- -- INPUT: -- -- - ``flag`` -- 0 (default), 1, 3 or 4 (see docstring for -- gp.mathnf). -- -- - ``include_zero_rows`` -- boolean. if False, do not include -- any of the zero rows at the bottom of the matrix in the -- output. -- -- .. NOTE:: -- -- In no cases is the transformation matrix returned by this -- function. -- -- EXAMPLES:: -- -- sage: a = matrix(ZZ,3,3,[1..9]) -- sage: a._hnf_pari_big(flag=0, include_zero_rows=True) -- [1 2 3] -- [0 3 6] -- [0 0 0] -- sage: a._hnf_pari_big(flag=1, include_zero_rows=True) -- [1 2 3] -- [0 3 6] -- [0 0 0] -- sage: a._hnf_pari_big(flag=3, include_zero_rows=True) -- [1 2 3] -- [0 3 6] -- [0 0 0] -- sage: a._hnf_pari_big(flag=4, include_zero_rows=True) -- [1 2 3] -- [0 3 6] -- [0 0 0] -- -- Check that ``include_zero_rows=False`` works correctly:: -- -- sage: matrix(ZZ,3,[1..9])._hnf_pari_big(0, include_zero_rows=False) -- [1 2 3] -- [0 3 6] -- sage: matrix(ZZ,3,[1..9])._hnf_pari_big(1, include_zero_rows=False) -- [1 2 3] -- [0 3 6] -- sage: matrix(ZZ,3,[1..9])._hnf_pari_big(3, include_zero_rows=False) -- [1 2 3] -- [0 3 6] -- sage: matrix(ZZ,3,[1..9])._hnf_pari_big(4, include_zero_rows=False) -- [1 2 3] -- [0 3 6] -- """ -- cdef Gen H = integer_matrix(self._matrix, 1) -- H = H.mathnf(flag) -- sig_on() -- B = self.extract_hnf_from_pari_matrix(H.g, flag, include_zero_rows) -- clear_stack() # This calls sig_off() -- return B -- -- cdef extract_hnf_from_pari_matrix(self, GEN H, int flag, bint include_zero_rows): -- # Throw away the transformation matrix (yes, we should later -- # code this to keep track of it). -- cdef mpz_t tmp -- mpz_init(tmp) -- if flag > 0: -- H = gel(H,1) -- -- # Figure out how many columns we got back. -- cdef Py_ssize_t H_nc = glength(H) # number of columns -- # Now get the resulting Hermite form matrix back to Sage, suitably re-arranged. -- cdef Matrix_integer_dense B -- if include_zero_rows: -- B = self.new_matrix() -- else: -- B = self.new_matrix(nrows=H_nc) -- for i in range(self._ncols): -- for j in range(H_nc): -- INT_to_mpz(tmp, gcoeff(H, i+1, H_nc-j)) -- fmpz_set_mpz(fmpz_mat_entry(B._matrix,j,self._ncols-i-1),tmp) -- mpz_clear(tmp) -- return B -- -+ H = mathnf0(A, flag) -+ if typ(H) == t_VEC: -+ H = gel(H, 1) -+ GenH = new_gen(H) -+ return extract_hnf_from_pari_matrix(self, GenH, include_zero_rows) - - def p_minimal_polynomials(self, p, s_max=None): - r""" -@@ -5966,7 +5875,27 @@ cdef inline GEN pari_GEN(Matrix_integer_dense B): - return A - - -- ##################################################################################### -+cdef extract_hnf_from_pari_matrix(Matrix_integer_dense self, Gen H, bint include_zero_rows): -+ cdef mpz_t tmp -+ mpz_init(tmp) -+ -+ # Figure out how many columns we got back. -+ cdef long H_nc = glength(H.g) # number of columns -+ # Now get the resulting Hermite form matrix back to Sage, suitably re-arranged. -+ cdef Matrix_integer_dense B -+ if include_zero_rows: -+ B = self.new_matrix() -+ else: -+ B = self.new_matrix(nrows=H_nc) -+ cdef long i, j -+ for i in range(self._ncols): -+ for j in range(H_nc): -+ sig_check() -+ INT_to_mpz(tmp, gcoeff(H.g, i+1, H_nc-j)) -+ fmpz_set_mpz(fmpz_mat_entry(B._matrix,j,self._ncols-i-1),tmp) -+ mpz_clear(tmp) -+ return B -+ - - cdef _clear_columns(Matrix_integer_dense A, pivots, Py_ssize_t n): - # Clear all columns -@@ -5990,11 +5919,6 @@ cdef _clear_columns(Matrix_integer_dense A, pivots, Py_ssize_t n): - fmpz_clear(t) - sig_off() - --############################################################### -- -- -- -- - - cpdef _lift_crt(Matrix_integer_dense M, residues, moduli=None): - """ -diff --git a/src/sage/modular/modform/eis_series_cython.pyx b/src/sage/modular/modform/eis_series_cython.pyx -index f7e944c..3557c6b 100644 ---- a/src/sage/modular/modform/eis_series_cython.pyx -+++ b/src/sage/modular/modform/eis_series_cython.pyx -@@ -3,7 +3,7 @@ Eisenstein Series (optimized compiled functions) - """ - - from cysignals.memory cimport check_allocarray, sig_free --from cysignals.signals cimport sig_on, sig_off -+from cysignals.signals cimport sig_check - - from sage.rings.rational_field import QQ - from sage.rings.power_series_ring import PowerSeriesRing -@@ -161,8 +161,7 @@ cpdef eisenstein_series_poly(int k, int prec = 10) : - """ - cdef mpz_t *val = <mpz_t *>check_allocarray(prec, sizeof(mpz_t)) - cdef mpz_t one, mult, term, last, term_m1, last_m1 -- cdef unsigned long int expt -- cdef long ind, ppow, int_p -+ cdef long ind - cdef int i - cdef Fmpz_poly res = Fmpz_poly.__new__(Fmpz_poly) - -@@ -173,8 +172,6 @@ cpdef eisenstein_series_poly(int k, int prec = 10) : - if (prec == 0): - return Fmpz_poly.__new__(Fmpz_poly) - -- sig_on() -- - mpz_init(one) - mpz_init(term) - mpz_init(last) -@@ -182,33 +179,33 @@ cpdef eisenstein_series_poly(int k, int prec = 10) : - mpz_init(term_m1) - mpz_init(last_m1) - -- for i from 0 <= i < prec : -- mpz_init(val[i]) -- mpz_set_si(val[i], 1) -+ for i in range(prec): -+ mpz_init_set_si(val[i], 1) - - mpz_set_si(one, 1) - -- expt = <unsigned long int>(k - 1) -- a0 = - bernoulli(k) / (2*k) -+ cdef unsigned long expt = k - 1 -+ a0 = -bernoulli(k) / (2*k) - -- for p in primes(1,prec) : -- int_p = int(p) -- ppow = <long int>int_p -+ cdef long p, ppow -+ for p in primes(1, prec) : -+ ppow = p - -- mpz_set_si(mult, int_p) -+ mpz_set_si(mult, p) - mpz_pow_ui(mult, mult, expt) - mpz_mul(term, mult, mult) - mpz_set(last, mult) - -- while (ppow < prec): -+ while ppow < prec: -+ sig_check() - ind = ppow - mpz_sub(term_m1, term, one) - mpz_sub(last_m1, last, one) -- while (ind < prec): -+ while ind < prec: - mpz_mul(val[ind], val[ind], term_m1) - mpz_fdiv_q(val[ind], val[ind], last_m1) - ind += ppow -- ppow *= int_p -+ ppow *= p - mpz_set(last, term) - mpz_mul(term, term, mult) - -@@ -228,6 +225,4 @@ cpdef eisenstein_series_poly(int k, int prec = 10) : - - sig_free(val) - -- sig_off() -- - return res -diff --git a/src/sage/plot/complex_plot.pyx b/src/sage/plot/complex_plot.pyx -index 758fb70..f499a3e 100644 ---- a/src/sage/plot/complex_plot.pyx -+++ b/src/sage/plot/complex_plot.pyx -@@ -19,7 +19,7 @@ Complex Plots - from __future__ import absolute_import - - # TODO: use NumPy buffers and complex fast_callable (when supported) --from cysignals.signals cimport sig_on, sig_off -+from cysignals.signals cimport sig_on, sig_off, sig_check - - cimport numpy as cnumpy - -@@ -381,12 +381,18 @@ def complex_plot(f, xrange, yrange, **options): - pass - - cdef double x, y -- ignore, ranges = setup_for_eval_on_grid([], [xrange, yrange], options['plot_points']) -- xrange,yrange=[r[:2] for r in ranges] -- sig_on() -- z_values = [[ f(new_CDF_element(x, y)) for x in srange(*ranges[0], include_endpoint=True)] -- for y in srange(*ranges[1], include_endpoint=True)] -- sig_off() -+ _, ranges = setup_for_eval_on_grid([], [xrange, yrange], options['plot_points']) -+ xrange = ranges[0] -+ yrange = ranges[1] -+ cdef list z_values = [] -+ cdef list row -+ for y in srange(*yrange, include_endpoint=True): -+ row = [] -+ for x in srange(*xrange, include_endpoint=True): -+ sig_check() -+ row.append(f(new_CDF_element(x, y))) -+ z_values.append(row) -+ - g = Graphics() - g._set_extra_kwds(Graphics._extract_kwds_for_show(options, ignore=['xmin', 'xmax'])) - g.add_primitive(ComplexPlot(complex_to_rgb(z_values), xrange, yrange, options)) -diff --git a/src/sage/rings/asymptotic/asymptotic_expansion_generators.py b/src/sage/rings/asymptotic/asymptotic_expansion_generators.py -index 84fa0e4..18f8e90 100644 ---- a/src/sage/rings/asymptotic/asymptotic_expansion_generators.py -+++ b/src/sage/rings/asymptotic/asymptotic_expansion_generators.py -@@ -1095,7 +1095,7 @@ class AsymptoticExpansionGenerators(SageObject): - sage: asymptotic_expansions.ImplicitExpansion('Z', phi=lambda u: 1 + 2*u + u^2, tau=2, precision=5) - Traceback (most recent call last): - ... -- ZeroDivisionError: Symbolic division by zero -+ ZeroDivisionError: symbolic division by zero - sage: asymptotic_expansions.ImplicitExpansion('Z', phi=lambda u: 1 + 2*u + u^2, tau=3, precision=5) - 3 - 4*I*sqrt(3)*Z^(-1/2) + 6*I*sqrt(3)*Z^(-3/2) + O(Z^(-2)) - -diff --git a/src/sage/rings/finite_rings/element_pari_ffelt.pyx b/src/sage/rings/finite_rings/element_pari_ffelt.pyx -index ff73a1f..2fcd3a1 100644 ---- a/src/sage/rings/finite_rings/element_pari_ffelt.pyx -+++ b/src/sage/rings/finite_rings/element_pari_ffelt.pyx -@@ -869,7 +869,8 @@ cdef class FiniteFieldElement_pari_ffelt(FinitePolyExtElement): - Univariate Polynomial Ring in beta over Finite Field of size 3 - """ - sig_on() -- return self._parent.polynomial_ring(name)(new_gen(FF_to_FpXQ_i(self.val))) -+ pol = new_gen(FF_to_FpXQ(self.val)) -+ return self._parent.polynomial_ring(name)(pol) - - def minpoly(self, var='x'): - """ -@@ -887,7 +888,8 @@ cdef class FiniteFieldElement_pari_ffelt(FinitePolyExtElement): - y^2 + 1 - """ - sig_on() -- return self._parent.polynomial_ring(var)(new_gen(FF_minpoly(self.val))) -+ pol = new_gen(FF_minpoly(self.val)) -+ return self._parent.polynomial_ring(var)(pol) - - def charpoly(self, var='x'): - """ -@@ -905,7 +907,8 @@ cdef class FiniteFieldElement_pari_ffelt(FinitePolyExtElement): - y^2 + 1 - """ - sig_on() -- return self._parent.polynomial_ring(var)(new_gen(FF_charpoly(self.val))) -+ pol = new_gen(FF_charpoly(self.val)) -+ return self._parent.polynomial_ring(var)(pol) - - def is_square(self): - """ -diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx -index 17e62f3..9e99bde 100644 ---- a/src/sage/rings/integer.pyx -+++ b/src/sage/rings/integer.pyx -@@ -6806,6 +6806,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): - ....: (2^100).binomial(2^22, algorithm='pari') - ....: except AlarmInterrupt: - ....: pass -+ doctest:...: RuntimeWarning: cypari2 leaked ... bytes on the PARI stack... - """ - cdef Integer x - cdef Integer mm -diff --git a/src/sage/rings/number_field/maps.py b/src/sage/rings/number_field/maps.py -index 1727c13..5717227 100644 ---- a/src/sage/rings/number_field/maps.py -+++ b/src/sage/rings/number_field/maps.py -@@ -358,7 +358,7 @@ class MapRelativeNumberFieldToRelativeVectorSpace(NumberFieldIsomorphism): - g = g(beta).lift() - # Convert the coefficients to elements of the base field. - B, from_B, _ = K.absolute_base_field() -- return self.codomain()([from_B(B(z.lift(), check=False)) for z in g.Vecrev(-K.relative_degree())]) -+ return self.codomain()([from_B(B(z.lift(), check=False)) for z in g.Vecrev(K.relative_degree())]) - - - class NameChangeMap(NumberFieldIsomorphism): -diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx -index a711e94..20895c0 100644 ---- a/src/sage/rings/polynomial/polynomial_element.pyx -+++ b/src/sage/rings/polynomial/polynomial_element.pyx -@@ -4363,8 +4363,7 @@ cdef class Polynomial(CommutativeAlgebraElement): - sage: G.prod() == g - True - """ -- pols = G[0] -- exps = G[1] -+ pols, exps = G - R = self._parent - F = [(R(f), int(e)) for f, e in zip(pols, exps)] - -diff --git a/src/sage/rings/power_series_pari.pyx b/src/sage/rings/power_series_pari.pyx -index e37e0a3..2e03ade 100644 ---- a/src/sage/rings/power_series_pari.pyx -+++ b/src/sage/rings/power_series_pari.pyx -@@ -678,7 +678,8 @@ cdef class PowerSeries_pari(PowerSeries): - g = g.truncate() - if typ(g.g) == t_POL and varn(g.g) == vn: - # t_POL has 2 codewords. Use new_ref instead of g[i] for speed. -- return [R(g.new_ref(gel(g.g, i))) for i in range(2, lg(g.g))] -+ G = g.fixGEN() -+ return [R(g.new_ref(gel(G, i))) for i in range(2, lg(G))] - else: - return [R(g)] - -@@ -729,6 +730,7 @@ cdef class PowerSeries_pari(PowerSeries): - return [] - - cdef pari_gen g = self.g -+ g.fixGEN() - cdef long l, m - - R = self.base_ring() -diff --git a/src/sage/rings/real_mpfr.pyx b/src/sage/rings/real_mpfr.pyx -index e273190..3b89f4b 100644 ---- a/src/sage/rings/real_mpfr.pyx -+++ b/src/sage/rings/real_mpfr.pyx -@@ -3212,7 +3212,6 @@ cdef class RealNumber(sage.structure.element.RingElement): - # by using internal interfaces of MPFR, which are documented - # as subject-to-change. - -- sig_on() - if mpfr_nan_p(self.value) or mpfr_inf_p(self.value): - raise ValueError('Cannot convert NaN or infinity to Pari float') - -@@ -3234,6 +3233,7 @@ cdef class RealNumber(sage.structure.element.RingElement): - cdef mp_exp_t exponent - cdef GEN pari_float - -+ sig_on() - if mpfr_zero_p(self.value): - pari_float = real_0_bit(-rounded_prec) - else: -@@ -3245,7 +3245,7 @@ cdef class RealNumber(sage.structure.element.RingElement): - # Create a PARI REAL - pari_float = cgetr(2 + rounded_prec / wordsize) - pari_float[1] = evalexpo(exponent + rounded_prec - 1) + evalsigne(mpfr_sgn(self.value)) -- mpz_export(&pari_float[2], NULL, 1, wordsize/8, 0, 0, mantissa) -+ mpz_export(&pari_float[2], NULL, 1, wordsize // 8, 0, 0, mantissa) - mpz_clear(mantissa) - - return new_gen(pari_float) -diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx -index 586d4ab..c14b9a6 100644 ---- a/src/sage/symbolic/expression.pyx -+++ b/src/sage/symbolic/expression.pyx -@@ -1273,12 +1273,7 @@ cdef class Expression(CommutativeRingElement): - sage: f._convert({'parent':int}) - 0 - """ -- cdef GEx res -- sig_on() -- try: -- res = self._gobj.evalf(0, kwds) -- finally: -- sig_off() -+ cdef GEx res = self._gobj.evalf(0, kwds) - return new_Expression_from_GEx(self._parent, res) - - def _mpfr_(self, R): -@@ -2839,11 +2834,7 @@ cdef class Expression(CommutativeRingElement): - # constants are wrappers around Sage objects, compare directly - if is_a_constant(self._gobj.lhs()) and is_a_constant(self._gobj.rhs()): - return self.operator()(self.lhs().pyobject(), self.rhs().pyobject()) -- sig_on() -- try: -- pynac_result = decide_relational(self._gobj) -- finally: -- sig_off() -+ pynac_result = decide_relational(self._gobj) - if pynac_result == relational_undecidable: - raise ValueError('undecidable relation: ' + repr(self)) - -@@ -3233,27 +3224,23 @@ cdef class Expression(CommutativeRingElement): - cdef GEx x - cdef Expression _right = <Expression>right - cdef operators op -- sig_on() -- try: -- if is_a_relational(left._gobj): -- if is_a_relational(_right._gobj): -- op = compatible_relation(relational_operator(left._gobj), -- relational_operator(_right._gobj)) -- x = relational(left._gobj.lhs() + _right._gobj.lhs(), -- left._gobj.rhs() + _right._gobj.rhs(), -- op) -- else: -- x = relational(left._gobj.lhs() + _right._gobj, -- left._gobj.rhs() + _right._gobj, -- relational_operator(left._gobj)) -- elif is_a_relational(_right._gobj): -- x = relational(left._gobj + _right._gobj.lhs(), -- left._gobj + _right._gobj.rhs(), -- relational_operator(_right._gobj)) -+ if is_a_relational(left._gobj): -+ if is_a_relational(_right._gobj): -+ op = compatible_relation(relational_operator(left._gobj), -+ relational_operator(_right._gobj)) -+ x = relational(left._gobj.lhs() + _right._gobj.lhs(), -+ left._gobj.rhs() + _right._gobj.rhs(), -+ op) - else: -- x = left._gobj + _right._gobj -- finally: -- sig_off() -+ x = relational(left._gobj.lhs() + _right._gobj, -+ left._gobj.rhs() + _right._gobj, -+ relational_operator(left._gobj)) -+ elif is_a_relational(_right._gobj): -+ x = relational(left._gobj + _right._gobj.lhs(), -+ left._gobj + _right._gobj.rhs(), -+ relational_operator(_right._gobj)) -+ else: -+ x = left._gobj + _right._gobj - return new_Expression_from_GEx(left._parent, x) - - cpdef _sub_(left, right): -@@ -3289,27 +3276,23 @@ cdef class Expression(CommutativeRingElement): - """ - cdef GEx x - cdef Expression _right = <Expression>right -- sig_on() -- try: -- if is_a_relational(left._gobj): -- if is_a_relational(_right._gobj): -- op = compatible_relation(relational_operator(left._gobj), -- relational_operator(_right._gobj)) -- x = relational(left._gobj.lhs() - _right._gobj.lhs(), -- left._gobj.rhs() - _right._gobj.rhs(), -- op) -- else: -- x = relational(left._gobj.lhs() - _right._gobj, -- left._gobj.rhs() - _right._gobj, -- relational_operator(left._gobj)) -- elif is_a_relational(_right._gobj): -- x = relational(left._gobj - _right._gobj.lhs(), -- left._gobj - _right._gobj.rhs(), -- relational_operator(_right._gobj)) -+ if is_a_relational(left._gobj): -+ if is_a_relational(_right._gobj): -+ op = compatible_relation(relational_operator(left._gobj), -+ relational_operator(_right._gobj)) -+ x = relational(left._gobj.lhs() - _right._gobj.lhs(), -+ left._gobj.rhs() - _right._gobj.rhs(), -+ op) - else: -- x = left._gobj - _right._gobj -- finally: -- sig_off() -+ x = relational(left._gobj.lhs() - _right._gobj, -+ left._gobj.rhs() - _right._gobj, -+ relational_operator(left._gobj)) -+ elif is_a_relational(_right._gobj): -+ x = relational(left._gobj - _right._gobj.lhs(), -+ left._gobj - _right._gobj.rhs(), -+ relational_operator(_right._gobj)) -+ else: -+ x = left._gobj - _right._gobj - return new_Expression_from_GEx(left._parent, x) - - cpdef _mul_(left, right): -@@ -3457,29 +3440,25 @@ cdef class Expression(CommutativeRingElement): - cdef GEx x - cdef Expression _right = <Expression>right - cdef operators o -- sig_on() -- try: -- if is_a_relational(left._gobj): -- if is_a_relational(_right._gobj): -- op = compatible_relation(relational_operator(left._gobj), -- relational_operator(_right._gobj)) -- x = relational(left._gobj.lhs() * _right._gobj.lhs(), -- left._gobj.rhs() * _right._gobj.rhs(), -- op) -- else: -- o = relational_operator(left._gobj) -- x = relational(left._gobj.lhs() * _right._gobj, -- left._gobj.rhs() * _right._gobj, -- o) -- elif is_a_relational(_right._gobj): -- o = relational_operator(_right._gobj) -- x = relational(left._gobj * _right._gobj.lhs(), -- left._gobj * _right._gobj.rhs(), -- o) -+ if is_a_relational(left._gobj): -+ if is_a_relational(_right._gobj): -+ op = compatible_relation(relational_operator(left._gobj), -+ relational_operator(_right._gobj)) -+ x = relational(left._gobj.lhs() * _right._gobj.lhs(), -+ left._gobj.rhs() * _right._gobj.rhs(), -+ op) - else: -- x = left._gobj * _right._gobj -- finally: -- sig_off() -+ o = relational_operator(left._gobj) -+ x = relational(left._gobj.lhs() * _right._gobj, -+ left._gobj.rhs() * _right._gobj, -+ o) -+ elif is_a_relational(_right._gobj): -+ o = relational_operator(_right._gobj) -+ x = relational(left._gobj * _right._gobj.lhs(), -+ left._gobj * _right._gobj.rhs(), -+ o) -+ else: -+ x = left._gobj * _right._gobj - return new_Expression_from_GEx(left._parent, x) - - cpdef _div_(left, right): -@@ -3553,7 +3532,7 @@ cdef class Expression(CommutativeRingElement): - sage: x/0 - Traceback (most recent call last): - ... -- ZeroDivisionError: Symbolic division by zero -+ ZeroDivisionError: symbolic division by zero - - Check if Pynac can compute divisions of Python longs (:trac:`13107`):: - -@@ -3563,7 +3542,6 @@ cdef class Expression(CommutativeRingElement): - cdef GEx x - cdef Expression _right = <Expression>right - cdef operators o -- sig_on() - try: - if is_a_relational(left._gobj): - if is_a_relational(_right._gobj): -@@ -3589,11 +3567,9 @@ cdef class Expression(CommutativeRingElement): - # TODO: change this to maybe cleverly do something involving Cython C++ exception handling. - # See http://docs.cython.org/docs/wrapping_CPlusPlus.html - if 'division by zero' in str(msg): -- raise ZeroDivisionError("Symbolic division by zero") -+ raise ZeroDivisionError("symbolic division by zero") - else: - raise -- finally: -- sig_off() - - def __invert__(self): - """ -@@ -5314,11 +5290,7 @@ cdef class Expression(CommutativeRingElement): - for k, v in sdict.iteritems(): - smap.insert(make_pair((<Expression>self.coerce_in(k))._gobj, - (<Expression>self.coerce_in(v))._gobj)) -- sig_on() -- try: -- res = self._gobj.subs_map(smap, 0) -- finally: -- sig_off() -+ res = self._gobj.subs_map(smap, 0) - return new_Expression_from_GEx(self._parent, res) - - subs = substitute -@@ -7183,12 +7155,7 @@ cdef class Expression(CommutativeRingElement): - x^2 + 2*x + 2 - """ - cdef Expression r = self.coerce_in(b) -- cdef GEx x -- sig_on() -- try: -- x = g_gcd(self._gobj, r._gobj) -- finally: -- sig_off() -+ cdef GEx x = g_gcd(self._gobj, r._gobj) - return new_Expression_from_GEx(self._parent, x) - - def gosper_sum(self, *args): -@@ -8983,12 +8950,7 @@ cdef class Expression(CommutativeRingElement): - sage: t = SR(1).zeta(); t - Infinity - """ -- cdef GEx x -- sig_on() -- try: -- x = g_hold_wrapper(g_zeta, self._gobj, hold) -- finally: -- sig_off() -+ cdef GEx x = g_hold_wrapper(g_zeta, self._gobj, hold) - return new_Expression_from_GEx(self._parent, x) - - def factorial(self, hold=False): Modified: sagemath-doc-segfault.patch =================================================================== --- sagemath-doc-segfault.patch 2019-03-24 12:03:29 UTC (rev 443324) +++ sagemath-doc-segfault.patch 2019-03-24 13:04:37 UTC (rev 443325) @@ -2,62 +2,13 @@ index 5877b5b..7dc8ff7 100644 --- a/src/sage_setup/docbuild/__init__.py +++ b/src/sage_setup/docbuild/__init__.py -@@ -265,35 +265,29 @@ class DocBuilder(object): - # import the customized builder for object.inv files +@@ -265,7 +265,7 @@ class DocBuilder(object): inventory = builder_helper('inventory') --if NUM_THREADS > 1: -- def build_many(target, args): -- from multiprocessing import Pool -- pool = Pool(NUM_THREADS, maxtasksperchild=1) -- # map_async handles KeyboardInterrupt correctly. Plain map and -- # apply_async does not, so don't use it. -- x = pool.map_async(target, args, 1) -- try: -- ret = x.get(99999) -- pool.close() -- pool.join() -- except Exception: -- pool.terminate() -- if ABORT_ON_ERROR: -- raise -- return ret --else: -- def build_many(target, args): -- results = [] -- -- for arg in args: -- try: -- results.append(target(arg)) -- except Exception: -- if ABORT_ON_ERROR: -- raise -- -- return results -- -+def build_many(target, args): -+ # Pool() uses an actual fork() to run each new instance. This is important -+ # for performance reasons, i.e., don't use a forkserver when it becomes -+ # available with Python 3: Here, sage is already initialized which is quite -+ # costly, with a forkserver we would have to reinitialize it for every -+ # document we build. At the same time, don't serialize this by taking the -+ # pool (and thus the call to fork()) out completely: The call to Sphinx -+ # leaks memory, so we need to build each document in its own process to -+ # control the RAM usage. -+ from multiprocessing import Pool -+ pool = Pool(NUM_THREADS, maxtasksperchild=1) -+ # map_async handles KeyboardInterrupt correctly. Plain map and -+ # apply_async does not, so don't use it. -+ x = pool.map_async(target, args, 1) -+ try: -+ ret = x.get(99999) -+ pool.close() -+ pool.join() -+ except Exception: -+ pool.terminate() -+ if ABORT_ON_ERROR: -+ raise -+ return ret - ########################################## - # Parallel Building Ref Manual # +-if not (CYGWIN_VERSION and CYGWIN_VERSION[0] < 3): ++if False: + def build_many(target, args): + # Pool() uses an actual fork() to run each new instance. This is + # important for performance reasons, i.e., don't use a forkserver when + Modified: sagemath-doc-sphinx-1.8.patch =================================================================== --- sagemath-doc-sphinx-1.8.patch 2019-03-24 12:03:29 UTC (rev 443324) +++ sagemath-doc-sphinx-1.8.patch 2019-03-24 13:04:37 UTC (rev 443325) @@ -1,3 +1,25 @@ +diff --git a/src/doc/common/conf.py b/src/doc/common/conf.py +index 70dd17f..e9a3dae 100644 +--- a/src/doc/common/conf.py ++++ b/src/doc/common/conf.py +@@ -4,6 +4,8 @@ import sage.version + from sage.misc.sagedoc import extlinks + import dateutil.parser + from six import iteritems ++from docutils import nodes ++from docutils.transforms import Transform + + # If your extensions are in another directory, add it here. + sys.path.append(os.path.join(SAGE_SRC, "sage_setup", "docbuild", "ext")) +@@ -669,7 +671,7 @@ def call_intersphinx(app, env, node, contnode): + sage: for line in open(thematic_index).readlines(): # optional - dochtml + ....: if "padics" in line: + ....: _ = sys.stdout.write(line) +- <li><a class="reference external" href="../reference/padics/sage/rings/padics/tutorial.html#sage-rings-padics-tutorial" title="(in Sage Reference Manual: p-Adics v...)"><span>Introduction to the -adics</span></a></li> ++ <li><a class="reference external" href="../reference/padics/sage/rings/padics/tutorial.html#sage-rings-padics-tutorial" title="(in Sage Reference Manual: p-Adics v...)"><span>Introduction to the p-adics</span></a></li> + """ + debug_inf(app, "???? Trying intersphinx for %s" % node['reftarget']) + builder = app.builder diff --git a/src/sage/misc/sphinxify.py b/src/sage/misc/sphinxify.py index 6e21344..4270294 100644 --- a/src/sage/misc/sphinxify.py @@ -57,10 +79,10 @@ return output diff --git a/src/sage_setup/docbuild/__init__.py b/src/sage_setup/docbuild/__init__.py -index 534b40b..ff8f4c1 100644 +index 4546f87..9efe45d 100644 --- a/src/sage_setup/docbuild/__init__.py +++ b/src/sage_setup/docbuild/__init__.py -@@ -47,7 +47,6 @@ import logging, warnings +@@ -53,7 +53,6 @@ import warnings logger = logging.getLogger(__name__) @@ -68,7 +90,7 @@ import sphinx.util.console import sphinx.ext.intersphinx -@@ -334,6 +333,7 @@ class AllBuilder(object): +@@ -354,6 +353,7 @@ class AllBuilder(object): getattr(get_builder(document), 'inventory')(*args, **kwds) logger.warning("Building reference manual, second pass.\n") @@ -108,7 +130,7 @@ copy_download_files = removed_method_error copy_static_files = removed_method_error diff --git a/src/sage_setup/docbuild/ext/multidocs.py b/src/sage_setup/docbuild/ext/multidocs.py -index dc2e065..8c3736d 100644 +index 15c7ca5..bc5ca9e 100644 --- a/src/sage_setup/docbuild/ext/multidocs.py +++ b/src/sage_setup/docbuild/ext/multidocs.py @@ -32,6 +32,7 @@ from sphinx.util.console import bold @@ -126,7 +148,7 @@ - app.info(bold('Merging environment/index files...')) + logger.info(bold('Merging environment/index files...')) for curdoc in app.env.config.multidocs_subdoc_list: -- app.info(" %s:"%curdoc, nonl=1) +- app.info(" %s:" % curdoc, nonl=1) + logger.info(" %s:"%curdoc, nonl=1) docenv = get_env(app, curdoc) if docenv is not None: @@ -201,7 +223,7 @@ return None indexer.load(f, sphinx.search.js_index) f.close() -@@ -238,7 +239,7 @@ def write_citations(app, citations): +@@ -240,7 +241,7 @@ def write_citations(app, citations): outdir = citation_dir(app) with atomic_write(os.path.join(outdir, CITE_FILENAME), binary=True) as f: cPickle.dump(citations, f) @@ -210,7 +232,7 @@ def fetch_citation(app, env): -@@ -246,13 +247,13 @@ def fetch_citation(app, env): +@@ -248,13 +249,13 @@ def fetch_citation(app, env): Fetch the global citation index from the refman to allow for cross references. """ @@ -226,7 +248,7 @@ cite = env.domaindata["std"]["citations"] for ind, (path, tag, lineno) in six.iteritems(cache): if ind not in cite: # don't override local citation -@@ -265,18 +266,18 @@ def init_subdoc(app): +@@ -267,18 +268,18 @@ def init_subdoc(app): doc itself. """ if app.config.multidocs_is_master: @@ -248,7 +270,7 @@ app.connect('html-page-context', fix_path_html) if not app.config.multidoc_first_pass: app.connect('env-updated', fetch_citation) -@@ -292,7 +293,7 @@ def init_subdoc(app): +@@ -294,7 +295,7 @@ def init_subdoc(app): def copy_static_files(self): [...] """ @@ -257,6 +279,16 @@ static_dir = os.path.join(app.builder.outdir, '_static') master_static_dir = os.path.join('..', '_static') if os.path.lexists(static_dir): +@@ -308,6 +309,9 @@ def init_subdoc(app): + + if app.config.multidoc_first_pass == 1: + app.config.intersphinx_mapping = {} ++ else: ++ app.emit('env-check-consistency', app.env) ++ + + + def setup(app): diff --git a/src/sage_setup/docbuild/ext/sage_autodoc.py b/src/sage_setup/docbuild/ext/sage_autodoc.py index 25895d3..2e640a0 100644 --- a/src/sage_setup/docbuild/ext/sage_autodoc.py