GCC Code Coverage Report


Directory: src/
File: src/common/core.c
Date: 2023-03-02 23:19:03
Exec Total Coverage
Lines: 75 92 81.5%
Functions: 12 15 80.0%
Branches: 32 170 18.8%

Line Branch Exec Source
1 #include <core.h>
2
3 const char *msgTooFewArguments = "Too few arguments.";
4 const char *msgCorrupt = "BTree corrupt. Next node expected but it is null.";
5
6 void
7 1451 nativeInsertNode(napi_env env, napi_value esBtree, napi_value box) {
8 BTree_t *bTree;
9
10 // NOTE: Memory policy: New es and create new native wrapper
11
12 // Extract native BTree pointer
13
1/6
✓ Branch 0 taken 1451 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1451 NAPI_CALL(env, false,
14 napi_unwrap(env, esBtree, (void **) &bTree));
15
16 // Set ref counter to 1 for protect from GC
17 napi_ref nodeRef;
18
1/6
✓ Branch 0 taken 1451 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1451 NAPI_CALL(env, false,
19 napi_create_reference(env, box, 1, &nodeRef));
20
21 // Alloc new tree node
22 BTreeNode node;
23 1451 NEW_NODE(node, bTree, nodeRef);
24
25 // Add es plain object to native bTree
26 1451 g_tree_replace(bTree->nativeTree, node, node);
27 1451 }
28
29 napi_value
30 12 getEsUndef(napi_env env) {
31 napi_value esUndef;
32
1/6
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
12 NAPI_CALL(env, false, napi_get_undefined(env, &esUndef));
33
34 12 return esUndef;
35 }
36
37 napi_value
38 getEsNull(napi_env env) {
39 napi_value esNull;
40 NAPI_CALL(env, false, napi_get_null(env, &esNull));
41
42 return esNull;
43 }
44
45 napi_value
46 7 getEsGlobal(napi_env env) {
47 napi_value result;
48
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,
49 napi_get_global(env, &result));
50
51 7 return result;
52 7 }
53
54 napi_value
55 46 unrefBtreeNodeEsObject(napi_env env, napi_ref ref, napi_value *key, napi_value *value) {
56 napi_value result;
57
58
1/6
✓ Branch 0 taken 46 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
46 NAPI_CALL(env, false,
59 napi_get_reference_value(env, ref, &result));
60
61
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 46 times.
46 if (key) {
62
1/6
✓ Branch 0 taken 46 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
46 NAPI_CALL(env, false,
63 napi_get_named_property(env, result, KEY, key));
64 46 }
65
66
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 46 times.
46 if (value) {
67
1/6
✓ Branch 0 taken 46 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
46 NAPI_CALL(env, false,
68 napi_get_named_property(env, result, VALUE, value));
69 46 }
70
71 46 return result;
72 }
73
74 static gint
75 to_ptr_array_cb(gpointer a, gpointer b, gpointer data)
76 {
77 GPtrArray *buff = (GPtrArray *) data;
78
79 BTreeNode node = (BTreeNode) a;
80
81 g_ptr_array_add(buff, node->esKeyValue); // add napi_ref from key field
82
83 return FALSE;
84 }
85
86
87 GPtrArray*
88 gtreeToPtrArray(GTree *gtree)
89 {
90 gint tree_size = g_tree_nnodes(gtree);
91
92 GPtrArray *buff = g_ptr_array_sized_new(tree_size);
93
94 g_tree_foreach(gtree, to_ptr_array_cb, (gpointer) buff);
95
96 return buff;
97 }
98
99 // TODO: possible inline
100 napi_ref
101 44 cloneInternalEsRef(napi_env env, napi_ref ref) {
102 napi_ref result;
103
104 44 napi_value box = cloneInternalEsObject(env, ref);
105
106
1/6
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
44 NAPI_CALL(env, false,
107 napi_create_reference(env, box, 1, &result));
108
109 44 return result;
110 }
111
112 #ifdef HAS_GTREE_NODE
113
114 napi_value
115 147 getNodeEsObject(napi_env env, GTreeNode *g_node) {
116
1/2
✓ Branch 0 taken 147 times.
✗ Branch 1 not taken.
147 if (g_node) {
117 napi_value result;
118 147 BTreeNode node = (BTreeNode) g_tree_node_value(g_node);
119
120
1/6
✓ Branch 0 taken 147 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
147 NAPI_CALL(env, false,
121 napi_get_reference_value(env, node->esKeyValue, &result));
122
123 147 return result;
124 }
125 else {
126 return getEsUndef(env);
127 }
128 147 }
129
130 napi_value
131 132 getNodeEsField(napi_env env, GTreeNode *g_node, const char *field) {
132
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (g_node) {
133 napi_valuetype resType;
134 132 napi_value result = getNodeEsObject(env, g_node);
135
136
1/6
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
132 NAPI_CALL(env, false,
137 napi_typeof(env, result, &resType));
138
139
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (resType != napi_undefined) {
140
1/6
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
132 NAPI_CALL(env, false,
141 napi_get_named_property(env, result, field, &result));
142
143 132 return result;
144 }
145 else {
146 return result;
147 }
148 }
149 else {
150 return getEsUndef(env);
151 }
152 132 }
153
154 napi_value
155 15 getNodeEsFieldPair(napi_env env, GTreeNode *g_node) {
156
1/2
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
15 if (g_node) {
157 napi_value array;
158
159
1/6
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
15 NAPI_CALL(env, false, napi_create_array_with_length(env, 2, &array));
160
161
1/6
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
15 NAPI_CALL(env, false,
162 napi_set_element(env, array, 0, getNodeEsKey(env, g_node)));
163
164
1/6
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
15 NAPI_CALL(env, false,
165 napi_set_element(env, array, 1, getNodeEsValue(env, g_node)));
166
167 15 return array;
168 }
169 else {
170 return getEsUndef(env);
171 }
172 15 }
173
174 GTreeNode*
175 33 btreeLookup(napi_env env, BTree_t *btree, napi_value key) {
176 napi_value lookupBox;
177 napi_ref lookupRef;
178
179
1/6
✓ Branch 0 taken 33 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
33 NAPI_CALL(env, false,
180 napi_create_object(env, &lookupBox));
181
182
1/6
✓ Branch 0 taken 33 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
33 NAPI_CALL(env, false,
183 napi_set_named_property(env, lookupBox, KEY, key));
184
185
1/6
✓ Branch 0 taken 33 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
33 NAPI_CALL(env, false,
186 napi_create_reference(env, lookupBox, 0, &lookupRef));
187
188 66 BTreeNode_t lookupNode = {
189 33 lookupRef,
190 NULL
191 };
192
193 33 return g_tree_lookup_node(btree->nativeTree, &lookupNode);
194 }
195
196 napi_value
197 21 cloneBtreeWrapper(napi_env env, napi_value orig, BTree_t **newBTreePtr) {
198 extern napi_ref btreeConstructorRef;
199 napi_value result, comparator, constructor;
200 BTree_t *origBTree;
201
202 // Extract native BTree pointer
203
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 EXTRACT_BTREE(env, orig, origBTree);
204
205
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, true,
206 napi_get_reference_value(env, btreeConstructorRef, &constructor));
207
208
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, true,
209 napi_get_reference_value(env, origBTree->comparator, &comparator));
210
211 // TODO: Check constructor ref. Can we increment counter only?
212
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 NAPI_CALL(env, true,
213 napi_new_instance(env, constructor, 1, &comparator, &result));
214
215 // Pass btree ptr in out
216
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
21 if (newBTreePtr) {
217
1/6
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
21 EXTRACT_BTREE(env, result, (*newBTreePtr));
218 21 }
219
220 21 return result;
221 21 }
222
223 napi_value
224 46 cloneInternalEsObject(napi_env env, napi_ref ref) {
225 napi_value result, key, value;
226
227
1/6
✓ Branch 0 taken 46 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
46 NAPI_CALL(env, false,
228 napi_create_object(env, &result));
229
230 46 unrefBtreeNodeEsObject(env, ref, &key, &value);
231
232 // Set key & value to box
233
1/6
✓ Branch 0 taken 46 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
46 NAPI_CALL(env, false,
234 napi_set_named_property(env, result, KEY, key));
235
1/6
✓ Branch 0 taken 46 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
46 NAPI_CALL(env, false,
236 napi_set_named_property(env, result, VALUE, value));
237
238 46 return result;
239 }
240
241 // TODO: possible inline
242 BTreeNode
243 44 cloneBTreeNode(napi_env env, BTree_t *btree, GTreeNode *node) {
244 44 napi_ref origEsNodeRef = getEsGTreeNode(node)->esKeyValue;
245 44 napi_ref newEsNodeRef = cloneInternalEsRef(env, origEsNodeRef);
246
247 BTreeNode result;
248 44 NEW_NODE(result, btree, newEsNodeRef);
249
250 44 return result;
251 }
252
253 #endif // HAS_GTREE_NODE
254