diff options
author | Björn-Egil Dahlberg <[email protected]> | 2012-10-25 17:35:41 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2012-11-27 17:40:37 +0100 |
commit | e05a6c89abedfdff8ea16c645bd2b659c829cbfe (patch) | |
tree | debba1aeee7e9a9299892616ea93b31aed978d43 | |
parent | bb915519aa16f6410b19c6f868805b47717f11fa (diff) | |
download | otp-e05a6c89abedfdff8ea16c645bd2b659c829cbfe.tar.gz otp-e05a6c89abedfdff8ea16c645bd2b659c829cbfe.tar.bz2 otp-e05a6c89abedfdff8ea16c645bd2b659c829cbfe.zip |
erts: Define max tuple size to 24 bits
Erlang specification 4.7.3 defines max tuple size to 65535 elements
It is now defined to 16777215 elements (24 bits)
-rw-r--r-- | erts/emulator/beam/erl_term.c | 2 | ||||
-rw-r--r-- | erts/emulator/beam/erl_term.h | 9 |
2 files changed, 10 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_term.c b/erts/emulator/beam/erl_term.c index bf7774f882..8a78a66b74 100644 --- a/erts/emulator/beam/erl_term.c +++ b/erts/emulator/beam/erl_term.c @@ -133,7 +133,7 @@ ET_DEFINE_CHECKED(Uint,unsigned_val,Eterm,is_small); ET_DEFINE_CHECKED(Sint,signed_val,Eterm,is_small); ET_DEFINE_CHECKED(Uint,atom_val,Eterm,is_atom); ET_DEFINE_CHECKED(Uint,header_arity,Eterm,is_header); -ET_DEFINE_CHECKED(Uint,arityval,Eterm,is_arity_value); +ET_DEFINE_CHECKED(Uint,arityval,Eterm,is_sane_arity_value); ET_DEFINE_CHECKED(Uint,thing_arityval,Eterm,is_thing); ET_DEFINE_CHECKED(Uint,thing_subtag,Eterm,is_thing); ET_DEFINE_CHECKED(Eterm*,binary_val,Wterm,is_binary); diff --git a/erts/emulator/beam/erl_term.h b/erts/emulator/beam/erl_term.h index c270d13365..df064fb73d 100644 --- a/erts/emulator/beam/erl_term.h +++ b/erts/emulator/beam/erl_term.h @@ -300,8 +300,17 @@ _ET_DECLARE_CHECKED(Uint,header_arity,Eterm) #define header_arity(x) _ET_APPLY(header_arity,(x)) /* arityval access methods */ +/* Erlang Spec. 4.7.3 defines max arity to 65535 + * we will however enforce max arity of 16777215 (24 bits) + * (checked in bifs and asserted in debug) + */ +#define MAX_ARITYVAL ((((Uint)1) << 24) - 1) +#define ERTS_MAX_TUPLE_SIZE MAX_ARITYVAL + #define make_arityval(sz) _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)) #define is_not_arity_value(x) (!is_arity_value((x))) #define _unchecked_arityval(x) _unchecked_header_arity((x)) _ET_DECLARE_CHECKED(Uint,arityval,Eterm) |