summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/beam_types.h
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/beam_types.h')
-rw-r--r--erts/emulator/beam/beam_types.h58
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