diff --git a/src/fns.c b/src/fns.c index 069edbe90e2..a3b8d6ef57d 100644 --- a/src/fns.c +++ b/src/fns.c @@ -1749,38 +1749,17 @@ changing the value of a sequence `foo'. */) { ptrdiff_t n = 0; ptrdiff_t size = ASIZE (seq); - ptrdiff_t neqbits_words = ((size + BITS_PER_BITS_WORD - 1) - / BITS_PER_BITS_WORD); USE_SAFE_ALLOCA; - bits_word *neqbits = SAFE_ALLOCA (neqbits_words * sizeof *neqbits); - bits_word neqword = 0; + Lisp_Object *kept = SAFE_ALLOCA (size * sizeof *kept); for (ptrdiff_t i = 0; i < size; i++) { - bool neq = NILP (Fequal (AREF (seq, i), elt)); - n += neq; - neqbits[i / BITS_PER_BITS_WORD] = neqword = (neqword << 1) + neq; + kept[n] = AREF (seq, i); + n += NILP (Fequal (AREF (seq, i), elt)); } if (n != size) - { - struct Lisp_Vector *p = allocate_vector (n); - - if (n != 0) - { - ptrdiff_t j = 0; - for (ptrdiff_t i = 0; ; i++) - if (neqbits[i / BITS_PER_BITS_WORD] - & ((bits_word) 1 << (i % BITS_PER_BITS_WORD))) - { - p->contents[j++] = AREF (seq, i); - if (j == n) - break; - } - } - - XSETVECTOR (seq, p); - } + seq = Fvector (n, kept); SAFE_FREE (); } diff --git a/test/src/fns-tests.el b/test/src/fns-tests.el index 141de1d226c..400e9126486 100644 --- a/test/src/fns-tests.el +++ b/test/src/fns-tests.el @@ -898,5 +898,6 @@ (ert-deftest test-vector-delete () (let ((v1 (make-vector 1000 1))) + (should (equal (delete t [nil t]) [nil])) (should (equal (delete 1 v1) (vector))) (should (equal (delete 2 v1) v1))))