diff options
author | Björn Gustavsson <[email protected]> | 2018-12-06 13:07:42 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-12-18 11:40:07 +0100 |
commit | 1ea57e5498d92b730644cb37b659d16e51f56b4d (patch) | |
tree | 3464aa1912825e297d0609abe0af8b3eeb1af315 /erts/emulator/beam/erl_init.c | |
parent | 472b0669788e155f28851999b4e60bf8302ca2d5 (diff) | |
download | otp-1ea57e5498d92b730644cb37b659d16e51f56b4d.tar.gz otp-1ea57e5498d92b730644cb37b659d16e51f56b4d.tar.bz2 otp-1ea57e5498d92b730644cb37b659d16e51f56b4d.zip |
Make length/1 yielding
The guard BIF `length/1` would calculate the length of the list in one
go without yielding, even if the list was were long. To make it even
worse, the call to `length/1` would only cost a single reduction.
This commit reimplements `length/1` so that it eats a number of
reductions proportional to the length of the list, and yields if the
available reductions run out.
Diffstat (limited to 'erts/emulator/beam/erl_init.c')
-rw-r--r-- | erts/emulator/beam/erl_init.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index 08c9125840..2b19d2cfd3 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -353,6 +353,7 @@ erl_init(int ncpu, erts_init_bif(); erts_init_bif_chksum(); erts_init_bif_binary(); + erts_init_bif_guard(); erts_init_bif_persistent_term(); erts_init_bif_re(); erts_init_unicode(); /* after RE to get access to PCRE unicode */ |