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