* be known at runtime) but we may be able to directly access
* the bytes in the string.
*)
- | P.Int, Some 8, Some field_byte_offset, _, _ ->
+ | P.Int, Some 8, Some field_byte_offset, _, signed ->
let extract_fn = int_extract_const 8 endian signed in
(* The fast-path code when everything is aligned. *)
<:expr<
if $lid:len$ >= 8 then (
let v =
- if $lid:off_aligned$ then
+ if not $`bool:signed$ && $lid:off_aligned$ then
$fastpath$
else
$extract_fn$ $lid:data$ $lid:off$ $lid:len$ 8 in
| 16 ->
<:expr< Bitstring.$lid:name$ $lid:data$ o >>
| 32 ->
- <:expr<
- (* must allocate a new zero each time *)
- let zero = Bitstring.int32_of_int 0 in
- Bitstring.$lid:name$ $lid:data$ o zero
- >>
+ <:expr< Bitstring.$lid:name$ $lid:data$ o >>
| 64 ->
- <:expr<
- (* must allocate a new zero each time *)
- let zero = Int64.of_int 0 in
- Bitstring.$lid:name$ $lid:data$ o zero
- >>
+ <:expr< Bitstring.$lid:name$ $lid:data$ o >>
| _ -> assert false in
<:expr<
(* Starting offset within the string. *)