diff options
author | Rickard Green <[email protected]> | 2015-08-26 19:47:10 +0200 |
---|---|---|
committer | Rickard Green <[email protected]> | 2015-11-12 15:25:47 +0100 |
commit | b21b604137c5cb5f5039a40994e429871e5b707b (patch) | |
tree | 9dacd474126fd82c022c5fb7881c3c9b685324ef /erts/emulator/beam/erl_term.c | |
parent | 7858ca939f8bf2db918396616fee13364d150a1e (diff) | |
download | otp-b21b604137c5cb5f5039a40994e429871e5b707b.tar.gz otp-b21b604137c5cb5f5039a40994e429871e5b707b.tar.bz2 otp-b21b604137c5cb5f5039a40994e429871e5b707b.zip |
Introduce literal tag
Diffstat (limited to 'erts/emulator/beam/erl_term.c')
-rw-r--r-- | erts/emulator/beam/erl_term.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_term.c b/erts/emulator/beam/erl_term.c index 3a5fbcc284..8efbb8c554 100644 --- a/erts/emulator/beam/erl_term.c +++ b/erts/emulator/beam/erl_term.c @@ -28,6 +28,37 @@ #include <stdlib.h> #include <stdio.h> +void +erts_set_literal_tag(Eterm *term, Eterm *hp_start, Eterm hsz) +{ +#ifdef TAG_LITERAL_PTR + Eterm *hp_end, *hp; + + hp_end = hp_start + hsz; + hp = hp_start; + + while (hp < hp_end) { + switch (primary_tag(*hp)) { + case TAG_PRIMARY_BOXED: + case TAG_PRIMARY_LIST: + *hp |= TAG_LITERAL_PTR; + break; + case TAG_PRIMARY_HEADER: + if (header_is_thing(*hp)) { + hp += thing_arityval(*hp); + } + break; + default: + break; + } + + hp++; + } + if (is_boxed(*term) || is_list(*term)) + *term |= TAG_LITERAL_PTR; +#endif +} + __decl_noreturn static void __noreturn et_abort(const char *expr, const char *file, unsigned line) { |