diff options
Diffstat (limited to 'benchmark/napi/ref/addon.c')
-rw-r--r-- | benchmark/napi/ref/addon.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/benchmark/napi/ref/addon.c b/benchmark/napi/ref/addon.c new file mode 100644 index 0000000000..3fb8de603d --- /dev/null +++ b/benchmark/napi/ref/addon.c @@ -0,0 +1,82 @@ +#include <stdlib.h> +#define NAPI_EXPERIMENTAL +#include <node_api.h> + +#define NAPI_CALL(env, call) \ + do { \ + napi_status status = (call); \ + if (status != napi_ok) { \ + napi_throw_error((env), NULL, #call " failed"); \ + return NULL; \ + } \ + } while (0) + +static napi_value +GetCount(napi_env env, napi_callback_info info) { + napi_value result; + size_t* count; + + NAPI_CALL(env, napi_get_instance_data(env, (void**)&count)); + NAPI_CALL(env, napi_create_uint32(env, *count, &result)); + + return result; +} + +static napi_value +SetCount(napi_env env, napi_callback_info info) { + size_t* count; + + NAPI_CALL(env, napi_get_instance_data(env, (void**)&count)); + + // Set the count to zero irrespective of what is passed into the setter. + *count = 0; + + return NULL; +} + +static void +IncrementCounter(napi_env env, void* data, void* hint) { + size_t* count = data; + (*count) = (*count) + 1; +} + +static napi_value +NewWeak(napi_env env, napi_callback_info info) { + napi_value result; + void* instance_data; + + NAPI_CALL(env, napi_create_object(env, &result)); + NAPI_CALL(env, napi_get_instance_data(env, &instance_data)); + NAPI_CALL(env, napi_add_finalizer(env, + result, + instance_data, + IncrementCounter, + NULL, + NULL)); + + return result; +} + +static void +FreeCount(napi_env env, void* data, void* hint) { + free(data); +} + +/* napi_value */ +NAPI_MODULE_INIT(/* napi_env env, napi_value exports */) { + napi_property_descriptor props[] = { + { "count", NULL, NULL, GetCount, SetCount, NULL, napi_enumerable, NULL }, + { "newWeak", NULL, NewWeak, NULL, NULL, NULL, napi_enumerable, NULL } + }; + + size_t* count = malloc(sizeof(*count)); + *count = 0; + + NAPI_CALL(env, napi_define_properties(env, + exports, + sizeof(props) / sizeof(*props), + props)); + NAPI_CALL(env, napi_set_instance_data(env, count, FreeCount, NULL)); + + return exports; +} |