1 #include "myobject.h"
2 #include "../common.h"
3
4 size_t finalize_count = 0;
5
MyObject()6 MyObject::MyObject() : env_(nullptr), wrapper_(nullptr) {}
7
~MyObject()8 MyObject::~MyObject() {
9 finalize_count++;
10 napi_delete_reference(env_, wrapper_);
11 }
12
Destructor( napi_env env, void* nativeObject, void* )13 void MyObject::Destructor(
14 napi_env env, void* nativeObject, void* /*finalize_hint*/) {
15 MyObject* obj = static_cast<MyObject*>(nativeObject);
16 delete obj;
17 }
18
19 napi_ref MyObject::constructor;
20
Init(napi_env env)21 napi_status MyObject::Init(napi_env env) {
22 napi_status status;
23
24 napi_value cons;
25 status = napi_define_class(
26 env, "MyObject", -1, New, nullptr, 0, nullptr, &cons);
27 if (status != napi_ok) return status;
28
29 status = napi_create_reference(env, cons, 1, &constructor);
30 if (status != napi_ok) return status;
31
32 return napi_ok;
33 }
34
New(napi_env env, napi_callback_info info)35 napi_value MyObject::New(napi_env env, napi_callback_info info) {
36 size_t argc = 1;
37 napi_value args[1];
38 napi_value _this;
39 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, &_this, nullptr));
40
41 MyObject* obj = new MyObject();
42
43 napi_valuetype valuetype;
44 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype));
45
46 if (valuetype == napi_undefined) {
47 obj->val_ = 0;
48 } else {
49 NODE_API_CALL(env, napi_get_value_double(env, args[0], &obj->val_));
50 }
51
52 obj->env_ = env;
53
54 // The below call to napi_wrap() must request a reference to the wrapped
55 // object via the out-parameter, because this ensures that we test the code
56 // path that deals with a reference that is destroyed from its own finalizer.
57 NODE_API_CALL(env,
58 napi_wrap(env, _this, obj, MyObject::Destructor,
59 nullptr /* finalize_hint */, &obj->wrapper_));
60
61 return _this;
62 }
63
NewInstance(napi_env env, napi_value arg, napi_value* instance)64 napi_status MyObject::NewInstance(napi_env env,
65 napi_value arg,
66 napi_value* instance) {
67 napi_status status;
68
69 const int argc = 1;
70 napi_value argv[argc] = {arg};
71
72 napi_value cons;
73 status = napi_get_reference_value(env, constructor, &cons);
74 if (status != napi_ok) return status;
75
76 status = napi_new_instance(env, cons, argc, argv, instance);
77 if (status != napi_ok) return status;
78
79 return napi_ok;
80 }
81