From a1c9ecf0a46fb3b09a268030f790aa487d38a433 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Tue, 16 Jul 2013 12:06:45 -0400 Subject: [PATCH] Fix 'fxbit-count' for negative arguments. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reported by Göran Weinholt . * module/rnrs/arithmetic/fixnums.scm (fxbit-count): If the argument is negative, return the 'bitwise-not' of the result of 'logcount', as per R6RS. Previously, 'fxbit-count' was identical to 'logcount'. * test-suite/tests/r6rs-arithmetic-fixnums.test (fxbit-count): Add test. --- module/rnrs/arithmetic/fixnums.scm | 9 +++++++-- test-suite/tests/r6rs-arithmetic-fixnums.test | 6 ++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/module/rnrs/arithmetic/fixnums.scm b/module/rnrs/arithmetic/fixnums.scm index e6261999a..dbf9ee746 100644 --- a/module/rnrs/arithmetic/fixnums.scm +++ b/module/rnrs/arithmetic/fixnums.scm @@ -1,6 +1,6 @@ ;;; fixnums.scm --- The R6RS fixnums arithmetic library -;; Copyright (C) 2010, 2011 Free Software Foundation, Inc. +;; Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc. ;; ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -227,7 +227,12 @@ (assert-fixnum fx1 fx2 fx3) (bitwise-if fx1 fx2 fx3)) - (define (fxbit-count fx) (assert-fixnum fx) (logcount fx)) + (define (fxbit-count fx) + (assert-fixnum fx) + (if (negative? fx) + (bitwise-not (logcount fx)) + (logcount fx))) + (define (fxlength fx) (assert-fixnum fx) (bitwise-length fx)) (define (fxfirst-bit-set fx) (assert-fixnum fx) (bitwise-first-bit-set fx)) (define (fxbit-set? fx1 fx2) (assert-fixnum fx1 fx2) (logbit? fx2 fx1)) diff --git a/test-suite/tests/r6rs-arithmetic-fixnums.test b/test-suite/tests/r6rs-arithmetic-fixnums.test index d39d5448b..01a7a89b2 100644 --- a/test-suite/tests/r6rs-arithmetic-fixnums.test +++ b/test-suite/tests/r6rs-arithmetic-fixnums.test @@ -1,6 +1,6 @@ ;;; arithmetic-fixnums.test --- Test suite for R6RS (rnrs arithmetic bitwise) -;; Copyright (C) 2010, 2011 Free Software Foundation, Inc. +;; Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc. ;; ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -157,7 +157,9 @@ (with-test-prefix "fxif" (pass-if "simple" (fx=? (fxif 5 3 4) 1))) -(with-test-prefix "fxbit-count" (pass-if "simple" (fx=? (fxbit-count 5) 2))) +(with-test-prefix "fxbit-count" + (pass-if "simple" (fx=? (fxbit-count 5) 2)) + (pass-if "negative" (fx=? (fxbit-count -5) -2))) (with-test-prefix "fxlength" (pass-if "simple" (fx=? (fxlength 5) 3))) -- 2.20.1