diff options
Diffstat (limited to 'erts/emulator/beam/beam_types.h')
-rw-r--r-- | erts/emulator/beam/beam_types.h | 58 |
1 files changed, 26 insertions, 32 deletions
diff --git a/erts/emulator/beam/beam_types.h b/erts/emulator/beam/beam_types.h index 000a644edb..fe215a1340 100644 --- a/erts/emulator/beam/beam_types.h +++ b/erts/emulator/beam/beam_types.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2021-2022. All Rights Reserved. + * Copyright Ericsson AB 2021-2023. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ #include "sys.h" -#define BEAM_TYPES_VERSION 1 +#define BEAM_TYPES_VERSION 2 #define BEAM_TYPE_NONE (0) @@ -57,45 +57,39 @@ #define BEAM_TYPE_ANY ((1 << 13) - 1) -#define BEAM_TYPE_MASK_BOXED \ - (BEAM_TYPE_BITSTRING | \ - BEAM_TYPE_BS_MATCHSTATE | \ - BEAM_TYPE_FLOAT | \ - BEAM_TYPE_FUN | \ - BEAM_TYPE_INTEGER | \ - BEAM_TYPE_MAP | \ - BEAM_TYPE_PID | \ - BEAM_TYPE_PORT | \ - BEAM_TYPE_REFERENCE | \ - BEAM_TYPE_TUPLE) - -#define BEAM_TYPE_MASK_IMMEDIATE \ - (BEAM_TYPE_ATOM | \ - BEAM_TYPE_INTEGER | \ - BEAM_TYPE_NIL | \ - BEAM_TYPE_PID | \ - BEAM_TYPE_PORT) - -#define BEAM_TYPE_MASK_CELL \ - (BEAM_TYPE_CONS) - -#define BEAM_TYPE_MASK_ALWAYS_IMMEDIATE \ - (BEAM_TYPE_MASK_IMMEDIATE & ~(BEAM_TYPE_MASK_BOXED | BEAM_TYPE_MASK_CELL)) -#define BEAM_TYPE_MASK_ALWAYS_BOXED \ - (BEAM_TYPE_MASK_BOXED & ~(BEAM_TYPE_MASK_CELL | BEAM_TYPE_MASK_IMMEDIATE)) -#define BEAM_TYPE_MASK_ALWAYS_CELL \ - (BEAM_TYPE_MASK_CELL & ~(BEAM_TYPE_MASK_BOXED | BEAM_TYPE_MASK_IMMEDIATE)) +/* This is not a part of the type union proper, but is present in the format + * to signal the presence of metadata. */ +#define BEAM_TYPE_HAS_LOWER_BOUND (1 << 13) +#define BEAM_TYPE_HAS_UPPER_BOUND (1 << 14) +#define BEAM_TYPE_HAS_UNIT (1 << 15) + +#define BEAM_TYPE_METADATA_MASK (BEAM_TYPE_HAS_LOWER_BOUND | \ + BEAM_TYPE_HAS_UPPER_BOUND | \ + BEAM_TYPE_HAS_UNIT) typedef struct { /** @brief A set of the possible types (atom, tuple, etc) this term may * be. When a single bit is set, the term will always be of that type. */ int type_union; - /** @brief Minimum and maximum values. Only valid if min <= max. */ + /** @brief A set of metadata presence flags, BEAM_TYPE_HAS_XYZ. */ + int metadata_flags; + + /** @brief Minimum numerical value. Only valid when the + * BEAM_TYPE_HAS_LOWER_BOUND metadata flag is present. */ Sint64 min; + + /** @brief Maximum numerical value. Only valid when the + * BEAM_TYPE_HAS_UPPER_BOUND metadata flag is present. */ Sint64 max; + + /** @brief Unit for bitstring size. Only valid when the BEAM_TYPE_HAS_UNIT + * metadata flag is present. */ + byte size_unit; } BeamType; -int beam_types_decode(const byte *data, Uint size, BeamType *out); +int beam_types_decode_type_otp_26(const byte *data, BeamType *out); +void beam_types_decode_extra_otp_26(const byte *data, BeamType *out); +int beam_types_decode_otp_25(const byte *data, Uint size, BeamType *out); #endif |