• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <js_native_api.h>
2 
3 #include "../common.h"
4 #include "test_null.h"
5 
6 #define GEN_NULL_CHECK_BINDING(binding_name, output_type, api)            \
7   static napi_value binding_name(napi_env env, napi_callback_info info) { \
8     napi_value return_value;                                              \
9     output_type result;                                                   \
10     NAPI_CALL(env, napi_create_object(env, &return_value));               \
11     add_returned_status(env,                                              \
12                         "envIsNull",                                      \
13                         return_value,                                     \
14                         "Invalid argument",                               \
15                         napi_invalid_arg,                                 \
16                         api(NULL, return_value, &result));                \
17     api(env, NULL, &result);                                              \
18     add_last_status(env, "valueIsNull", return_value);                    \
19     api(env, return_value, NULL);                                         \
20     add_last_status(env, "resultIsNull", return_value);                   \
21     api(env, return_value, &result);                                      \
22     add_last_status(env, "inputTypeCheck", return_value);                 \
23     return return_value;                                                  \
24   }
25 
GEN_NULL_CHECK_BINDING(GetValueBool,bool,napi_get_value_bool)26 GEN_NULL_CHECK_BINDING(GetValueBool, bool, napi_get_value_bool)
27 GEN_NULL_CHECK_BINDING(GetValueInt32, int32_t, napi_get_value_int32)
28 GEN_NULL_CHECK_BINDING(GetValueUint32, uint32_t, napi_get_value_uint32)
29 GEN_NULL_CHECK_BINDING(GetValueInt64, int64_t, napi_get_value_int64)
30 GEN_NULL_CHECK_BINDING(GetValueDouble, double, napi_get_value_double)
31 GEN_NULL_CHECK_BINDING(CoerceToBool, napi_value, napi_coerce_to_bool)
32 GEN_NULL_CHECK_BINDING(CoerceToObject, napi_value, napi_coerce_to_object)
33 GEN_NULL_CHECK_BINDING(CoerceToString, napi_value, napi_coerce_to_string)
34 
35 #define GEN_NULL_CHECK_STRING_BINDING(binding_name, arg_type, api)         \
36   static napi_value binding_name(napi_env env, napi_callback_info info) {  \
37     napi_value return_value;                                               \
38     NAPI_CALL(env, napi_create_object(env, &return_value));                \
39     arg_type buf1[4];                                                      \
40     size_t length1 = 3;                                                    \
41     add_returned_status(env,                                               \
42                         "envIsNull",                                       \
43                         return_value,                                      \
44                         "Invalid argument",                                \
45                         napi_invalid_arg,                                  \
46                         api(NULL, return_value, buf1, length1, &length1)); \
47     arg_type buf2[4];                                                      \
48     size_t length2 = 3;                                                    \
49     api(env, NULL, buf2, length2, &length2);                               \
50     add_last_status(env, "valueIsNull", return_value);                     \
51     api(env, return_value, NULL, 3, NULL);                                 \
52     add_last_status(env, "wrongTypeIn", return_value);                     \
53     napi_value string;                                                     \
54     NAPI_CALL(env,                                                         \
55               napi_create_string_utf8(env,                                 \
56                                       "Something",                         \
57                                       NAPI_AUTO_LENGTH,                    \
58                                       &string));                           \
59     api(env, string, NULL, 3, NULL);                                       \
60     add_last_status(env, "bufAndOutLengthIsNull", return_value);           \
61     return return_value;                                                   \
62   }
63 
64 GEN_NULL_CHECK_STRING_BINDING(GetValueStringUtf8,
65                               char,
66                               napi_get_value_string_utf8)
67 GEN_NULL_CHECK_STRING_BINDING(GetValueStringLatin1,
68                               char,
69                               napi_get_value_string_latin1)
70 GEN_NULL_CHECK_STRING_BINDING(GetValueStringUtf16,
71                               char16_t,
72                               napi_get_value_string_utf16)
73 
74 void init_test_null(napi_env env, napi_value exports) {
75   napi_value test_null;
76 
77   const napi_property_descriptor test_null_props[] = {
78     DECLARE_NAPI_PROPERTY("getValueBool", GetValueBool),
79     DECLARE_NAPI_PROPERTY("getValueInt32", GetValueInt32),
80     DECLARE_NAPI_PROPERTY("getValueUint32", GetValueUint32),
81     DECLARE_NAPI_PROPERTY("getValueInt64", GetValueInt64),
82     DECLARE_NAPI_PROPERTY("getValueDouble", GetValueDouble),
83     DECLARE_NAPI_PROPERTY("coerceToBool", CoerceToBool),
84     DECLARE_NAPI_PROPERTY("coerceToObject", CoerceToObject),
85     DECLARE_NAPI_PROPERTY("coerceToString", CoerceToString),
86     DECLARE_NAPI_PROPERTY("getValueStringUtf8", GetValueStringUtf8),
87     DECLARE_NAPI_PROPERTY("getValueStringLatin1", GetValueStringLatin1),
88     DECLARE_NAPI_PROPERTY("getValueStringUtf16", GetValueStringUtf16),
89   };
90 
91   NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &test_null));
92   NAPI_CALL_RETURN_VOID(env, napi_define_properties(
93       env, test_null, sizeof(test_null_props) / sizeof(*test_null_props),
94       test_null_props));
95 
96   const napi_property_descriptor test_null_set = {
97     "testNull", NULL, NULL, NULL, NULL, test_null, napi_enumerable, NULL
98   };
99 
100   NAPI_CALL_RETURN_VOID(env,
101       napi_define_properties(env, exports, 1, &test_null_set));
102 }
103