From 7eeab93b6d792330dd8742dc10998fa06b55131b Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sat, 30 Aug 2025 14:08:52 +0700 Subject: [PATCH 1/3] Fix another libgap segmentation fault --- src/sage/libs/gap/element.pyx | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/sage/libs/gap/element.pyx b/src/sage/libs/gap/element.pyx index 0ad38405b78..54b77cb7daf 100644 --- a/src/sage/libs/gap/element.pyx +++ b/src/sage/libs/gap/element.pyx @@ -45,21 +45,25 @@ cdef Obj make_gap_list(sage_list) except NULL: - ``a`` -- list of :class:`GapElement` OUTPUT: list of the elements in ``a`` as a Gap ``Obj`` + + TESTS:: + + sage: from sage.doctest.util import ensure_interruptible_after + sage: for i in range(10): + ....: with ensure_interruptible_after(0.1): + ....: ignore = libgap([1000]*10000) + ....: with ensure_interruptible_after(0.3): + ....: ignore = libgap([1000]*100000) """ cdef Obj l - cdef GapElement elem - cdef int i + cdef tuple gap_elements = tuple(x if isinstance(x, GapElement) else libgap(x) for x in sage_list) + cdef Py_ssize_t n = len(gap_elements), i + try: GAP_Enter() - l = GAP_NewPlist(0) - - for i, x in enumerate(sage_list): - if not isinstance(x, GapElement): - elem = libgap(x) - else: - elem = x - - GAP_AssList(l, i + 1, elem.value) + l = GAP_NewPlist(n) + for i in range(n): + GAP_AssList(l, i + 1, ( gap_elements[i]).value) return l finally: GAP_Leave() From 0bdc010490d4bc0125ebe1143e0433e8393797cd Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 15 Oct 2025 22:21:27 +0700 Subject: [PATCH 2/3] Adjust threshold to avoid code terminate early --- src/sage/libs/gap/element.pyx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sage/libs/gap/element.pyx b/src/sage/libs/gap/element.pyx index 4e61b79484d..82ce4e02295 100644 --- a/src/sage/libs/gap/element.pyx +++ b/src/sage/libs/gap/element.pyx @@ -49,9 +49,7 @@ cdef Obj make_gap_list(sage_list) except NULL: sage: from sage.doctest.util import ensure_interruptible_after sage: for i in range(10): - ....: with ensure_interruptible_after(0.1): - ....: ignore = libgap([1000]*10000) - ....: with ensure_interruptible_after(0.3): + ....: with ensure_interruptible_after(0.2): ....: ignore = libgap([1000]*100000) """ cdef Obj l From 97f9af09f111920a9f29e6d8706b1b9494bbd234 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 15 Oct 2025 22:49:19 +0700 Subject: [PATCH 3/3] Refactor make_gap_matrix to use make_gap_list --- src/sage/libs/gap/element.pyx | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/src/sage/libs/gap/element.pyx b/src/sage/libs/gap/element.pyx index 82ce4e02295..de2965f3728 100644 --- a/src/sage/libs/gap/element.pyx +++ b/src/sage/libs/gap/element.pyx @@ -84,30 +84,10 @@ cdef Obj make_gap_matrix(sage_list, gap_ring) except NULL: The list of the elements in ``sage_list`` as a Gap ``Obj``. """ - cdef Obj l - cdef GapElement elem - cdef GapElement one - cdef int i - if gap_ring is not None: - one = gap_ring.One() - else: - one = libgap(1) - - try: - GAP_Enter() - l = GAP_NewPlist(0) - - for i, x in enumerate(sage_list): - if not isinstance(x, GapElement): - elem = libgap(x) - elem = elem * one - else: - elem = x - - GAP_AssList(l, i + 1, elem.value) - return l - finally: - GAP_Leave() + cdef GapElement one = gap_ring.One() if gap_ring is not None else libgap(1) + return make_gap_list([ + x if isinstance(x, GapElement) else libgap(x) * one + for x in sage_list]) cdef char *capture_stdout(Obj func, Obj obj) noexcept: