Fix bytevector-fill! to accept fill arguments greater than 127.
authorMark H Weaver <mhw@netris.org>
Wed, 12 Nov 2014 05:40:47 +0000 (00:40 -0500)
committerMark H Weaver <mhw@netris.org>
Wed, 12 Nov 2014 05:50:38 +0000 (00:50 -0500)
Fixes <http://bugs.gnu.org/19027>.

* libguile/bytevectors.c (scm_bytevector_fill_x): Accept fill arguments
  between -128 and 255.

* test-suite/tests/bytevectors.test ("2.2 General Operations"): Add
  tests.

libguile/bytevectors.c
test-suite/tests/bytevectors.test

index 9f6b6ab..8f698d5 100644 (file)
@@ -537,9 +537,14 @@ SCM_DEFINE (scm_bytevector_fill_x, "bytevector-fill!", 2, 0, 0,
 {
   size_t c_len, i;
   scm_t_uint8 *c_bv, c_fill;
+  int value;
 
   SCM_VALIDATE_BYTEVECTOR (1, bv);
-  c_fill = scm_to_int8 (fill);
+
+  value = scm_to_int (fill);
+  if (SCM_UNLIKELY ((value < -128) || (value > 255)))
+    scm_out_of_range (FUNC_NAME, fill);
+  c_fill = (scm_t_uint8) value;
 
   c_len = SCM_BYTEVECTOR_LENGTH (bv);
   c_bv = (scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS (bv);
index 8abda4a..5b5adb3 100644 (file)
          (not (bytevector=? (make-bytevector 20 7)
                             (make-bytevector 20 0)))))
 
+  ;; This failed prior to Guile 2.0.12.
+  ;; See <http://bugs.gnu.org/19027>.
+  (pass-if-equal "bytevector-fill! with fill 255"
+      #vu8(255 255 255 255)
+    (let ((bv (make-bytevector 4)))
+      (bytevector-fill! bv 255)
+      bv))
+
+  ;; This is a Guile-specific extension.
+  (pass-if-equal "bytevector-fill! with fill -128"
+      #vu8(128 128 128 128)
+    (let ((bv (make-bytevector 4)))
+      (bytevector-fill! bv -128)
+      bv))
+
   (pass-if "bytevector-copy! overlapping"
     ;; See <http://debbugs.gnu.org/10070>.
     (let ((b (u8-list->bytevector '(1 2 3 4 5 6 7 8))))