diff options
Diffstat (limited to 'erts/emulator/test/nif_SUITE_data/nif_SUITE.c')
-rw-r--r-- | erts/emulator/test/nif_SUITE_data/nif_SUITE.c | 131 |
1 files changed, 115 insertions, 16 deletions
diff --git a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c index 7a47c2ea99..5ae97e529d 100644 --- a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c +++ b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2009-2021. All Rights Reserved. + * Copyright Ericsson AB 2009-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. @@ -91,6 +91,8 @@ static ERL_NIF_TERM atom_port; static ERL_NIF_TERM atom_send; static ERL_NIF_TERM atom_lookup; static ERL_NIF_TERM atom_badarg; +static ERL_NIF_TERM atom_latin1; +static ERL_NIF_TERM atom_utf8; typedef struct { @@ -280,6 +282,8 @@ static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) atom_send = enif_make_atom(env, "send"); atom_lookup = enif_make_atom(env, "lookup"); atom_badarg = enif_make_atom(env, "badarg"); + atom_latin1 = enif_make_atom(env, "latin1"); + atom_utf8 = enif_make_atom(env, "utf8"); *priv_data = data; return 0; @@ -784,28 +788,63 @@ static ERL_NIF_TERM string_to_bin(ErlNifEnv* env, int argc, const ERL_NIF_TERM a { ErlNifBinary obin; unsigned size; + int encoding; int n; - if (!enif_get_int(env,argv[1],(int*)&size) - || !enif_alloc_binary(size,&obin)) { - return enif_make_badarg(env); + if (!enif_get_int(env, argv[2], &encoding) + || !enif_get_int(env, argv[1], (int *)&size) + || !enif_alloc_binary(size, &obin)) { + return enif_make_badarg(env); + } + n = enif_get_string(env, argv[0], (char *)obin.data, size, + (ErlNifCharEncoding) encoding); + return enif_make_tuple(env, 2, enif_make_int(env, n), + enif_make_binary(env, &obin)); +} + +static ERL_NIF_TERM string_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ + unsigned size; + int encoding; + + if (!enif_get_int(env, argv[1], &encoding)) { + return enif_make_badarg(env); } - n = enif_get_string(env, argv[0], (char*)obin.data, size, ERL_NIF_LATIN1); - return enif_make_tuple(env, 2, enif_make_int(env,n), - enif_make_binary(env,&obin)); + if (!enif_get_string_length(env, argv[0], &size, + (ErlNifCharEncoding)encoding)) { + return atom_false; + } + return enif_make_uint(env, size); } static ERL_NIF_TERM atom_to_bin(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary obin; unsigned size; + int encoding; int n; - if (!enif_get_int(env,argv[1],(int*)&size) - || !enif_alloc_binary(size,&obin)) { - return enif_make_badarg(env); + if (!enif_get_int(env, argv[2], &encoding) + || !enif_get_int(env, argv[1], (int *)&size) + || !enif_alloc_binary(size,&obin)) { + return enif_make_badarg(env); } - n = enif_get_atom(env, argv[0], (char*)obin.data, size, ERL_NIF_LATIN1); - return enif_make_tuple(env, 2, enif_make_int(env,n), - enif_make_binary(env,&obin)); + n = enif_get_atom(env, argv[0], (char *)obin.data, size, + (ErlNifCharEncoding)encoding); + return enif_make_tuple(env, 2, enif_make_int(env, n), + enif_make_binary(env, &obin)); +} + +static ERL_NIF_TERM atom_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ + unsigned size; + int encoding; + + if (!enif_get_int(env, argv[1], &encoding)) + return enif_make_badarg(env); + if (!enif_get_atom_length(env, argv[0], &size, + (ErlNifCharEncoding)encoding)) { + return atom_false; + } + return enif_make_uint(env, size); } static ERL_NIF_TERM macros(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -893,6 +932,27 @@ static ERL_NIF_TERM get_resource_type(ErlNifEnv* env, int argc, const ERL_NIF_TE return make_pointer(env, data->rt_arr[ix].vp); } +static ERL_NIF_TERM init_resource_type(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ + char name[20]; + int flags; + ErlNifResourceTypeInit init; + ErlNifResourceType* ret_ptr; + ErlNifResourceFlags tried; + + if (0 >= enif_get_string(env, argv[0], name, sizeof(name), ERL_NIF_UTF8) || + !enif_get_int(env, argv[1], &flags)) { + return enif_make_badarg(env); + } + /* Should fail as we are not in load/upgrade callback */ + init.members = 0; + ret_ptr = enif_init_resource_type(env, name, &init, + (ErlNifResourceFlags)flags, &tried); + + return enif_make_tuple2(env, enif_make_uint64(env, (ErlNifUInt64)ret_ptr), + enif_make_int(env, (int)tried)); +} + static ERL_NIF_TERM alloc_resource(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary data_bin; @@ -1143,6 +1203,41 @@ static ERL_NIF_TERM make_atoms(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6]); } +static ERL_NIF_TERM make_new_atom(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + ErlNifBinary name_bin; + int encoding; + ERL_NIF_TERM atom_term; + int ret; + + if (!enif_get_int(env, argv[1], &encoding) + || !enif_inspect_binary(env, argv[0], &name_bin)) { + return enif_make_badarg(env); + } + if (!enif_make_new_atom_len(env, (void *)name_bin.data, name_bin.size, &atom_term, + (ErlNifCharEncoding)encoding)) { + return enif_make_int(env, 0); + } + return atom_term; +} + +static ERL_NIF_TERM make_existing_atom(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + ErlNifBinary name_bin; + int encoding; + ERL_NIF_TERM atom_term; + + if (!enif_get_int(env, argv[1], &encoding) + || !enif_inspect_binary(env, argv[0], &name_bin)) { + return enif_make_badarg(env); + } + if (!enif_make_existing_atom_len(env, (void *)name_bin.data, name_bin.size, &atom_term, + (ErlNifCharEncoding)encoding)) { + return enif_make_int(env,0); + } + return atom_term; +} + static ERL_NIF_TERM make_strings(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { const char a0string[8] = {'a','0','s','t','r','i','n','g'}; @@ -3716,12 +3811,15 @@ static ErlNifFunc nif_funcs[] = {"many_args_100", 100, many_args_100}, {"clone_bin", 1, clone_bin}, {"make_sub_bin", 3, make_sub_bin}, - {"string_to_bin", 2, string_to_bin}, - {"atom_to_bin", 2, atom_to_bin}, + {"string_to_bin", 3, string_to_bin}, + {"string_length", 2, string_length}, + {"atom_to_bin", 3, atom_to_bin}, + {"atom_length", 2, atom_length}, {"macros", 1, macros}, {"tuple_2_list_and_tuple",1,tuple_2_list_and_tuple}, {"iolist_2_bin", 1, iolist_2_bin}, {"get_resource_type", 1, get_resource_type}, + {"init_resource_type", 2, init_resource_type}, {"alloc_resource", 2, alloc_resource}, {"make_resource", 1, make_resource}, {"get_resource", 2, get_resource}, @@ -3732,6 +3830,8 @@ static ErlNifFunc nif_funcs[] = {"check_is_exception", 0, check_is_exception}, {"length_test", 6, length_test}, {"make_atoms", 0, make_atoms}, + {"make_new_atom", 2, make_new_atom}, + {"make_existing_atom", 2, make_existing_atom}, {"make_strings", 0, make_strings}, {"make_new_resource", 2, make_new_resource}, {"make_new_resource_binary", 1, make_new_resource_binary}, @@ -3812,7 +3912,6 @@ static ErlNifFunc nif_funcs[] = {"compare_pids_nif", 2, compare_pids_nif}, {"term_type_nif", 1, term_type_nif}, {"msa_find_y_nif", 1, msa_find_y_nif} - }; ERL_NIF_INIT(nif_SUITE,nif_funcs,load,NULL,upgrade,unload) |