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 |