summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_term.h
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/erl_term.h')
-rw-r--r--erts/emulator/beam/erl_term.h72
1 files changed, 28 insertions, 44 deletions
diff --git a/erts/emulator/beam/erl_term.h b/erts/emulator/beam/erl_term.h
index 490fe1f1d1..5ec1d885e1 100644
--- a/erts/emulator/beam/erl_term.h
+++ b/erts/emulator/beam/erl_term.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. 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.
@@ -129,7 +129,6 @@ struct erl_node_; /* Declared in erl_node_tables.h */
#define REF_SUBTAG (0x4 << _TAG_PRIMARY_SIZE) /* REF */
#define FUN_SUBTAG (0x5 << _TAG_PRIMARY_SIZE) /* FUN */
#define FLOAT_SUBTAG (0x6 << _TAG_PRIMARY_SIZE) /* FLOAT */
-#define EXPORT_SUBTAG (0x7 << _TAG_PRIMARY_SIZE) /* FLOAT */
#define _BINARY_XXX_MASK (0x3 << _TAG_PRIMARY_SIZE)
#define REFC_BINARY_SUBTAG (0x8 << _TAG_PRIMARY_SIZE) /* BINARY */
#define HEAP_BINARY_SUBTAG (0x9 << _TAG_PRIMARY_SIZE) /* BINARY */
@@ -146,7 +145,6 @@ struct erl_node_; /* Declared in erl_node_tables.h */
#define _TAG_HEADER_POS_BIG (TAG_PRIMARY_HEADER|POS_BIG_SUBTAG)
#define _TAG_HEADER_NEG_BIG (TAG_PRIMARY_HEADER|NEG_BIG_SUBTAG)
#define _TAG_HEADER_FLOAT (TAG_PRIMARY_HEADER|FLOAT_SUBTAG)
-#define _TAG_HEADER_EXPORT (TAG_PRIMARY_HEADER|EXPORT_SUBTAG)
#define _TAG_HEADER_REF (TAG_PRIMARY_HEADER|REF_SUBTAG)
#define _TAG_HEADER_REFC_BIN (TAG_PRIMARY_HEADER|REFC_BINARY_SUBTAG)
#define _TAG_HEADER_HEAP_BIN (TAG_PRIMARY_HEADER|HEAP_BINARY_SUBTAG)
@@ -313,8 +311,21 @@ _ET_DECLARE_CHECKED(Uint,header_arity,Eterm)
#define MAX_ARITYVAL ((((Uint)1) << 24) - 1)
#define ERTS_MAX_TUPLE_SIZE MAX_ARITYVAL
+/*
+ Due to an optimization that assumes that the word after the arity
+ word is allocated, one should generally not create tuples of arity
+ zero. One should instead use the literal that can be obtained by
+ calling erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE).
+
+ If one really wants to create a zero arityval one should use
+ make_arityval_zero() or make_arityval_unchecked(sz)
+ */
+#define make_arityval_zero() (_make_header(0,_TAG_HEADER_ARITYVAL))
#define make_arityval(sz) (ASSERT((sz) <= MAX_ARITYVAL), \
+ ASSERT((sz) > 0), \
_make_header((sz),_TAG_HEADER_ARITYVAL))
+#define make_arityval_unchecked(sz) (ASSERT((sz) <= MAX_ARITYVAL), \
+ _make_header((sz),_TAG_HEADER_ARITYVAL))
#define is_arity_value(x) (((x) & _TAG_HEADER_MASK) == _TAG_HEADER_ARITYVAL)
#define is_sane_arity_value(x) ((((x) & _TAG_HEADER_MASK) == _TAG_HEADER_ARITYVAL) && \
(((x) >> _HEADER_ARITY_OFFS) <= MAX_ARITYVAL))
@@ -374,30 +385,16 @@ _ET_DECLARE_CHECKED(Eterm*,binary_val,Wterm)
/* process binaries stuff (special case of binaries) */
#define HEADER_PROC_BIN _make_header(PROC_BIN_SIZE-1,_TAG_HEADER_REFC_BIN)
-/* fun & export objects */
-#define is_any_fun(x) (is_fun((x)) || is_export((x)))
-#define is_not_any_fun(x) (!is_any_fun((x)))
-
/* fun objects */
-#define HEADER_FUN _make_header(ERL_FUN_SIZE-2,_TAG_HEADER_FUN)
-#define is_fun_header(x) ((x) == HEADER_FUN)
-#define make_fun(x) make_boxed((Eterm*)(x))
-#define is_fun(x) (is_boxed((x)) && is_fun_header(*boxed_val((x))))
-#define is_not_fun(x) (!is_fun((x)))
+#define HEADER_FUN _make_header(ERL_FUN_SIZE-2,_TAG_HEADER_FUN)
+#define is_fun_header(x) ((x) == HEADER_FUN)
+#define make_fun(x) make_boxed((Eterm*)(x))
+#define is_any_fun(x) (is_boxed((x)) && is_fun_header(*boxed_val((x))))
+#define is_not_any_fun(x) (!is_any_fun((x)))
#define _unchecked_fun_val(x) _unchecked_boxed_val((x))
_ET_DECLARE_CHECKED(Eterm*,fun_val,Wterm)
#define fun_val(x) _ET_APPLY(fun_val,(x))
-/* export access methods */
-#define make_export(x) make_boxed((x))
-#define is_export(x) (is_boxed((x)) && is_export_header(*boxed_val((x))))
-#define is_not_export(x) (!is_export((x)))
-#define _unchecked_export_val(x) _unchecked_boxed_val(x)
-_ET_DECLARE_CHECKED(Eterm*,export_val,Wterm)
-#define export_val(x) _ET_APPLY(export_val,(x))
-#define is_export_header(x) ((x) == HEADER_EXPORT)
-#define HEADER_EXPORT _make_header(1,_TAG_HEADER_EXPORT)
-
/* bignum access methods */
#define make_pos_bignum_header(sz) _make_header((sz),_TAG_HEADER_POS_BIG)
#define make_neg_bignum_header(sz) _make_header((sz),_TAG_HEADER_NEG_BIG)
@@ -477,15 +474,18 @@ typedef union float_def
#define is_tuple(x) (is_boxed((x)) && is_arity_value(*boxed_val((x))))
#define is_not_tuple(x) (!is_tuple((x)))
#define is_tuple_arity(x, a) \
- (is_boxed((x)) && *boxed_val((x)) == make_arityval((a)))
+ (is_boxed((x)) && *boxed_val((x)) == make_arityval_unchecked((a)))
#define is_not_tuple_arity(x, a) (!is_tuple_arity((x),(a)))
#define _unchecked_tuple_val(x) _unchecked_boxed_val(x)
_ET_DECLARE_CHECKED(Eterm*,tuple_val,Wterm)
#define tuple_val(x) _ET_APPLY(tuple_val,(x))
-#define TUPLE0(t) \
- ((t)[0] = make_arityval(0), \
- make_tuple(t))
+/*
+ Due to an optimization that assumes that the word after the arity
+ word is allocated, one should generally not create tuples of arity
+ zero on heaps. One should instead use the literal that can be
+ obtained by calling erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE).
+ */
#define TUPLE1(t,e1) \
((t)[0] = make_arityval(1), \
(t)[1] = (e1), \
@@ -1291,22 +1291,8 @@ _ET_DECLARE_CHECKED(struct erl_node_*,external_ref_node,Eterm)
(hp)[MAP_HEADER_FLATMAP_SZ+1] = v2, \
(hp)[MAP_HEADER_FLATMAP_SZ+2] = v3, \
make_flatmap(hp))
-#define MAP4(hp, k1, v1, k2, v2, k3, v3, k4, v4) \
- (MAP_HEADER(hp, 4, TUPLE4(hp+4+MAP_HEADER_FLATMAP_SZ, k1, k2, k3, k4)), \
- (hp)[MAP_HEADER_FLATMAP_SZ+0] = v1, \
- (hp)[MAP_HEADER_FLATMAP_SZ+1] = v2, \
- (hp)[MAP_HEADER_FLATMAP_SZ+2] = v3, \
- (hp)[MAP_HEADER_FLATMAP_SZ+3] = v4, \
- make_flatmap(hp))
-#define MAP5(hp, k1, v1, k2, v2, k3, v3, k4, v4, k5, v5) \
- (MAP_HEADER(hp, 5, TUPLE5(hp+5+MAP_HEADER_FLATMAP_SZ, k1, k2, k3, k4, k5)), \
- (hp)[MAP_HEADER_FLATMAP_SZ+0] = v1, \
- (hp)[MAP_HEADER_FLATMAP_SZ+1] = v2, \
- (hp)[MAP_HEADER_FLATMAP_SZ+2] = v3, \
- (hp)[MAP_HEADER_FLATMAP_SZ+3] = v4, \
- (hp)[MAP_HEADER_FLATMAP_SZ+4] = v5, \
- make_flatmap(hp))
-
+/* MAP4 and greater have to be created with erts_map_from_ks_and_vs as in the
+ debug emulator maps > 3 are hashmaps. */
/* number tests */
@@ -1402,7 +1388,6 @@ _ET_DECLARE_CHECKED(Uint,loader_y_reg_index,Uint)
#define EXTERNAL_PID_DEF 0x6
#define PORT_DEF 0x7
#define EXTERNAL_PORT_DEF 0x8
-#define EXPORT_DEF 0x9
#define FUN_DEF 0xa
#define REF_DEF 0xb
#define EXTERNAL_REF_DEF 0xc
@@ -1472,7 +1457,6 @@ ERTS_GLB_INLINE unsigned tag_val_def(Wterm x)
case (_TAG_HEADER_NEG_BIG >> _TAG_PRIMARY_SIZE): return BIG_DEF;
case (_TAG_HEADER_REF >> _TAG_PRIMARY_SIZE): return REF_DEF;
case (_TAG_HEADER_FLOAT >> _TAG_PRIMARY_SIZE): return FLOAT_DEF;
- case (_TAG_HEADER_EXPORT >> _TAG_PRIMARY_SIZE): return EXPORT_DEF;
case (_TAG_HEADER_FUN >> _TAG_PRIMARY_SIZE): return FUN_DEF;
case (_TAG_HEADER_EXTERNAL_PID >> _TAG_PRIMARY_SIZE): return EXTERNAL_PID_DEF;
case (_TAG_HEADER_EXTERNAL_PORT >> _TAG_PRIMARY_SIZE): return EXTERNAL_PORT_DEF;