Branch Coverage

xs/ss.xsi
Criterion Covered Total %
branch 281 706 39.8


line true false branch
7 12 60 EXTRACT_NEW_ARGS(_max_size, _ttl, _lru_skip);
8 64 EXTRACT_NEW_ARGS(_max_size, _ttl, _lru_skip);
1 71 EXTRACT_NEW_ARGS(_max_size, _ttl, _lru_skip);
9 0 72 if (!map) croak("Failed to create HashMap::SS");
17 74 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
74 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 74 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 74 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
24 82368 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
82368 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 82368 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 82368 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
25 0 82368 EXTRACT_STR_KEY(key_sv);
26 0 82368 EXTRACT_STR_VAL(value);
35 50034 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
50034 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 50034 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 50034 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
36 0 50034 EXTRACT_STR_KEY(key_sv);
40 6 50028 if (!hashmap_ss_get(self, _kstr, (uint32_t)_klen, _khash, _kutf8, &val, &val_len, &val_utf8))
43 4 50024 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, _kutf8, &val, &val_len, &val_utf8))
64 80509 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
80509 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 80509 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 80509 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
65 0 80509 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, _kutf8, &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 17 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
17 0 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 17 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
0 17 EXTRACT_MAP(HashMapSS, stash_ss, "Data::HashMap::SS", self_sv);
96 0 17 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 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);
128 0 5 uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0;
129 0 5 EXTEND(SP, self->size);
131 560 5 for (i = 0; i < self->capacity; i++) {
132 207 353 if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) {
204 3 if (SS_NODE_LIVE(self->nodes[i]) && !HM_TTL_SKIP_EXPIRED(self, i, now)) {
0 204 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 1 203 if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(sv);
136 0 204 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); }
242 0 3 if (HM_UNLIKELY(self->lru_prev)) hashmap_ss_lru_unlink(self, (uint32_t)i);
247 0 2 if (self->iter_pos >= self->capacity) self->iter_pos = 0;
248 2 0 if (self->tombstones > self->capacity / 4 ||
249 1 1 (self->size > 0 && self->tombstones > self->size))
0 1 (self->size > 0 && self->tombstones > self->size))
255 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);
256 0 1 uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0;
257 1 0 if (self->lru_prev) {
258 1 0 while (self->lru_tail != HM_LRU_NONE) {
260 0 1 if (HM_UNLIKELY(self->expires_at && self->expires_at[idx]) && now >= self->expires_at[idx]) {
0 0 if (HM_UNLIKELY(self->expires_at && self->expires_at[idx]) && now >= self->expires_at[idx]) {
0 0 if (HM_UNLIKELY(self->expires_at && self->expires_at[idx]) && now >= self->expires_at[idx]) {
263 0 1 EXTEND(SP, 2);
266 0 1 if (HM_UNPACK_UTF8(self->nodes[idx].key_len)) SvUTF8_on(ksv);
267 0 1 mXPUSHs(ksv);
269 1 0 if (self->nodes[idx].value) {
271 0 1 if (HM_UNPACK_UTF8(self->nodes[idx].val_len)) SvUTF8_on(sv);
272 0 1 mXPUSHs(sv);
273 0 0 } else { XPUSHs(&PL_sv_undef); }
278 1 0 if (self->tombstones > self->capacity / 4 ||
279 1 0 (self->size > 0 && self->tombstones > self->size))
0 1 (self->size > 0 && self->tombstones > self->size))
285 0 0 while (self->iter_pos < self->capacity) {
287 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)) {
288 0 0 EXTEND(SP, 2);
291 0 0 if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(ksv);
292 0 0 mXPUSHs(ksv);
294 0 0 if (self->nodes[i].value) {
296 0 0 if (HM_UNPACK_UTF8(self->nodes[i].val_len)) SvUTF8_on(sv);
297 0 0 mXPUSHs(sv);
298 0 0 } else { XPUSHs(&PL_sv_undef); }
302 0 0 if (self->tombstones > self->capacity / 4 ||
303 0 0 (self->size > 0 && self->tombstones > self->size))
0 0 (self->size > 0 && self->tombstones > self->size))
315 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);
316 0 0 uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0;
317 0 0 if (self->lru_prev) {
318 0 0 while (self->lru_head != HM_LRU_NONE) {
320 0 0 if (HM_UNLIKELY(self->expires_at && self->expires_at[idx]) && now >= self->expires_at[idx]) {
0 0 if (HM_UNLIKELY(self->expires_at && self->expires_at[idx]) && now >= self->expires_at[idx]) {
0 0 if (HM_UNLIKELY(self->expires_at && self->expires_at[idx]) && now >= self->expires_at[idx]) {
323 0 0 EXTEND(SP, 2);
326 0 0 if (HM_UNPACK_UTF8(self->nodes[idx].key_len)) SvUTF8_on(ksv);
327 0 0 mXPUSHs(ksv);
329 0 0 if (self->nodes[idx].value) {
331 0 0 if (HM_UNPACK_UTF8(self->nodes[idx].val_len)) SvUTF8_on(sv);
332 0 0 mXPUSHs(sv);
333 0 0 } else { XPUSHs(&PL_sv_undef); }
338 0 0 if (self->tombstones > self->capacity / 4 ||
339 0 0 (self->size > 0 && self->tombstones > self->size))
0 0 (self->size > 0 && self->tombstones > self->size))
345 0 0 if (self->iter_pos == 0) self->iter_pos = self->capacity;
346 0 0 while (self->iter_pos > 0) {
348 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)) {
349 0 0 EXTEND(SP, 2);
352 0 0 if (HM_UNPACK_UTF8(self->nodes[i].key_len)) SvUTF8_on(ksv);
353 0 0 mXPUSHs(ksv);
355 0 0 if (self->nodes[i].value) {
357 0 0 if (HM_UNPACK_UTF8(self->nodes[i].val_len)) SvUTF8_on(sv);
358 0 0 mXPUSHs(sv);
359 0 0 } else { XPUSHs(&PL_sv_undef); }
363 0 0 if (self->tombstones > self->capacity / 4 ||
364 0 0 (self->size > 0 && self->tombstones > self->size))
0 0 (self->size > 0 && self->tombstones > self->size))
376 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);
382 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);
383 0 0 if (!hashmap_ss_reserve(self, (size_t)count))
389 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);
395 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);
396 0 2 uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0;
411 32 2 for (i = 0; i < self->capacity; i++) {
412 3 29 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)) {
422 3 0 if (self->nodes[i].value) sv_catpvn(buf, self->nodes[i].value, vl);
425 0 3 if (self->expires_at && self->expires_at[i] && self->expires_at[i] > now)
0 0 if (self->expires_at && self->expires_at[i] && self->expires_at[i] > now)
0 0 if (self->expires_at && self->expires_at[i] && self->expires_at[i] > now)
445 1 0 if (dlen < 22 || memcmp(p, "DHMP", 4) != 0) croak("Invalid freeze data");
0 1 if (dlen < 22 || memcmp(p, "DHMP", 4) != 0) croak("Invalid freeze data");
447 0 1 uint8_t ver = *p++; if (ver != 1) croak("Unsupported freeze version %d", ver);
448 0 1 uint8_t vid = *p++; if (vid != 4) croak("Variant mismatch: expected 4, got %d", vid);
454 0 1 if (!map) croak("Failed to create map for thaw");
455 1 0 if (cnt > 0) hashmap_ss_reserve(map, (size_t)cnt);
457 2 1 for (j = 0; j < cnt; j++) {
458 0 2 if (p + 14 > end) { hashmap_ss_destroy(map); croak("Truncated freeze data"); }
461 0 2 if (p + kl + 5 > end) { hashmap_ss_destroy(map); croak("Truncated freeze data"); }
466 0 2 if (p + vl + 4 > end) { hashmap_ss_destroy(map); croak("Truncated freeze data"); }
472 0 1 if (p > end) croak("Truncated freeze data");
481 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);
482 0 0 RETVAL = (UV)self->capacity;
489 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);
490 0 1 EXTRACT_STR_KEY(key_sv);
498 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);
499 0 2 EXTRACT_STR_KEY(key_sv);
502 1 1 if (!hashmap_ss_swap(self, _kstr, (uint32_t)_klen, _khash, _kutf8, _nvs, (uint32_t)_nvl, _nvu, &old, &old_len, &old_utf8)) XSRETURN_UNDEF;
504 0 1 if (old_utf8) SvUTF8_on(RETVAL);
513 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);
515 0 1 if (!clone) croak("Failed to clone");
516 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);
523 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);
524 1 0 if (!SvROK(href) || SvTYPE(SvRV(href)) != SVt_PVHV)
0 1 if (!SvROK(href) || SvTYPE(SvRV(href)) != SVt_PVHV)
527 0 1 hashmap_ss_reserve(self, (size_t)HvUSEDKEYS(hv));
530 2 1 while ((he = hv_iternext(hv))) {
531 0 2 STRLEN klen; const char* kstr = HePV(he, klen);
532 0 2 bool kutf8 = HeUTF8(he) ? true : false;
542 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);
543 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)
547 0 1 uint32_t now = other->expires_at ? (uint32_t)time(NULL) : 0;
549 16 1 for (i = 0; i < other->capacity; i++) {
550 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))
558 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);
560 0 6 uint32_t now = self->expires_at ? (uint32_t)time(NULL) : 0;
562 608 6 for (i = 0; i < self->capacity; i++) {
563 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)) {
570 241 0 : newSV(0);
571 241 0 if (self->nodes[i].value && vutf8) SvUTF8_on(val);
1 240 if (self->nodes[i].value && vutf8) SvUTF8_on(val);
572 1 240 (void)hv_store(hv, self->nodes[i].key, kutf8 ? -(I32)klen : (I32)klen, val, 0);
582 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);
583 0 102 EXTRACT_STR_KEY(key_sv);
584 0 102 EXTRACT_STR_VAL(value);
593 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);
594 0 9 EXTRACT_STR_KEY(key_sv);
595 0 9 EXTRACT_STR_VAL(default_sv);
600 0 9 if (idx >= self->capacity) XSRETURN_UNDEF;
601 9 0 if (self->nodes[idx].value) {
603 0 9 if (HM_UNPACK_UTF8(self->nodes[idx].val_len)) SvUTF8_on(RETVAL);