From: Nuutti K. <na...@ik...> - 2004-08-31 02:18:45
|
I think I found a bug in IO.read_i32 implementation. The current implementation is (roughly): ,----[ IO.ml ] | let read_i32 ch = | let ch1 = read_byte ch in | let ch2 = read_byte ch in | let ch3 = read_byte ch in | let ch4 = read_byte ch in | if ch4 land 64 <> 0 then raise (Overflow "read_i32"); | if ch4 land 128 <> 0 then | ch1 lor ch2 lsl 8 lor ch3 lsl 16 lor ((ch4 land 63) lor 64) lsl 24 | else | ch1 lor ch2 lsl 8 lor ch3 lsl 16 lor ch4 lsl 24 `---- I believe it should be something like this: ,----[ IO.ml ] | let read_i32 ch = | let ch1 = read_byte ch in | let ch2 = read_byte ch in | let ch3 = read_byte ch in | let ch4 = read_byte ch in | if ch4 land 128 <> 0 then ( | if ch4 land 64 == 0 then raise (Overflow "read_i32"); | ch1 lor ch2 lsl 8 lor ch3 lsl 16 lor ((ch4 land 63) lor 64) lsl 24 | ) else ( | if ch4 land 64 <> 0 then raise (Overflow "read_i32"); | ch1 lor ch2 lsl 8 lor ch3 lsl 16 lor ch4 lsl 24 | ) `---- Otherwise it will give incorrect results for numbers that are over 1 gig negative and superflusly complain Overflow for numbers over half a gig negative (roughly, obviously). I didn't produce a patch, since the change is trivial and I am not savvy with the library coding style. I am not subscribed to the list, so I would appreciate CCing me in case any questions are raised. -- Naked |
From: Nicolas C. <war...@fr...> - 2004-08-31 08:12:50
|
> I think I found a bug in IO.read_i32 implementation. The current > implementation is (roughly): Thanks for the report, this is now fixed on CVS. Regards, Nicolas Cannasse |