diff options
Diffstat (limited to 'erts/emulator/beam/erl_term.h')
-rw-r--r-- | erts/emulator/beam/erl_term.h | 72 |
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; |