GCC Code Coverage Report


Directory: src/
File: src/btree/iterators.c
Date: 2023-03-02 23:19:03
Exec Total Coverage
Lines: 70 71 98.6%
Functions: 7 7 100.0%
Branches: 42 224 18.8%

Line Branch Exec Source
1 #include <iterators.h>
2
3 /**
4 * Free iterator native data
5 */
6 static void
7 24 freeIterator(napi_env env, void *finalize_data, void *finalize_hint) {
8 24 g_free((gpointer) finalize_data);
9 24 }
10
11 inline static void
12 24 attachIteratorContext(napi_env env, napi_value esIterator, BTree_t *bTree) {
13 // Alloc memory for native iterator context
14 24 IteratorContext_t *c = g_new(IteratorContext_t, 1);
15
16 24 c->bTree = bTree;
17 24 c->state = ITERATOR_INIT;
18
19 // Attach native data (context) to es value (iterator)
20
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,
21 napi_wrap(env, esIterator, (gpointer) c, freeIterator, NULL, NULL));
22 24 }
23
24
25 /**
26 * ES callback. Iterator next() method.
27 */
28 static napi_value
29 81 esIteratorNext(napi_env env, napi_callback_info cbInfo) {
30 napi_value esThis;
31 IteratorContext_t *itCtxt;
32 iteratorResultCallback resultCb;
33
34 // Get es this for current btree
35
1/6
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
81 NAPI_CALL(env, false,
36 napi_get_cb_info(env, cbInfo, NULL, NULL, &esThis, (void **) &resultCb));
37
38 // Extract native pointer
39
1/6
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
81 NAPI_CALL(env, false,
40 napi_unwrap(env, esThis, (void **) &itCtxt));
41
42
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
✓ Branch 2 taken 60 times.
✗ Branch 3 not taken.
81 switch (itCtxt->state) {
43 case ITERATOR_INIT:
44 21 itCtxt->state = ITERATOR_LOOP;
45 21 itCtxt->currentNode = g_tree_node_first(itCtxt->bTree->nativeTree);
46 21 break;
47
48 case ITERATOR_LOOP:
49 60 itCtxt->currentNode = g_tree_node_next(itCtxt->currentNode);
50 60 break;
51
52 case ITERATOR_END:
53 // noop
54 break;
55 }
56
57
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 16 times.
81 if (itCtxt->currentNode == NULL) {
58 16 itCtxt->state = ITERATOR_END;
59 16 }
60
61 // Prepare result:
62
63 napi_value esIteratorResult, isDone;
64
1/6
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
81 NAPI_CALL(env, false,
65 napi_create_object(env, &esIteratorResult));
66
67
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 65 times.
81 if (itCtxt->state == ITERATOR_END) {
68
1/6
✓ Branch 0 taken 16 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
16 NAPI_CALL(env, false,
69 napi_get_undefined(env, &itCtxt->value));
70
71
1/6
✓ Branch 0 taken 16 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
16 NAPI_CALL(env, false,
72 napi_get_boolean(env, true, &isDone));
73 16 }
74 else {
75 65 resultCb(itCtxt);
76
1/6
✓ Branch 0 taken 65 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
65 NAPI_CALL(env, false,
77 napi_get_boolean(env, false, &isDone));
78 }
79
80
1/6
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
81 NAPI_CALL(env, false,
81 napi_set_named_property(env, esIteratorResult, VALUE, itCtxt->value));
82
83
1/6
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
81 NAPI_CALL(env, false,
84 napi_set_named_property(env, esIteratorResult, "done", isDone));
85
86 81 return esIteratorResult;
87 }
88
89
90 /**
91 * ES callback. bTree generator function.
92 */
93 napi_value
94 24 esGenerator(napi_env env, napi_callback_info cbInfo) {
95 napi_value esThis, esIterator, symIterator, generatorFn, symToStringTag,
96 toStringTagValue, bind;
97 BTree_t *bTree;
98 gpointer data;
99
100 // Get es this for current btree
101
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,
102 napi_get_cb_info(env, cbInfo, NULL, NULL, &esThis, &data));
103
104 // Extract native BTree pointer
105
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,
106 napi_unwrap(env, esThis, (gpointer *) &bTree));
107
108 // Create es Iterator
109
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,
110 napi_create_object(env, &esIterator));
111
112
3/18
✓ 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.
✓ Branch 6 taken 24 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 24 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
24 NAPI_GLOBAL_SYM(env, "iterator", symIterator);
113
3/18
✓ 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.
✓ Branch 6 taken 24 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 24 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
24 NAPI_GLOBAL_SYM(env, "toStringTag", symToStringTag);
114
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, true,
115 napi_create_string_utf8(env, "BTreeIterator", NAPI_AUTO_LENGTH, &toStringTagValue));
116
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, true,
117 napi_set_property(env, esIterator, symToStringTag, toStringTagValue));
118
119 // Create next() iterator method
120 napi_value nextFunction;
121
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,
122 napi_create_function(env, "next", NAPI_AUTO_LENGTH, esIteratorNext, data, &nextFunction));
123
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,
124 napi_set_named_property(env, esIterator, "next", nextFunction));
125 // Create new generator
126
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,
127 napi_create_function(env, "BTreeIterator", 0, esGenerator, data, &generatorFn));
128 // Bind generator to btree this
129
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, true,
130 napi_get_named_property(env, generatorFn, "bind", &bind));
131
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, true,
132 napi_call_function(env, generatorFn, bind, 1, &esThis, &generatorFn));
133 // Set generator fn
134
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,
135 napi_set_property(env, esIterator, symIterator, generatorFn));
136
137 24 attachIteratorContext(env, esIterator, bTree);
138
139 24 return esIterator;
140 24 }
141
142 /**
143 * Callback for iterator wich return key with value
144 */
145 void
146 49 iteratorResultDefaultCb(IteratorContext_t *ctxt) {
147 49 napi_env env = ctxt->bTree->env;
148 napi_value esValue, tmp;
149
150 49 BTreeNode node = (BTreeNode) g_tree_node_value(ctxt->currentNode);
151
152
1/6
✓ Branch 0 taken 49 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
49 NAPI_CALL(env, false,
153 napi_get_reference_value(env, node->esKeyValue, &esValue));
154
155
1/6
✓ Branch 0 taken 49 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
49 NAPI_CALL(env, false,
156 napi_create_array_with_length(env, 2, &ctxt->value));
157
158
1/6
✓ Branch 0 taken 49 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
49 NAPI_CALL(env, false,
159 napi_get_named_property(env, esValue, KEY, &tmp));
160
1/6
✓ Branch 0 taken 49 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
49 NAPI_CALL(env, false,
161 napi_set_element(env, ctxt->value, 0, tmp));
162
163
1/6
✓ Branch 0 taken 49 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
49 NAPI_CALL(env, false,
164 napi_get_named_property(env, esValue, VALUE, &tmp));
165
1/6
✓ Branch 0 taken 49 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
49 NAPI_CALL(env, false,
166 napi_set_element(env, ctxt->value, 1, tmp));
167 49 }
168
169 /**
170 * Callback for iterator wich return value only
171 */
172 void
173 13 iteratorResultValueCb(IteratorContext_t *ctxt) {
174 13 napi_env env = ctxt->bTree->env;
175 napi_value esValue;
176
177 13 BTreeNode node = (BTreeNode) g_tree_node_value(ctxt->currentNode);
178
179
1/6
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
13 NAPI_CALL(env, false,
180 napi_get_reference_value(env, node->esKeyValue, &esValue));
181
182
1/6
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
13 NAPI_CALL(env, false,
183 napi_get_named_property(env, esValue, VALUE, &ctxt->value));
184 13 }
185
186 /**
187 * Callback for iterator wich return key only
188 */
189 void
190 3 iteratorResultKeyCb(IteratorContext_t *ctxt) {
191 3 napi_env env = ctxt->bTree->env;
192 napi_value esValue;
193
194 3 BTreeNode node = (BTreeNode) g_tree_node_value(ctxt->currentNode);
195
196
1/6
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
3 NAPI_CALL(env, false,
197 napi_get_reference_value(env, node->esKeyValue, &esValue));
198
199
1/6
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
3 NAPI_CALL(env, false,
200 napi_get_named_property(env, esValue, KEY, &ctxt->value));
201 3 }
202