1 #include <js_native_api.h>
2 
3 #include "../common.h"
4 
5 // Unifies the way the macros declare values.
6 typedef double double_t;
7 
8 #define BINDING_FOR_CREATE(initial_capital, lowercase)                         \
9   static napi_value Create##initial_capital(napi_env env,                      \
10                                             napi_callback_info info) {         \
11     napi_value return_value, call_result;                                      \
12     lowercase##_t value = 42;                                                  \
13     NODE_API_CALL(env, napi_create_object(env, &return_value));                \
14     add_returned_status(env,                                                   \
15                         "envIsNull",                                           \
16                         return_value,                                          \
17                         "Invalid argument",                                    \
18                         napi_invalid_arg,                                      \
19                         napi_create_##lowercase(NULL, value, &call_result));   \
20     napi_create_##lowercase(env, value, NULL);                                 \
21     add_last_status(env, "resultIsNull", return_value);                        \
22     return return_value;                                                       \
23   }
24 
25 #define BINDING_FOR_GET_VALUE(initial_capital, lowercase)                      \
26   static napi_value GetValue##initial_capital(napi_env env,                    \
27                                               napi_callback_info info) {       \
28     napi_value return_value, call_result;                                      \
29     lowercase##_t value = 42;                                                  \
30     NODE_API_CALL(env, napi_create_object(env, &return_value));                \
31     NODE_API_CALL(env, napi_create_##lowercase(env, value, &call_result));     \
32     add_returned_status(                                                       \
33         env,                                                                   \
34         "envIsNull",                                                           \
35         return_value,                                                          \
36         "Invalid argument",                                                    \
37         napi_invalid_arg,                                                      \
38         napi_get_value_##lowercase(NULL, call_result, &value));                \
39     napi_get_value_##lowercase(env, NULL, &value);                             \
40     add_last_status(env, "valueIsNull", return_value);                         \
41     napi_get_value_##lowercase(env, call_result, NULL);                        \
42     add_last_status(env, "resultIsNull", return_value);                        \
43     return return_value;                                                       \
44   }
45 
46 BINDING_FOR_CREATE(Double, double)
BINDING_FOR_CREATEnull47 BINDING_FOR_CREATE(Int32, int32)
48 BINDING_FOR_CREATE(Uint32, uint32)
49 BINDING_FOR_CREATE(Int64, int64)
50 BINDING_FOR_GET_VALUE(Double, double)
51 BINDING_FOR_GET_VALUE(Int32, int32)
52 BINDING_FOR_GET_VALUE(Uint32, uint32)
53 BINDING_FOR_GET_VALUE(Int64, int64)
54 
55 void init_test_null(napi_env env, napi_value exports) {
56   const napi_property_descriptor test_null_props[] = {
57       DECLARE_NODE_API_PROPERTY("createDouble", CreateDouble),
58       DECLARE_NODE_API_PROPERTY("createInt32", CreateInt32),
59       DECLARE_NODE_API_PROPERTY("createUint32", CreateUint32),
60       DECLARE_NODE_API_PROPERTY("createInt64", CreateInt64),
61       DECLARE_NODE_API_PROPERTY("getValueDouble", GetValueDouble),
62       DECLARE_NODE_API_PROPERTY("getValueInt32", GetValueInt32),
63       DECLARE_NODE_API_PROPERTY("getValueUint32", GetValueUint32),
64       DECLARE_NODE_API_PROPERTY("getValueInt64", GetValueInt64),
65   };
66   napi_value test_null;
67 
68   NODE_API_CALL_RETURN_VOID(env, napi_create_object(env, &test_null));
69   NODE_API_CALL_RETURN_VOID(
70       env,
71       napi_define_properties(env,
72                              test_null,
73                              sizeof(test_null_props) / sizeof(*test_null_props),
74                              test_null_props));
75   NODE_API_CALL_RETURN_VOID(
76       env, napi_set_named_property(env, exports, "testNull", test_null));
77 }
78