diff options
author | Lukas Larsson <[email protected]> | 2019-01-18 09:17:57 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2019-01-18 09:17:57 +0100 |
commit | 2a95d46dd626b0acc57e79b596d00dea01f8270a (patch) | |
tree | 489ecb6cfe69394e521aab9732cadcc6a0f7db67 /erts/emulator/beam | |
parent | 0e11bf631d5705f6d9f2889959e8ef4a17b79e97 (diff) | |
parent | 5b93b30de9a7aa356f2a394bc3592a43b02adec5 (diff) | |
download | otp-2a95d46dd626b0acc57e79b596d00dea01f8270a.tar.gz otp-2a95d46dd626b0acc57e79b596d00dea01f8270a.tar.bz2 otp-2a95d46dd626b0acc57e79b596d00dea01f8270a.zip |
Merge pull request #2055 from josevalim/jv-no-bin-alloc-on-empty-append/OTP-15535
Do not allocate new bitstring/binary on empty append
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/erl_bits.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c index e82c776e70..f5807d25d7 100644 --- a/erts/emulator/beam/erl_bits.c +++ b/erts/emulator/beam/erl_bits.c @@ -1331,6 +1331,14 @@ erts_bs_append(Process* c_p, Eterm* reg, Uint live, Eterm build_size_term, } } + if (build_size_in_bits == 0) { + if (c_p->stop - c_p->htop < extra_words) { + (void) erts_garbage_collect(c_p, extra_words, reg, live+1); + bin = reg[live]; + } + return bin; + } + if((ERTS_UINT_MAX - build_size_in_bits) < erts_bin_offset) { c_p->freason = SYSTEM_LIMIT; return THE_NON_VALUE; @@ -1388,13 +1396,13 @@ erts_bs_append(Process* c_p, Eterm* reg, Uint live, Eterm build_size_term, Uint bitsize; Eterm* hp; - /* + /* * Allocate heap space. */ heap_need = PROC_BIN_SIZE + ERL_SUB_BIN_SIZE + extra_words; if (c_p->stop - c_p->htop < heap_need) { (void) erts_garbage_collect(c_p, heap_need, reg, live+1); - bin = reg[live]; + bin = reg[live]; } hp = c_p->htop; @@ -1412,6 +1420,10 @@ erts_bs_append(Process* c_p, Eterm* reg, Uint live, Eterm build_size_term, } } + if (build_size_in_bits == 0) { + return bin; + } + if((ERTS_UINT_MAX - build_size_in_bits) < erts_bin_offset) { c_p->freason = SYSTEM_LIMIT; return THE_NON_VALUE; |