Skip to content

Commit 7f62921

Browse files
committed
Support OTP-28 uncompressed literals
Handle new OTP-28 uncompressed literals when running on OTP 28 and later, continues to support zlib compression for literals with earlier OTP versions. Adds OTP-28 to the workflow test matrix. Closes #30 Signed-off-by: Winford <[email protected]>
1 parent 2daea6d commit 7f62921

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

.github/workflows/build-and-test.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: "ubuntu-24.04"
1414
strategy:
1515
matrix:
16-
otp: ["25", "26", "27"]
16+
otp: ["25", "26", "27", "28"]
1717

1818
steps:
1919
# Setup

src/packbeam_api.erl

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ filter_modules(Modules, ParsedFiles) ->
586586
%% @private
587587
parse_file(beam, _ModuleName, Data, IncludeLines) ->
588588
{ok, Module, Chunks} = beam_lib:all_chunks(Data),
589-
{UncompressedChunks, UncompressedLiterals} = uncompress_literals(Chunks),
589+
{UncompressedChunks, UncompressedLiterals} = maybe_uncompress_literals(Chunks),
590590
FilteredChunks = filter_chunks(UncompressedChunks, IncludeLines),
591591
{ok, Binary} = beam_lib:build_module(FilteredChunks),
592592
{ok, {Module, ChunkRefs}} = beam_lib:chunks(Data, [imports, exports, atoms]),
@@ -707,21 +707,41 @@ strip_padding(Data) ->
707707
Data.
708708

709709
%% @private
710-
uncompress_literals(Chunks) ->
710+
maybe_uncompress_literals(Chunks) ->
711711
case proplists:get_value("LitT", Chunks) of
712712
undefined ->
713713
{Chunks, undefined};
714714
<<_Header:4/binary, Data/binary>> ->
715-
UncompressedData = zlib:uncompress(Data),
716-
{
717-
lists:keyreplace(
718-
"LitT",
719-
1,
720-
Chunks,
721-
{"LitU", UncompressedData}
722-
),
723-
UncompressedData
724-
}
715+
case literals_need_uncompress() of
716+
true ->
717+
do_uncompress_literals(Chunks);
718+
false ->
719+
{Chunks, Data}
720+
end
721+
end.
722+
723+
%% @private
724+
do_uncompress_literals(Chunks) ->
725+
<<_Header:4/binary, Data/binary>> = proplists:get_value("LitT", Chunks),
726+
UncompressedData = zlib:uncompress(Data),
727+
{
728+
lists:keyreplace(
729+
"LitT",
730+
1,
731+
Chunks,
732+
{"LitU", UncompressedData}
733+
),
734+
UncompressedData
735+
}.
736+
737+
%% @private
738+
literals_need_uncompress() ->
739+
Rel = erlang:system_info(otp_release),
740+
case list_to_integer(Rel) of
741+
Version when Version >= 28 ->
742+
false;
743+
_ ->
744+
true
725745
end.
726746

727747
%% @private

0 commit comments

Comments
 (0)