1#include <js_native_api.h>
2#include <string.h>
3#include "../common.h"
4#include "../entry_point.h"
5
6static 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
49static 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
88static 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
123static 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
151static 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
173EXTERN_C_START
174napi_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}
188EXTERN_C_END
189