diff options
author | Michał Muskała <[email protected]> | 2018-05-09 19:41:24 +0200 |
---|---|---|
committer | Michał Muskała <[email protected]> | 2018-07-17 13:58:27 +0200 |
commit | f31db22102bde44c6ee17bc756bdeb109855acea (patch) | |
tree | 3342059d448e5d6af69b96b2bd2d0eaf84ffc755 /erts/emulator/beam/erl_init.c | |
parent | 9ae2044073e6433030ce30756658b103ce67c3c1 (diff) | |
download | otp-f31db22102bde44c6ee17bc756bdeb109855acea.tar.gz otp-f31db22102bde44c6ee17bc756bdeb109855acea.tar.bz2 otp-f31db22102bde44c6ee17bc756bdeb109855acea.zip |
Optimise creation of anonymous functions
This introduces a similar optimisation for normal funs
to what was introduced for external funs in #1725.
It is possible to allocate the fun as a literal, if it does not capture
the environment (i.e. it does not close over any variables).
Unfortunately it's not possible to do this in the compiler due to
problems with representation of such functions in the `.beam` files.
Fortunately, we can do this in the loader.
Simple evaluation shows that functions that don't capture the
enviornment consistute over 60% of all funs in the source code of
Erlang/OTP itself.
The only downside is that we lose a meningful value in the `pid` field
of the fun. The goal of this field, beyond debugging, was to be
able to identify the original node of a function. To be able to still do
this, the functions that are created in the loader are assigned the init
pid as the creator.
To solve issues with staryp, initially set the `erts_init_process_id`
to `ERTS_INVALID_PID` and skip the described optimisation if the value
is still uninitialised.
Diffstat (limited to 'erts/emulator/beam/erl_init.c')
-rw-r--r-- | erts/emulator/beam/erl_init.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index 57c6c10c7f..5da7b43b9e 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -128,7 +128,7 @@ const Eterm etp_hole_marker = 0; static int modified_sched_thread_suggested_stack_size = 0; -Eterm erts_init_process_id; +Eterm erts_init_process_id = ERTS_INVALID_PID; /* * Note about VxWorks: All variables must be initialized by executable code, @@ -2258,6 +2258,7 @@ erl_start(int argc, char **argv) erts_init_process_id = erl_first_process_otp("otp_ring0", NULL, 0, boot_argc, boot_argv); + ASSERT(erts_init_process_id != ERTS_INVALID_PID); { /* |