Skip to content

Commit 9eab03a

Browse files
committed
Allow at most one empty string on binary:split/3
1 parent 73660f9 commit 9eab03a

2 files changed

Lines changed: 33 additions & 12 deletions

File tree

erts/emulator/beam/erl_bif_binary.c

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,6 +1843,7 @@ static Eterm do_split_global_result(Process *p, Eterm subject, BinaryFindContext
18431843
Uint extracted_offset;
18441844
Uint extracted_size;
18451845
Eterm extracted;
1846+
Eterm empty_extracted = THE_NON_VALUE;
18461847
Uint do_trim;
18471848
Sint i;
18481849
Uint offset, size;
@@ -1895,12 +1896,20 @@ static Eterm do_split_global_result(Process *p, Eterm subject, BinaryFindContext
18951896
extracted_size = NBITS(fa->end_pos - (fad[i].pos + fad[i].len));
18961897

18971898
if (!(extracted_size == 0 && do_trim)) {
1898-
extracted = erts_build_sub_bitstring(&fa->factory.hp,
1899-
br_flags,
1900-
br,
1901-
base,
1902-
extracted_offset,
1903-
extracted_size);
1899+
if (extracted_size == 0) {
1900+
if (empty_extracted == THE_NON_VALUE) {
1901+
empty_extracted = HEAP_BITSTRING(fa->factory.hp, base, 0, 0);
1902+
fa->factory.hp += heap_bits_size(0);
1903+
}
1904+
extracted = empty_extracted;
1905+
} else {
1906+
extracted = erts_build_sub_bitstring(&fa->factory.hp,
1907+
br_flags,
1908+
br,
1909+
base,
1910+
extracted_offset,
1911+
extracted_size);
1912+
}
19041913
fa->term = CONS(fa->factory.hp, extracted, fa->term);
19051914
fa->factory.hp += 2;
19061915

@@ -1917,12 +1926,20 @@ static Eterm do_split_global_result(Process *p, Eterm subject, BinaryFindContext
19171926
extracted_size = NBITS(fad[0].pos);
19181927

19191928
if (!(extracted_size == 0 && do_trim)) {
1920-
extracted = erts_build_sub_bitstring(&fa->factory.hp,
1921-
br_flags,
1922-
br,
1923-
base,
1924-
extracted_offset,
1925-
extracted_size);
1929+
if (extracted_size == 0) {
1930+
if (empty_extracted == THE_NON_VALUE) {
1931+
empty_extracted = HEAP_BITSTRING(fa->factory.hp, base, 0, 0);
1932+
fa->factory.hp += heap_bits_size(0);
1933+
}
1934+
extracted = empty_extracted;
1935+
} else {
1936+
extracted = erts_build_sub_bitstring(&fa->factory.hp,
1937+
br_flags,
1938+
br,
1939+
base,
1940+
extracted_offset,
1941+
extracted_size);
1942+
}
19261943
fa->term = CONS(fa->factory.hp, extracted, fa->term);
19271944
fa->factory.hp += 2;
19281945
}

lib/stdlib/test/binary_module_SUITE.erl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,10 @@ do_interesting(Module) ->
521521
[] = binary:split(<<>>, <<",">>, [global,trim]),
522522
[] = binary:split(<<>>, <<",">>, [global,trim_all]),
523523

524+
%% Assert empty binaries are shared
525+
[<<"a">>, <<>> = WS1, WS2, <<"b">>] = binary:split(<<"a,,,b">>, <<",">>, [global]),
526+
true = erts_debug:same(WS1, WS2),
527+
524528
ReplaceFn = fun(Match) -> << <<(B + 1)>> || <<B>> <= Match >> end,
525529
badarg = ?MASK_ERROR(
526530
Module:replace(<<1,2,3,4,5,6,7,8>>,

0 commit comments

Comments
 (0)