1 #include <js_native_api.h>
2 #include <string.h>
3 #include "../common.h"
4 #include "../entry_point.h"
5
TestGetElement(napi_env env, napi_callback_info info)6 static napi_value TestGetElement(napi_env env, napi_callback_info info) {
7 size_t argc = 2;
8 napi_value args[2];
9 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
10
11 NODE_API_ASSERT(env, argc >= 2, "Wrong number of arguments");
12
13 napi_valuetype valuetype0;
14 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
15
16 NODE_API_ASSERT(env, valuetype0 == napi_object,
17 "Wrong type of arguments. Expects an array as first argument.");
18
19 napi_valuetype valuetype1;
20 NODE_API_CALL(env, napi_typeof(env, args[1], &valuetype1));
21
22 NODE_API_ASSERT(env, valuetype1 == napi_number,
23 "Wrong type of arguments. Expects an integer as second argument.");
24
25 napi_value array = args[0];
26 int32_t index;
27 NODE_API_CALL(env, napi_get_value_int32(env, args[1], &index));
28
29 NODE_API_ASSERT(env, index >= 0, "Invalid index. Expects a positive integer.");
30
31 bool isarray;
32 NODE_API_CALL(env, napi_is_array(env, array, &isarray));
33
34 if (!isarray) {
35 return NULL;
36 }
37
38 uint32_t length;
39 NODE_API_CALL(env, napi_get_array_length(env, array, &length));
40
41 NODE_API_ASSERT(env, ((uint32_t)index < length), "Index out of bounds!");
42
43 napi_value ret;
44 NODE_API_CALL(env, napi_get_element(env, array, index, &ret));
45
46 return ret;
47 }
48
TestHasElement(napi_env env, napi_callback_info info)49 static napi_value TestHasElement(napi_env env, napi_callback_info info) {
50 size_t argc = 2;
51 napi_value args[2];
52 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
53
54 NODE_API_ASSERT(env, argc >= 2, "Wrong number of arguments");
55
56 napi_valuetype valuetype0;
57 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
58
59 NODE_API_ASSERT(env, valuetype0 == napi_object,
60 "Wrong type of arguments. Expects an array as first argument.");
61
62 napi_valuetype valuetype1;
63 NODE_API_CALL(env, napi_typeof(env, args[1], &valuetype1));
64
65 NODE_API_ASSERT(env, valuetype1 == napi_number,
66 "Wrong type of arguments. Expects an integer as second argument.");
67
68 napi_value array = args[0];
69 int32_t index;
70 NODE_API_CALL(env, napi_get_value_int32(env, args[1], &index));
71
72 bool isarray;
73 NODE_API_CALL(env, napi_is_array(env, array, &isarray));
74
75 if (!isarray) {
76 return NULL;
77 }
78
79 bool has_element;
80 NODE_API_CALL(env, napi_has_element(env, array, index, &has_element));
81
82 napi_value ret;
83 NODE_API_CALL(env, napi_get_boolean(env, has_element, &ret));
84
85 return ret;
86 }
87
TestDeleteElement(napi_env env, napi_callback_info info)88 static napi_value TestDeleteElement(napi_env env, napi_callback_info info) {
89 size_t argc = 2;
90 napi_value args[2];
91
92 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
93 NODE_API_ASSERT(env, argc == 2, "Wrong number of arguments");
94
95 napi_valuetype valuetype0;
96 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
97 NODE_API_ASSERT(env, valuetype0 == napi_object,
98 "Wrong type of arguments. Expects an array as first argument.");
99
100 napi_valuetype valuetype1;
101 NODE_API_CALL(env, napi_typeof(env, args[1], &valuetype1));
102 NODE_API_ASSERT(env, valuetype1 == napi_number,
103 "Wrong type of arguments. Expects an integer as second argument.");
104
105 napi_value array = args[0];
106 int32_t index;
107 bool result;
108 napi_value ret;
109
110 NODE_API_CALL(env, napi_get_value_int32(env, args[1], &index));
111 NODE_API_CALL(env, napi_is_array(env, array, &result));
112
113 if (!result) {
114 return NULL;
115 }
116
117 NODE_API_CALL(env, napi_delete_element(env, array, index, &result));
118 NODE_API_CALL(env, napi_get_boolean(env, result, &ret));
119
120 return ret;
121 }
122
New(napi_env env, napi_callback_info info)123 static napi_value New(napi_env env, napi_callback_info info) {
124 size_t argc = 1;
125 napi_value args[1];
126 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
127
128 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
129
130 napi_valuetype valuetype0;
131 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
132
133 NODE_API_ASSERT(env, valuetype0 == napi_object,
134 "Wrong type of arguments. Expects an array as first argument.");
135
136 napi_value ret;
137 NODE_API_CALL(env, napi_create_array(env, &ret));
138
139 uint32_t i, length;
140 NODE_API_CALL(env, napi_get_array_length(env, args[0], &length));
141
142 for (i = 0; i < length; i++) {
143 napi_value e;
144 NODE_API_CALL(env, napi_get_element(env, args[0], i, &e));
145 NODE_API_CALL(env, napi_set_element(env, ret, i, e));
146 }
147
148 return ret;
149 }
150
NewWithLength(napi_env env, napi_callback_info info)151 static napi_value NewWithLength(napi_env env, napi_callback_info info) {
152 size_t argc = 1;
153 napi_value args[1];
154 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
155
156 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
157
158 napi_valuetype valuetype0;
159 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
160
161 NODE_API_ASSERT(env, valuetype0 == napi_number,
162 "Wrong type of arguments. Expects an integer the first argument.");
163
164 int32_t array_length;
165 NODE_API_CALL(env, napi_get_value_int32(env, args[0], &array_length));
166
167 napi_value ret;
168 NODE_API_CALL(env, napi_create_array_with_length(env, array_length, &ret));
169
170 return ret;
171 }
172
173 EXTERN_C_START
Init(napi_env env, napi_value exports)174 napi_value Init(napi_env env, napi_value exports) {
175 napi_property_descriptor descriptors[] = {
176 DECLARE_NODE_API_PROPERTY("TestGetElement", TestGetElement),
177 DECLARE_NODE_API_PROPERTY("TestHasElement", TestHasElement),
178 DECLARE_NODE_API_PROPERTY("TestDeleteElement", TestDeleteElement),
179 DECLARE_NODE_API_PROPERTY("New", New),
180 DECLARE_NODE_API_PROPERTY("NewWithLength", NewWithLength),
181 };
182
183 NODE_API_CALL(env, napi_define_properties(
184 env, exports, sizeof(descriptors) / sizeof(*descriptors), descriptors));
185
186 return exports;
187 }
188 EXTERN_C_END
189