Skip to content

Commit 8233587

Browse files
committed
Correctly print non-byte aligned bit arrays
1 parent aa07fd9 commit 8233587

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/gleam_stdlib.erl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,8 @@ inspect(Binary) when is_binary(Binary) ->
390390
Segments = [erlang:integer_to_list(X) || <<X>> <= Binary],
391391
["<<", lists:join(", ", Segments), ">>"]
392392
end;
393+
inspect(Bits) when is_bitstring(Bits) ->
394+
inspect_bit_array(Bits);
393395
inspect(List) when is_list(List) ->
394396
case inspect_list(List) of
395397
{proper, Elements} -> ["[", Elements, "]"];
@@ -457,6 +459,28 @@ inspect_list([First | Rest]) when is_list(Rest) ->
457459
inspect_list([First | ImproperTail]) ->
458460
{improper, [inspect(First), <<" | ">>, inspect(ImproperTail)]}.
459461

462+
inspect_bit_array(Bits) ->
463+
Text = inspect_bit_array(Bits, <<"<<">>),
464+
<<Text/binary, ">>">>.
465+
466+
inspect_bit_array(<<>>, Acc) ->
467+
Acc;
468+
inspect_bit_array(<<X, Rest/bitstring>>, Acc) ->
469+
inspect_bit_array(Rest, append_segment(Acc, erlang:integer_to_binary(X)));
470+
inspect_bit_array(Rest, Acc) ->
471+
Size = bit_size(Rest),
472+
<<X:Size>> = Rest,
473+
X1 = erlang:integer_to_binary(X),
474+
Size1 = erlang:integer_to_binary(Size),
475+
Segment = <<X1/binary, ":size(", Size1/binary, ")">>,
476+
inspect_bit_array(<<>>, append_segment(Acc, Segment)).
477+
478+
append_segment(<<"<<">>, Segment) ->
479+
<<"<<", Segment/binary>>;
480+
append_segment(Acc, Segment) ->
481+
<<Acc/binary, ", ", Segment/binary>>.
482+
483+
460484
inspect_maybe_utf8_string(Binary, Acc) ->
461485
case Binary of
462486
<<>> -> {ok, <<$", Acc/binary, $">>};

test/gleam/string_test.gleam

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,13 @@ pub fn inspect_erlang_atom_with_leading_digit_invalid_in_gleam_test() {
10661066
|> should.equal("atom.create_from_string(\"1Ok\")")
10671067
}
10681068

1069+
@target(erlang)
1070+
pub fn fifteen_bit_int_test() {
1071+
<<2, 3:size(7)>>
1072+
|> string.inspect
1073+
|> should.equal("<<2, 3:size(7)>>")
1074+
}
1075+
10691076
pub fn byte_size_test() {
10701077
let assert 0 = string.byte_size("")
10711078
let assert 1 = string.byte_size("a")

0 commit comments

Comments
 (0)