GCC Code Coverage Report


Directory: src/
File: src/btree/map.c
Date: 2023-03-02 23:19:03
Exec Total Coverage
Lines: 119 119 100.0%
Functions: 9 9 100.0%
Branches: 61 286 21.3%

Line Branch Exec Source
1 #include <core.h>
2 #include <foreach.h>
3 #include <interface.h>
4
5
6 /**
7 * Unref all bTree nodes for GC access.
8 */
9 static gboolean
10 6 removeTreeNode(gpointer key, gpointer val, gpointer data) {
11 6 BTree_t *bTree = (BTree_t *) data;
12
13 // Remove es value from native bTree
14 6 g_tree_remove(bTree->nativeTree, (BTreeNode) key);
15
16 6 return FALSE;
17 }
18
19
20 /**
21 * Native forEach() callback
22 */
23 static gboolean
24 24 nativeBTreeForEach(gpointer key, gpointer val, gpointer data) {
25 24 BTreeNode node = (BTreeNode) val;
26 24 ForEachContext_t *ctxt = (ForEachContext_t *) data;
27 24 napi_env env = ctxt->bTree->env;
28 napi_value esObject, esKey, esValue, esIdx, esNull;
29
30
1/6
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
24 NAPI_CALL(env, false,
31 napi_get_reference_value(env, node->esKeyValue, &esObject));
32
33
1/6
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
24 NAPI_CALL(env, false,
34 napi_get_named_property(env, esObject, KEY, &esKey));
35
36
1/6
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
24 NAPI_CALL(env, false,
37 napi_get_named_property(env, esObject, VALUE, &esValue));
38
39
1/6
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
24 NAPI_CALL(env, false,
40 napi_create_int64(env, ctxt->idx, &esIdx));
41
42 96 napi_value argv[] = {
43 24 esValue,
44 24 esKey,
45 24 esIdx
46 };
47
48
1/6
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
24 NAPI_CALL(env, false,
49 napi_get_null(env, &esNull));
50
51
1/6
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
24 NAPI_CALL(env, false,
52 napi_call_function(env, ctxt->cbThis, ctxt->callback, (sizeof(argv) / sizeof(napi_value)), argv, NULL));
53
54 24 ctxt->idx++;
55
56 24 return FALSE;
57 }
58
59
60 /**
61 * ES callback. Return value from bTree by key
62 */
63 napi_value
64 18 esGet(napi_env env, napi_callback_info cbInfo) {
65 napi_value esThis;
66 napi_value result;
67 BTree_t *bTree;
68 18 size_t argc = 1;
69 napi_value argv[1];
70
71 // Get es this
72
1/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 NAPI_CALL(env, false,
73 napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL));
74
75 // If key arg not passed. Set it to undefined
76
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
18 if (argc < 1) {
77
1/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2 NAPI_CALL(env, false,
78 napi_get_undefined(env, &argv[0]));
79 2 }
80
81 // Extract native BTree pointer
82
1/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 NAPI_CALL(env, false,
83 napi_unwrap(env, esThis, (void **) &bTree));
84
85 18 napi_value key = argv[0];
86 napi_value lookupBox;
87 napi_ref lookupRef;
88
89
1/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 NAPI_CALL(env, false,
90 napi_create_object(env, &lookupBox));
91
92
1/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 NAPI_CALL(env, false,
93 napi_set_named_property(env, lookupBox, KEY, key));
94
95
1/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 NAPI_CALL(env, false,
96 napi_create_reference(env, lookupBox, 0, &lookupRef));
97
98 36 BTreeNode_t lookupNode = {
99 18 lookupRef,
100 NULL
101 };
102
103 // Native call to glib tree
104 18 BTreeNode lookupResult =
105 18 (BTreeNode) g_tree_lookup(bTree->nativeTree, &lookupNode);
106
107
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 1 times.
18 if (lookupResult == NULL) {
108
1/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1 NAPI_CALL(env, false,
109 napi_get_undefined(env, &result));
110 1 }
111 else {
112
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
17 NAPI_CALL(env, false,
113 napi_get_reference_value(env, lookupResult->esKeyValue, &result));
114
115
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
17 NAPI_CALL(env, false,
116 napi_get_named_property(env, result, VALUE, &result));
117 }
118
119 18 return result;
120 }
121
122 /**
123 * ES callback. Delete node from bTree by key
124 */
125 napi_value
126 5 esDelete(napi_env env, napi_callback_info cbInfo) {
127 napi_value esThis, result, searchBox;
128 napi_ref searchBoxRef;
129 BTree_t *bTree;
130
131 5 size_t argc = 1;
132 napi_value arg;
133
134 // Get es this
135
1/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 NAPI_CALL(env, false,
136 napi_get_cb_info(env, cbInfo, &argc, &arg, &esThis, NULL));
137
138 // If key arg not passed. Set it to undefined
139
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 if (argc < 1) {
140 1 arg = getEsUndef(env);
141 1 }
142
143 // Extract native BTree pointer
144
1/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 NAPI_CALL(env, false,
145 napi_unwrap(env, esThis, (void **) &bTree));
146
147 // Create es search box object for comparing with stored in bTree boxes
148
1/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 NAPI_CALL(env, false,
149 napi_create_object(env, &searchBox));
150
151
1/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 NAPI_CALL(env, false,
152 napi_set_named_property(env, searchBox, KEY, arg));
153
154
1/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 NAPI_CALL(env, false,
155 napi_create_reference(env, searchBox, 0, &searchBoxRef));
156
157 10 BTreeNode_t searchNode = {
158 5 searchBoxRef,
159 NULL
160 };
161
162 5 gboolean found = g_tree_remove(bTree->nativeTree, &searchNode);
163
164
1/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 NAPI_CALL(env, false,
165 napi_get_boolean(env, found, &result));
166
167 5 return result;
168 }
169
170 /**
171 * ES callback. Add element to bTree.
172 */
173 napi_value
174 429 esSet(napi_env env, napi_callback_info cbInfo) {
175 napi_value esThis;
176 429 size_t argc = 2,
177 429 expectedArgc = argc;
178 napi_value argv[2], key, value, box;
179
180 // Get es this
181
1/6
✓ Branch 0 taken 429 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
429 NAPI_CALL(env, false,
182 napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL));
183
184 // Set to undefined all (key, value) missing arguments.
185
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 429 times.
434 for (size_t i = argc; i < expectedArgc; i++) {
186
1/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 NAPI_CALL(env, false,
187 napi_get_undefined(env, &argv[i]));
188 5 }
189
190 429 key = argv[0];
191 429 value = argv[1];
192
193 // Create box es object
194
1/6
✓ Branch 0 taken 429 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
429 NAPI_CALL(env, false,
195 napi_create_object(env, &box));
196
197 // Set key & value to box
198
1/6
✓ Branch 0 taken 429 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
429 NAPI_CALL(env, false,
199 napi_set_named_property(env, box, KEY, key));
200
1/6
✓ Branch 0 taken 429 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
429 NAPI_CALL(env, false,
201 napi_set_named_property(env, box, VALUE, value));
202
203 429 nativeInsertNode(env, esThis, box);
204
205 429 return esThis;
206 }
207
208 /**
209 * ES callback. Return bTree size (nodes count).
210 */
211 napi_value
212 41 esSize(napi_env env, napi_callback_info cbInfo) {
213 napi_value esSize;
214 napi_value esThis;
215 BTree_t *bTree;
216
217 // Get es this
218
1/6
✓ Branch 0 taken 41 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
41 NAPI_CALL(env, false,
219 napi_get_cb_info(env, cbInfo, NULL, NULL, &esThis, NULL));
220
221 // Extract native BTree pointer
222
1/6
✓ Branch 0 taken 41 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
41 NAPI_CALL(env, false,
223 napi_unwrap(env, esThis, (void **) &bTree));
224
225 // Native call to glib tree
226 41 gint nativeSize = g_tree_nnodes(bTree->nativeTree);
227
228 // Convert from C type to es type
229
1/6
✓ Branch 0 taken 41 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
41 NAPI_CALL(env, false,
230 napi_create_int64(env, (int64_t) nativeSize, &esSize));
231
232 41 return esSize;
233 }
234
235 /**
236 * ES callback. Delete all nodes from bTree
237 */
238 napi_value
239 2 esClear(napi_env env, napi_callback_info cbInfo) {
240 napi_value esThis;
241 BTree_t *bTree;
242
243
1/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2 NAPI_CALL(env, false,
244 napi_get_cb_info(env, cbInfo, NULL, NULL, &esThis, NULL));
245
246 // Extract native BTree pointer
247
1/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2 NAPI_CALL(env, false,
248 napi_unwrap(env, esThis, (void **) &bTree));
249
250 2 g_tree_foreach(bTree->nativeTree, removeTreeNode, bTree);
251
252 napi_value result;
253
1/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2 NAPI_CALL(env, false,
254 napi_get_undefined(env, &result));
255
256 2 return result;
257 }
258
259 /**
260 * ES callback. Check key in bTree.
261 */
262 napi_value
263 4 esHas(napi_env env, napi_callback_info cbInfo) {
264 napi_value esThis;
265 napi_ref boxRef;
266 BTree_t *bTree;
267 4 size_t argc = 1;
268 napi_value argv[1];
269
270 napi_value box;
271
272 // Get es this
273
1/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4 NAPI_CALL(env, false,
274 napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL));
275
276 // If key arg not passed. Set it to undefined
277
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 if (argc < 1) {
278
1/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2 NAPI_CALL(env, false, napi_get_undefined(env, &argv[0]));
279 2 }
280
281 // Extract native BTree pointer
282
1/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4 NAPI_CALL(env, false,
283 napi_unwrap(env, esThis, (void **) &bTree));
284
285
1/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4 NAPI_CALL(env, false,
286 napi_create_object(env, &box));
287
288
1/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4 NAPI_CALL(env, false,
289 napi_set_named_property(env, box, KEY, argv[0]));
290
291
1/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4 NAPI_CALL(env, false,
292 napi_create_reference(env, box, 0, &boxRef));
293
294 8 BTreeNode_t searchNode = {
295 4 boxRef,
296 NULL
297 };
298
299 4 gpointer found = g_tree_lookup(bTree->nativeTree, &searchNode);
300
301 napi_value result;
302
303
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 if (found == NULL) {
304
1/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1 NAPI_CALL(env, false,
305 napi_get_boolean(env, false, &result));
306 1 }
307 else {
308
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
3 NAPI_CALL(env, false,
309 napi_get_boolean(env, true, &result));
310 }
311
312 4 return result;
313 }
314
315 /**
316 * ES callback. es forEach() method
317 */
318 napi_value
319 9 esForeach(napi_env env, napi_callback_info cbInfo) {
320 napi_value esThis, undefined, callback, cbThis, argv[2];
321 BTree_t *bTree;
322 9 size_t argc = 2;
323
324
325 // Get es this for current btree
326
1/6
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9 NAPI_CALL(env, false,
327 napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL));
328
329
3/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
9 CHECK_ARGC(1, msgTooFewArguments);
330 8 callback = argv[0];
331
332
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
8 if (argc > 1) {
333 2 cbThis = argv[1];
334 2 }
335 else {
336
1/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6 NAPI_CALL(env, true,
337 napi_get_global(env, &cbThis));
338 }
339
340 // Extract native BTree pointer
341
1/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
8 NAPI_CALL(env, false,
342 napi_unwrap(env, esThis, (void **) &bTree));
343
344 40 ForEachContext_t ctxt = {
345 8 esThis,
346 8 callback,
347 8 cbThis,
348 0,
349 8 bTree,
350 NULL
351 };
352
353 8 g_tree_foreach(bTree->nativeTree, nativeBTreeForEach, &ctxt);
354
355
1/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
8 NAPI_CALL(env, false,
356 napi_get_undefined(env, &undefined));
357
358 8 return undefined;
359 9 }
360