diff options
author | John Högberg <[email protected]> | 2019-03-08 14:41:44 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2019-03-08 14:41:44 +0100 |
commit | f39d734ed638a7e431993c05b143d2cc5bef1690 (patch) | |
tree | bbe15b39031de4bc88874294b5a789f37c1fb942 /erts/emulator/beam/erl_nif.c | |
parent | 9c019dfdf038768e5f7f4f2dadc0312421986f2c (diff) | |
parent | f951b3fcc69c195ce04ae1022fa53272cb74f71b (diff) | |
download | otp-f39d734ed638a7e431993c05b143d2cc5bef1690.tar.gz otp-f39d734ed638a7e431993c05b143d2cc5bef1690.tar.bz2 otp-f39d734ed638a7e431993c05b143d2cc5bef1690.zip |
Merge pull request #2175 from jhogberg/john/erts/enif_term_type/OTP-15640
erts: Add enif_term_type
Diffstat (limited to 'erts/emulator/beam/erl_nif.c')
-rw-r--r-- | erts/emulator/beam/erl_nif.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index 5a3cdf980d..af1acbfc90 100644 --- a/erts/emulator/beam/erl_nif.c +++ b/erts/emulator/beam/erl_nif.c @@ -1175,6 +1175,47 @@ int enif_is_number(ErlNifEnv* env, ERL_NIF_TERM term) return is_number(term); } +ErlNifTermType enif_term_type(ErlNifEnv* env, ERL_NIF_TERM term) { + (void)env; + + switch (tag_val_def(term)) { + case ATOM_DEF: + return ERL_NIF_TERM_TYPE_ATOM; + case BINARY_DEF: + return ERL_NIF_TERM_TYPE_BITSTRING; + case FLOAT_DEF: + return ERL_NIF_TERM_TYPE_FLOAT; + case EXPORT_DEF: + case FUN_DEF: + return ERL_NIF_TERM_TYPE_FUN; + case BIG_DEF: + case SMALL_DEF: + return ERL_NIF_TERM_TYPE_INTEGER; + case LIST_DEF: + case NIL_DEF: + return ERL_NIF_TERM_TYPE_LIST; + case MAP_DEF: + return ERL_NIF_TERM_TYPE_MAP; + case EXTERNAL_PID_DEF: + case PID_DEF: + return ERL_NIF_TERM_TYPE_PID; + case EXTERNAL_PORT_DEF: + case PORT_DEF: + return ERL_NIF_TERM_TYPE_PORT; + case EXTERNAL_REF_DEF: + case REF_DEF: + return ERL_NIF_TERM_TYPE_REFERENCE; + case TUPLE_DEF: + return ERL_NIF_TERM_TYPE_TUPLE; + default: + /* tag_val_def() aborts on its own when passed complete garbage, but + * it's possible that the user has given us garbage that just happens + * to match something that tag_val_def() accepts but we don't, like + * binary match contexts. */ + ERTS_INTERNAL_ERROR("Invalid term passed to enif_term_type"); + } +} + static void aligned_binary_dtor(struct enif_tmp_obj_t* obj) { erts_free_aligned_binary_bytes_extra((byte*)obj, obj->allocator); |