Discussion:
bug#32644: bytevector bug
Stefan Israelsson Tampe
2018-09-05 17:53:02 UTC
Permalink
Hi,

The code velow does not compile when the define-inlinable of id is active.
If in stead
id defined by define is used it all compiles just fine.

Tested on latest tar ball for guile 2.4
-------------------------------------------
(use-modules (rnrs bytevectors))

(define-inlinable (id x) x)
;(define (id x) x)
(define-syntax-rule (mkcrc crc_hqx high xor mask)
(define (crc_hqx data value)
(let ((n (bytevector-length data))
(d data))
(let lp ((i 0) (v value))
(if (< i n)
(let ((b (id (bytevector-u8-ref d i))))
(let lp2 ((j 0) (x 1) (v v))
(if (> j -8)
(let ((bit (ash (logand x b) j))
(hbit (logand v high)))
(if (= hbit 0)
(lp2 (- j 1) (ash x 1) (logior bit (ash v 1)))
(lp2 (- j 1) (ash x 1) (logxor
xor
(logand mask
(logior
bit
(ash v 1)))))))
(lp (+ i 1) v))))
v)))))

(mkcrc crc_hqx #x8000 #x1021 #xffff)
(mkcrc crc32 #x80000000 #x04c11db7 #xffffffff)
Mark H Weaver
2018-09-06 17:27:11 UTC
Permalink
The code velow does not compile when the define-inlinable of id is active. If in stead
id defined by define is used it all compiles just fine.
Tested on latest tar ball for guile 2.4
Did you mean to write guile 2.2.4?

Mark
-------------------------------------------
(use-modules (rnrs bytevectors))
(define-inlinable (id x) x)
;(define (id x) x)
(define-syntax-rule (mkcrc crc_hqx high xor mask)
(define (crc_hqx data value)
(let ((n (bytevector-length data))
(d data))
(let lp ((i 0) (v value))
(if (< i n)
(let ((b (id (bytevector-u8-ref d i))))
(let lp2 ((j 0) (x 1) (v v))
(if (> j -8)
(let ((bit (ash (logand x b) j))
(hbit (logand v high)))
(if (= hbit 0)
(lp2 (- j 1) (ash x 1) (logior bit (ash v 1)))
(lp2 (- j 1) (ash x 1) (logxor
xor
(logand mask
(logior
bit
(ash v 1)))))))
(lp (+ i 1) v))))
v)))))
(mkcrc crc_hqx #x8000 #x1021 #xffff)
(mkcrc crc32 #x80000000 #x04c11db7 #xffffffff)
Stefan Israelsson Tampe
2018-09-14 18:44:35 UTC
Permalink
I managed to get it to compile on the latest lightning branch as of
2018-09-14
Post by Stefan Israelsson Tampe
The code velow does not compile when the define-inlinable of id is
active. If in stead
Post by Stefan Israelsson Tampe
id defined by define is used it all compiles just fine.
Tested on latest tar ball for guile 2.4
Did you mean to write guile 2.2.4?
Mark
Post by Stefan Israelsson Tampe
-------------------------------------------
(use-modules (rnrs bytevectors))
(define-inlinable (id x) x)
;(define (id x) x)
(define-syntax-rule (mkcrc crc_hqx high xor mask)
(define (crc_hqx data value)
(let ((n (bytevector-length data))
(d data))
(let lp ((i 0) (v value))
(if (< i n)
(let ((b (id (bytevector-u8-ref d i))))
(let lp2 ((j 0) (x 1) (v v))
(if (> j -8)
(let ((bit (ash (logand x b) j))
(hbit (logand v high)))
(if (= hbit 0)
(lp2 (- j 1) (ash x 1) (logior bit (ash v 1)))
(lp2 (- j 1) (ash x 1) (logxor
xor
(logand mask
(logior
bit
(ash v 1)))))))
(lp (+ i 1) v))))
v)))))
(mkcrc crc_hqx #x8000 #x1021 #xffff)
(mkcrc crc32 #x80000000 #x04c11db7 #xffffffff)
Mark H Weaver
2018-10-14 07:38:11 UTC
Permalink
The code velow does not compile when the define-inlinable of id is active. If in stead
id defined by define is used it all compiles just fine.
The problem was that, in some cases, the type inferrer would call 'ash'
with (- 1 (expt 2 64)) as the second argument during compilation. The
implementation of 'ash' would raise an exception unless its second
argument (the shift count) fits in a C 'long'.

This is fixed in commit 011aec7e240ef987931548d90c53e6692c85d01c on the
stable-2.2 branch. That commit extends 'ash' and 'round-ash' to
gracefully handle several cases where the shift count is too large to
fit in a 'long'.

Thanks for the report.

Mark

Loading...