diff --git a/lib/srfi/142/bit.c b/lib/srfi/142/bit.c index 3dae9eab..bb5c67b1 100644 --- a/lib/srfi/142/bit.c +++ b/lib/srfi/142/bit.c @@ -164,17 +164,17 @@ sexp sexp_bit_xor (sexp ctx, sexp self, sexp_sint_t n, sexp x, sexp y) { #if SEXP_USE_BIGNUMS } else if (sexp_bignump(x)) { sexp_gc_preserve2(ctx, res, tmp); - if (sexp_fixnump(y)) { + if (sexp_fixnump(y) && sexp_unbox_fixnum(y) >= 0) { res = sexp_copy_bignum(ctx, NULL, x, 0); if (sexp_bignum_sign(res) < 0) sexp_set_twos_complement(res); sexp_bignum_data(res)[0] ^= sexp_unbox_fixnum(y); if (sexp_bignum_sign(res) < 0) sexp_set_twos_complement(res); - } else if (sexp_bignump(y)) { - if (sexp_bignum_length(x) >= sexp_bignum_length(y)) { + } else if (sexp_bignump(y) || sexp_fixnump(y)) { + if (sexp_fixnump(y) || sexp_bignum_length(x) >= sexp_bignum_length(y)) { res = sexp_copy_bignum(ctx, NULL, x, 0); - tmp = sexp_twos_complement(ctx, y); + tmp = sexp_fixnump(y) ? sexp_fixnum_to_twos_complement(ctx, y, sexp_bignum_length(x)) : sexp_twos_complement(ctx, y); len = sexp_bignum_length(tmp); } else { res = sexp_copy_bignum(ctx, NULL, y, 0); @@ -186,10 +186,9 @@ sexp sexp_bit_xor (sexp ctx, sexp self, sexp_sint_t n, sexp x, sexp y) { for (i=0; i