diff options
author | Björn-Egil Dahlberg <[email protected]> | 2017-03-28 16:29:01 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2017-03-28 17:51:26 +0200 |
commit | d71498ac1bfa204138ec7d7ae9fb97d0ffe071b9 (patch) | |
tree | 0188c3d00b39d3fb5fb3eb21a6528f82b2a23fca /erts/emulator/beam/erl_term.h | |
parent | 1ec9366f468026a216c1c8cd78c7f512bae37ae5 (diff) | |
download | otp-d71498ac1bfa204138ec7d7ae9fb97d0ffe071b9.tar.gz otp-d71498ac1bfa204138ec7d7ae9fb97d0ffe071b9.tar.bz2 otp-d71498ac1bfa204138ec7d7ae9fb97d0ffe071b9.zip |
erts: Fix faulty assert for refs in copy sharing
Diffstat (limited to 'erts/emulator/beam/erl_term.h')
-rw-r--r-- | erts/emulator/beam/erl_term.h | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_term.h b/erts/emulator/beam/erl_term.h index a602a8f7c6..097d580d99 100644 --- a/erts/emulator/beam/erl_term.h +++ b/erts/emulator/beam/erl_term.h @@ -873,6 +873,12 @@ typedef union { ErtsORefThing o; } ErtsRefThing; +/* for copy sharing */ +#define BOXED_VISITED_MASK ((Eterm) 3) +#define BOXED_VISITED ((Eterm) 1) +#define BOXED_SHARED_UNPROCESSED ((Eterm) 2) +#define BOXED_SHARED_PROCESSED ((Eterm) 3) + #define ERTS_REF_THING_SIZE (sizeof(ErtsORefThing)/sizeof(Uint)) #define ERTS_MAGIC_REF_THING_SIZE (sizeof(ErtsMRefThing)/sizeof(Uint)) #define ERTS_MAX_INTERNAL_REF_SIZE (sizeof(ErtsRefThing)/sizeof(Uint)) @@ -888,9 +894,14 @@ typedef union { # define is_ref_thing_header(x) ((x) == ERTS_REF_THING_HEADER) -#define is_ordinary_ref_thing(x) \ - (ASSERT(is_ref_thing_header(*((Eterm *)(x)))), \ +#ifdef SHCOPY +#define is_ordinary_ref_thing(x) \ + (((ErtsRefThing *) (x))->o.marker == ERTS_ORDINARY_REF_MARKER) +#else +#define is_ordinary_ref_thing(x) \ + (ASSERT(is_ref_thing_header((*((Eterm *)(x))) & ~BOXED_VISITED_MASK)), \ ((ErtsRefThing *) (x))->o.marker == ERTS_ORDINARY_REF_MARKER) +#endif #define is_magic_ref_thing(x) \ (!is_ordinary_ref_thing((x))) |