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