xref: /third_party/node/benchmark/napi/ref/addon.c (revision 1cb0ef41)
1#include <stdlib.h>
2#define NAPI_EXPERIMENTAL
3#include <node_api.h>
4
5#define NAPI_CALL(env, call)                          \
6  do {                                                \
7    napi_status status = (call);                      \
8    if (status != napi_ok) {                          \
9      napi_throw_error((env), NULL, #call " failed"); \
10      return NULL;                                    \
11    }                                                 \
12  } while (0)
13
14static napi_value
15GetCount(napi_env env, napi_callback_info info) {
16  napi_value result;
17  size_t* count;
18
19  NAPI_CALL(env, napi_get_instance_data(env, (void**)&count));
20  NAPI_CALL(env, napi_create_uint32(env, *count, &result));
21
22  return result;
23}
24
25static napi_value
26SetCount(napi_env env, napi_callback_info info) {
27  size_t* count;
28
29  NAPI_CALL(env, napi_get_instance_data(env, (void**)&count));
30
31  // Set the count to zero irrespective of what is passed into the setter.
32  *count = 0;
33
34  return NULL;
35}
36
37static void
38IncrementCounter(napi_env env, void* data, void* hint) {
39  size_t* count = data;
40  (*count) = (*count) + 1;
41}
42
43static napi_value
44NewWeak(napi_env env, napi_callback_info info) {
45  napi_value result;
46  void* instance_data;
47
48  NAPI_CALL(env, napi_create_object(env, &result));
49  NAPI_CALL(env, napi_get_instance_data(env, &instance_data));
50  NAPI_CALL(env, napi_add_finalizer(env,
51                                    result,
52                                    instance_data,
53                                    IncrementCounter,
54                                    NULL,
55                                    NULL));
56
57  return result;
58}
59
60static void
61FreeCount(napi_env env, void* data, void* hint) {
62  free(data);
63}
64
65/* napi_value */
66NAPI_MODULE_INIT(/* napi_env env, napi_value exports */) {
67  napi_property_descriptor props[] = {
68    { "count", NULL, NULL, GetCount, SetCount, NULL, napi_enumerable, NULL },
69    { "newWeak", NULL, NewWeak, NULL, NULL, NULL, napi_enumerable, NULL }
70  };
71
72  size_t* count = malloc(sizeof(*count));
73  *count = 0;
74
75  NAPI_CALL(env, napi_define_properties(env,
76                                        exports,
77                                        sizeof(props) / sizeof(*props),
78                                        props));
79  NAPI_CALL(env, napi_set_instance_data(env, count, FreeCount, NULL));
80
81  return exports;
82}
83