| line |
true |
false |
branch |
|
7
|
13 |
63 |
EXTRACT_NEW_ARGS(_max_size, _ttl, _lru_skip); |
|
|
9 |
67 |
EXTRACT_NEW_ARGS(_max_size, _ttl, _lru_skip); |
|
|
1 |
75 |
EXTRACT_NEW_ARGS(_max_size, _ttl, _lru_skip); |
|
9
|
0 |
76 |
if (!map) croak("Failed to create HashMap::SS"); |
|
17
|
79 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
79 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
79 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
79 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
24
|
82376 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
82376 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
82376 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
82376 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
25
|
0 |
82376 |
EXTRACT_STR_KEY(key_sv); |
|
26
|
0 |
82376 |
EXTRACT_STR_VAL(value); |
|
35
|
50041 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
50041 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
50041 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
50041 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
36
|
0 |
50041 |
EXTRACT_STR_KEY(key_sv); |
|
40
|
7 |
50034 |
if (!hashmap_ss_get(self, _kstr, (uint32_t)_klen, _khash, &val, &val_len, &val_utf8)) |
|
43
|
4 |
50030 |
if (val_utf8) SvUTF8_on(RETVAL); |
|
50
|
5 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
5 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
5 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
5 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
51
|
0 |
5 |
EXTRACT_STR_KEY(key_sv); |
|
55
|
1 |
4 |
if (!hashmap_ss_get(self, _kstr, (uint32_t)_klen, _khash, &val, &val_len, &val_utf8)) |
|
64
|
80510 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
80510 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
80510 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
80510 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
65
|
0 |
80510 |
EXTRACT_STR_KEY(key_sv); |
|
73
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
74
|
0 |
1 |
EXTRACT_STR_KEY(key_sv); |
|
76
|
0 |
1 |
if (!hashmap_ss_take(self, _kstr, (uint32_t)_klen, _khash, &val, &val_len, &val_utf8)) XSRETURN_UNDEF; |
|
78
|
0 |
1 |
if (val_utf8) SvUTF8_on(RETVAL); |
|
86
|
2 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
2 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
2 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
2 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
87
|
0 |
2 |
EXTRACT_STR_KEY(key_sv); |
|
95
|
21 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
21 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
21 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
21 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
96
|
0 |
21 |
RETVAL = self->size; |
|
103
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
104
|
0 |
0 |
RETVAL = self->max_size; |
|
111
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
112
|
0 |
0 |
RETVAL = (UV)self->default_ttl; |
|
119
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
120
|
0 |
0 |
RETVAL = (UV)self->lru_skip; |
|
127
|
6 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
6 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
6 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
6 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
128
|
0 |
6 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
129
|
0 |
6 |
EXTEND(SP, self->size); |
|
131
|
576 |
6 |
for (i = 0; i < self->capacity; i++) { |
|
132
|
208 |
368 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
205 |
3 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
205 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
135
|
2 |
203 |
if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(sv); |
|
136
|
0 |
205 |
mXPUSHs(sv); |
|
143
|
3 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
3 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
3 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
3 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
144
|
0 |
3 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
145
|
0 |
3 |
EXTEND(SP, self->size); |
|
147
|
528 |
3 |
for (i = 0; i < self->capacity; i++) { |
|
148
|
202 |
326 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
200 |
2 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
200 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
149
|
200 |
0 |
if (self->nodes[i].value) { |
|
152
|
0 |
200 |
if (HM_UNPACK_UTF8(self->nodes[i].val_len)) SvUTF8_on(sv); |
|
153
|
0 |
200 |
mXPUSHs(sv); |
|
155
|
0 |
0 |
XPUSHs(&PL_sv_undef); |
|
163
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
164
|
0 |
1 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
165
|
0 |
1 |
EXTEND(SP, self->size * 2); |
|
167
|
16 |
1 |
for (i = 0; i < self->capacity; i++) { |
|
168
|
2 |
14 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
2 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
2 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
171
|
0 |
2 |
if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(sv); |
|
172
|
0 |
2 |
mXPUSHs(sv); |
|
173
|
2 |
0 |
if (self->nodes[i].value) { |
|
176
|
0 |
2 |
if (HM_UNPACK_UTF8(self->nodes[i].val_len)) SvUTF8_on(vsv); |
|
177
|
0 |
2 |
mXPUSHs(vsv); |
|
179
|
0 |
0 |
XPUSHs(&PL_sv_undef); |
|
187
|
47 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
47 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
47 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
47 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
188
|
0 |
47 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
189
|
90 |
3 |
while (self->iter_pos < self->capacity) { |
|
191
|
44 |
46 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
44 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
44 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
192
|
0 |
44 |
EXTEND(SP, 2); |
|
196
|
1 |
43 |
if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(ksv); |
|
197
|
0 |
44 |
mXPUSHs(ksv); |
|
199
|
1 |
43 |
if (GIMME_V == G_SCALAR) XSRETURN(1); |
|
200
|
43 |
0 |
if (self->nodes[i].value) { |
|
203
|
1 |
42 |
if (HM_UNPACK_UTF8(self->nodes[i].val_len)) SvUTF8_on(vsv); |
|
204
|
0 |
43 |
mXPUSHs(vsv); |
|
206
|
0 |
0 |
XPUSHs(&PL_sv_undef); |
|
217
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
223
|
2 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
2 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
2 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
2 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
224
|
0 |
2 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
226
|
0 |
2 |
EXTEND(SP, (count < self->size ? count : self->size) * 2); |
|
227
|
19 |
0 |
while (self->iter_pos < self->capacity && n < count) { |
|
|
17 |
2 |
while (self->iter_pos < self->capacity && n < count) { |
|
229
|
3 |
14 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
3 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
3 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
232
|
1 |
2 |
if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(ksv); |
|
233
|
0 |
3 |
mXPUSHs(ksv); |
|
235
|
3 |
0 |
if (self->nodes[i].value) { |
|
237
|
0 |
3 |
if (HM_UNPACK_UTF8(self->nodes[i].val_len)) SvUTF8_on(sv); |
|
238
|
0 |
3 |
mXPUSHs(sv); |
|
239
|
0 |
0 |
} else { XPUSHs(&PL_sv_undef); } |
|
240
|
0 |
3 |
if (HM_UNLIKELY(self->lru_prev)) hashmap_ss_lru_unlink(self, (uint32_t)i); |
|
245
|
0 |
2 |
if (self->iter_pos >= self->capacity) self->iter_pos = 0; |
|
246
|
2 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
1 |
1 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
0 |
1 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
251
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
252
|
0 |
1 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
253
|
1 |
0 |
if (self->lru_prev) { |
|
254
|
1 |
0 |
while (self->lru_tail != HM_LRU_NONE) { |
|
256
|
0 |
1 |
if (HM_UNLIKELY(HM_TTL_SKIP_EXPIRED(self, idx, now))) { |
|
|
0 |
0 |
if (HM_UNLIKELY(HM_TTL_SKIP_EXPIRED(self, idx, now))) { |
|
|
0 |
1 |
if (HM_UNLIKELY(HM_TTL_SKIP_EXPIRED(self, idx, now))) { |
|
|
0 |
0 |
if (HM_UNLIKELY(HM_TTL_SKIP_EXPIRED(self, idx, now))) { |
|
259
|
0 |
1 |
EXTEND(SP, 2); |
|
262
|
0 |
1 |
if (HM_UNPACK_UTF8(self->nodes[idx].key_len)) SvUTF8_on(ksv); |
|
263
|
0 |
1 |
mXPUSHs(ksv); |
|
265
|
1 |
0 |
if (self->nodes[idx].value) { |
|
267
|
0 |
1 |
if (HM_UNPACK_UTF8(self->nodes[idx].val_len)) SvUTF8_on(sv); |
|
268
|
0 |
1 |
mXPUSHs(sv); |
|
269
|
0 |
0 |
} else { XPUSHs(&PL_sv_undef); } |
|
272
|
1 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
1 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
0 |
1 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
277
|
0 |
0 |
while (self->iter_pos < self->capacity) { |
|
279
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
280
|
0 |
0 |
EXTEND(SP, 2); |
|
283
|
0 |
0 |
if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(ksv); |
|
284
|
0 |
0 |
mXPUSHs(ksv); |
|
286
|
0 |
0 |
if (self->nodes[i].value) { |
|
288
|
0 |
0 |
if (HM_UNPACK_UTF8(self->nodes[i].val_len)) SvUTF8_on(sv); |
|
289
|
0 |
0 |
mXPUSHs(sv); |
|
290
|
0 |
0 |
} else { XPUSHs(&PL_sv_undef); } |
|
292
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
303
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
304
|
0 |
0 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
305
|
0 |
0 |
if (self->lru_prev) { |
|
306
|
0 |
0 |
while (self->lru_head != HM_LRU_NONE) { |
|
308
|
0 |
0 |
if (HM_UNLIKELY(HM_TTL_SKIP_EXPIRED(self, idx, now))) { |
|
|
0 |
0 |
if (HM_UNLIKELY(HM_TTL_SKIP_EXPIRED(self, idx, now))) { |
|
|
0 |
0 |
if (HM_UNLIKELY(HM_TTL_SKIP_EXPIRED(self, idx, now))) { |
|
|
0 |
0 |
if (HM_UNLIKELY(HM_TTL_SKIP_EXPIRED(self, idx, now))) { |
|
311
|
0 |
0 |
EXTEND(SP, 2); |
|
314
|
0 |
0 |
if (HM_UNPACK_UTF8(self->nodes[idx].key_len)) SvUTF8_on(ksv); |
|
315
|
0 |
0 |
mXPUSHs(ksv); |
|
317
|
0 |
0 |
if (self->nodes[idx].value) { |
|
319
|
0 |
0 |
if (HM_UNPACK_UTF8(self->nodes[idx].val_len)) SvUTF8_on(sv); |
|
320
|
0 |
0 |
mXPUSHs(sv); |
|
321
|
0 |
0 |
} else { XPUSHs(&PL_sv_undef); } |
|
324
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
329
|
0 |
0 |
if (self->iter_pos == 0) self->iter_pos = self->capacity; |
|
330
|
0 |
0 |
while (self->iter_pos > 0) { |
|
332
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
333
|
0 |
0 |
EXTEND(SP, 2); |
|
336
|
0 |
0 |
if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(ksv); |
|
337
|
0 |
0 |
mXPUSHs(ksv); |
|
339
|
0 |
0 |
if (self->nodes[i].value) { |
|
341
|
0 |
0 |
if (HM_UNPACK_UTF8(self->nodes[i].val_len)) SvUTF8_on(sv); |
|
342
|
0 |
0 |
mXPUSHs(sv); |
|
343
|
0 |
0 |
} else { XPUSHs(&PL_sv_undef); } |
|
345
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
|
0 |
0 |
HM_MAYBE_COMPACT_XS(self, hashmap_ss_compact); |
|
356
|
9 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
9 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
9 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
9 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
362
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
363
|
0 |
0 |
if (!hashmap_ss_reserve(self, (size_t)count)) |
|
369
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
375
|
3 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
3 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
3 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
3 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
376
|
1 |
2 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
391
|
48 |
3 |
for (i = 0; i < self->capacity; i++) { |
|
392
|
5 |
43 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
5 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
2 |
3 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
1 |
1 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
1 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
402
|
5 |
0 |
if (self->nodes[i].value) sv_catpvn(buf, self->nodes[i].value, vl); |
|
405
|
2 |
3 |
if (self->expires_at && self->expires_at[i] && self->expires_at[i] >= now) { |
|
|
1 |
1 |
if (self->expires_at && self->expires_at[i] && self->expires_at[i] >= now) { |
|
|
1 |
0 |
if (self->expires_at && self->expires_at[i] && self->expires_at[i] >= now) { |
|
407
|
0 |
1 |
if (!rem) rem = 1; |
|
427
|
2 |
0 |
if (dlen < 22 || memcmp(p, "DHMP", 4) != 0) croak("Invalid freeze data"); |
|
|
0 |
2 |
if (dlen < 22 || memcmp(p, "DHMP", 4) != 0) croak("Invalid freeze data"); |
|
429
|
0 |
2 |
uint8_t ver = *p++; if (ver != 1) croak("Unsupported freeze version %d", ver); |
|
430
|
0 |
2 |
uint8_t vid = *p++; if (vid != 4) croak("Variant mismatch: expected 4, got %d", vid); |
|
436
|
0 |
2 |
if (!map) croak("Failed to create map for thaw"); |
|
437
|
2 |
0 |
if (cnt > 0) hashmap_ss_reserve(map, (size_t)cnt); |
|
439
|
4 |
2 |
for (j = 0; j < cnt; j++) { |
|
440
|
0 |
4 |
if (p + 14 > end) { hashmap_ss_destroy(map); croak("Truncated freeze data"); } |
|
443
|
0 |
4 |
if (p + kl + 5 > end) { hashmap_ss_destroy(map); croak("Truncated freeze data"); } |
|
448
|
0 |
4 |
if (p + vl + 4 > end) { hashmap_ss_destroy(map); croak("Truncated freeze data"); } |
|
451
|
0 |
4 |
if (!hashmap_ss_put(map, kstr, kl, khash, kutf8, vstr, vl, vutf8, ttl)) { hashmap_ss_destroy(map); croak("OOM during thaw"); } |
|
452
|
3 |
1 |
if (ttl == 0 && map->expires_at) hashmap_ss_persist(map, kstr, kl, khash); |
|
|
1 |
2 |
if (ttl == 0 && map->expires_at) hashmap_ss_persist(map, kstr, kl, khash); |
|
455
|
0 |
2 |
if (p > end) croak("Truncated freeze data"); |
|
464
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
465
|
0 |
0 |
RETVAL = (UV)self->capacity; |
|
472
|
2 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
2 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
2 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
2 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
473
|
0 |
2 |
EXTRACT_STR_KEY(key_sv); |
|
481
|
2 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
2 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
2 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
2 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
482
|
0 |
2 |
EXTRACT_STR_KEY(key_sv); |
|
485
|
1 |
1 |
if (!hashmap_ss_swap(self, _kstr, (uint32_t)_klen, _khash, _nvs, (uint32_t)_nvl, _nvu, &old, &old_len, &old_utf8)) XSRETURN_UNDEF; |
|
487
|
0 |
1 |
if (old_utf8) SvUTF8_on(RETVAL); |
|
496
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
498
|
0 |
1 |
if (!clone) croak("Failed to clone"); |
|
499
|
1 |
0 |
RETVAL = sv_setref_pv(newSV(0), HvNAME(SvSTASH(SvRV(self_sv))), (void*)clone); |
|
|
1 |
0 |
RETVAL = sv_setref_pv(newSV(0), HvNAME(SvSTASH(SvRV(self_sv))), (void*)clone); |
|
|
0 |
1 |
RETVAL = sv_setref_pv(newSV(0), HvNAME(SvSTASH(SvRV(self_sv))), (void*)clone); |
|
|
0 |
0 |
RETVAL = sv_setref_pv(newSV(0), HvNAME(SvSTASH(SvRV(self_sv))), (void*)clone); |
|
|
1 |
0 |
RETVAL = sv_setref_pv(newSV(0), HvNAME(SvSTASH(SvRV(self_sv))), (void*)clone); |
|
|
0 |
1 |
RETVAL = sv_setref_pv(newSV(0), HvNAME(SvSTASH(SvRV(self_sv))), (void*)clone); |
|
506
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
507
|
1 |
0 |
if (!SvROK(href) || SvTYPE(SvRV(href)) != SVt_PVHV) |
|
|
0 |
1 |
if (!SvROK(href) || SvTYPE(SvRV(href)) != SVt_PVHV) |
|
510
|
0 |
1 |
hashmap_ss_reserve(self, (size_t)HvUSEDKEYS(hv)); |
|
513
|
2 |
1 |
while ((he = hv_iternext(hv))) { |
|
514
|
0 |
2 |
STRLEN klen; const char* kstr = HePV(he, klen); |
|
515
|
0 |
2 |
bool kutf8 = HeUTF8(he) ? true : false; |
|
525
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
1 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
1 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
526
|
1 |
0 |
if (!SvROK(other_sv) || !SvOBJECT(SvRV(other_sv)) || SvSTASH(SvRV(other_sv)) != stash_ss) |
|
|
1 |
0 |
if (!SvROK(other_sv) || !SvOBJECT(SvRV(other_sv)) || SvSTASH(SvRV(other_sv)) != stash_ss) |
|
|
0 |
1 |
if (!SvROK(other_sv) || !SvOBJECT(SvRV(other_sv)) || SvSTASH(SvRV(other_sv)) != stash_ss) |
|
530
|
0 |
1 |
uint32_t now = other->expires_at ? (uint32_t)time(NULL) : 0; |
|
532
|
16 |
1 |
for (i = 0; i < other->capacity; i++) { |
|
533
|
1 |
15 |
if (SS_NODE_LIVE(other->nodes[i]) && !HM_TTL_SKIP_EXPIRED(other, i, now)) |
|
|
1 |
0 |
if (SS_NODE_LIVE(other->nodes[i]) && !HM_TTL_SKIP_EXPIRED(other, i, now)) |
|
|
0 |
1 |
if (SS_NODE_LIVE(other->nodes[i]) && !HM_TTL_SKIP_EXPIRED(other, i, now)) |
|
|
0 |
0 |
if (SS_NODE_LIVE(other->nodes[i]) && !HM_TTL_SKIP_EXPIRED(other, i, now)) |
|
|
0 |
0 |
if (SS_NODE_LIVE(other->nodes[i]) && !HM_TTL_SKIP_EXPIRED(other, i, now)) |
|
541
|
6 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
6 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
6 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
6 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
543
|
0 |
6 |
uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0; |
|
545
|
608 |
6 |
for (i = 0; i < self->capacity; i++) { |
|
546
|
243 |
365 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
241 |
2 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
241 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
|
0 |
0 |
if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) { |
|
553
|
241 |
0 |
: newSV(0); |
|
554
|
241 |
0 |
if (self->nodes[i].value && vutf8) SvUTF8_on(val); |
|
|
1 |
240 |
if (self->nodes[i].value && vutf8) SvUTF8_on(val); |
|
555
|
1 |
240 |
(void)hv_store(hv, self->nodes[i].key, kutf8 ? -(I32)klen : (I32)klen, val, 0); |
|
565
|
102 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
102 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
102 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
102 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
566
|
0 |
102 |
EXTRACT_STR_KEY(key_sv); |
|
567
|
0 |
102 |
EXTRACT_STR_VAL(value); |
|
576
|
9 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
9 |
0 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
9 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
|
0 |
9 |
EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv); |
|
577
|
0 |
9 |
EXTRACT_STR_KEY(key_sv); |
|
578
|
0 |
9 |
EXTRACT_STR_VAL(default_sv); |
|
582
|
0 |
9 |
if (idx >= self->capacity) XSRETURN_UNDEF; |
|
583
|
9 |
0 |
if (self->nodes[idx].value) { |
|
585
|
0 |
9 |
if (HM_UNPACK_UTF8(self->nodes[idx].val_len)) SvUTF8_on(RETVAL); |