GCC Code Coverage Report


Directory: src/
File: src/btree/static.c
Date: 2023-03-02 23:19:03
Exec Total Coverage
Lines: 72 72 100.0%
Functions: 4 4 100.0%
Branches: 52 212 24.5%

Line Branch Exec Source
1 #include <core.h>
2 #include <foreach.h>
3 #include <interface.h>
4
5
6 static void
7 1013 fromArrayCallback(ForEachContext_t *ctxt) {
8 1013 napi_env env = ctxt->bTree->env;
9 napi_value key, value, box;
10 1013 bool valueIsArray = (bool) ctxt->data;
11
12
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1005 times.
1013 if (valueIsArray) {
13
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, VOID_ON_FAIL,
14 napi_get_element(env, ctxt->cbThis, 0, &key));
15
16
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, VOID_ON_FAIL,
17 napi_get_element(env, ctxt->cbThis, 1, &value));
18 8 }
19 // Is Object
20 else {
21
1/6
✓ Branch 0 taken 1005 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1005 NAPI_CALL(env, VOID_ON_FAIL,
22 napi_get_named_property(env, ctxt->cbThis, KEY, &key));
23
24
1/6
✓ Branch 0 taken 1005 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1005 NAPI_CALL(env, VOID_ON_FAIL,
25 napi_get_named_property(env, ctxt->cbThis, VALUE, &value));
26 }
27
28
1/6
✓ Branch 0 taken 1013 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1013 NAPI_CALL(env, VOID_ON_FAIL,
29 napi_create_object(env, &box));
30
31
1/6
✓ Branch 0 taken 1013 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1013 NAPI_CALL(env, VOID_ON_FAIL,
32 napi_set_named_property(env, box, KEY, key));
33
34
1/6
✓ Branch 0 taken 1013 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1013 NAPI_CALL(env, VOID_ON_FAIL,
35 napi_set_named_property(env, box, VALUE, value));
36
37 1013 nativeInsertNode(env, ctxt->esbTree, box);
38 1013 }
39
40 static void
41 5 iterableIterate(napi_env env, napi_value iterable, forEachCallback callback, ForEachContext_t *ctxt) {
42 napi_value generator, SymbolIterator, iterator, next;
43
44
3/18
✓ 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.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 5 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
5 NAPI_GLOBAL_SYM(env, "iterator", SymbolIterator);
45
46
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, VOID_ON_FAIL,
47 napi_get_property(env, iterable,SymbolIterator, &generator));
48
49
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, VOID_ON_FAIL,
50 napi_call_function(env, iterable, generator, 0, NULL, &iterator));
51
52
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, VOID_ON_FAIL,
53 napi_get_named_property(env, iterator, "next", &next));
54
55 5 bool isDone = true;
56 5 bool valueIsArray = false;
57 napi_value result, value, done;
58
59 5 do {
60
1/6
✓ Branch 0 taken 1018 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1018 NAPI_CALL(env, VOID_ON_FAIL,
61 napi_call_function(env, iterator, next, 0, NULL, &result));
62
63
1/6
✓ Branch 0 taken 1018 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1018 NAPI_CALL(env, VOID_ON_FAIL,
64 napi_get_named_property(env, result, "done", &done));
65
66
1/6
✓ Branch 0 taken 1018 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1018 NAPI_CALL(env, VOID_ON_FAIL,
67 napi_get_value_bool(env, done, &isDone));
68
69
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1013 times.
1018 if (!isDone) {
70
1/6
✓ Branch 0 taken 1013 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1013 NAPI_CALL(env, VOID_ON_FAIL,
71 napi_get_named_property(env, result, VALUE, &value));
72
73
1/6
✓ Branch 0 taken 1013 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1013 NAPI_CALL(env, VOID_ON_FAIL,
74 napi_is_array(env, value, &valueIsArray));
75
76 1013 ctxt->cbThis = value;
77 1013 ctxt->data = (void *) valueIsArray;
78
79 1013 callback(ctxt);
80
81 1013 ctxt->idx++;
82 1013 }
83
84
2/2
✓ Branch 0 taken 1013 times.
✓ Branch 1 taken 5 times.
1018 } while(!isDone);
85 5 }
86
87 static void
88 5 fromKeyValueIterable(napi_env env, napi_value iterable, napi_value esbTree) {
89 BTree_t *bTree;
90
91 // Extract native BTree pointer
92
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 EXTRACT_BTREE(env, esbTree, bTree);
93
94 15 ForEachContext_t ctxt = {
95 5 esbTree,
96 NULL,
97 NULL,
98 0,
99 5 bTree,
100 NULL
101 };
102
103 5 iterableIterate(env, iterable, fromArrayCallback, &ctxt);
104 5 }
105
106
107 /**
108 * static ES callback. BTree.from()
109 */
110 napi_value
111 8 esStaticFrom(napi_env env, napi_callback_info cbInfo) {
112 napi_value result, BTreeConstructor, argv[2];
113 napi_value global, Map;
114 8 size_t argc = 2;
115
116 // Get es arguments & context
117
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,
118 napi_get_cb_info(env, cbInfo, &argc, argv, &BTreeConstructor, NULL));
119
120
3/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 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.
8 CHECK_ARGC(2, msgTooFewArguments);
121 7 napi_value comparator = argv[0];
122 7 napi_value iterable = argv[1];
123
124
1/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 NAPI_CALL(env, true,
125 napi_get_global(env, &global));
126
1/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 NAPI_CALL(env, true,
127 napi_get_named_property(env, global, "Map", &Map));
128
129
3/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 NAPI_CALL(env, true,
130 napi_new_instance(env, BTreeConstructor, 1, &comparator, &result));
131
132 bool isPending;
133
1/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
7 NAPI_CALL(env, true,
134 napi_is_exception_pending(env, &isPending));
135
136
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
7 if (isPending) {
137 1 return NULL;
138 }
139
140 6 bool isArray = false;
141 6 bool isMap = false;
142 6 bool isGenericIterable = false;
143
144
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,
145 napi_is_array(env, iterable, &isArray));
146
147
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,
148 napi_instanceof(env, iterable, Map, &isMap));
149
150 // May be generic?
151
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
6 if (!(isArray || isMap)) {
152 napi_handle_scope scope;
153
154
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, true,
155 napi_open_handle_scope(env, &scope));
156
157 // Duck typing. next() method exists?
158 napi_value nextMethod;
159 napi_valuetype nextMethodType;
160
161
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, true,
162 napi_get_named_property(env, iterable, "next", &nextMethod));
163
164
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, true,
165 napi_typeof(env, nextMethod, &nextMethodType));
166
167 2 isGenericIterable = (nextMethodType == napi_function);
168
169
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, true,
170 napi_close_handle_scope(env, scope));
171 2 }
172
173
5/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
6 if (isMap || isArray || isGenericIterable) {
174 5 fromKeyValueIterable(env, iterable, result);
175 5 }
176 else {
177
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, true,
178 napi_throw_error(env, NULL, "Second arg must be Array, Map or iterable"));
179 }
180
181 6 return result;
182 8 }
183