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 |