mirror of https://github.com/nodejs/node.git
81 lines
2.3 KiB
C
81 lines
2.3 KiB
C
#include <node_api.h>
|
|
#include <stdlib.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(node_api_basic_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;
|
|
}
|