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 |