Branch Coverage

Cache.c
Criterion Covered Total %
branch 161 280 57.5


line true false branch
115 0 30537 if (UNLIKELY(!SvROK(obj))) croak("Not a reference");
117 30537 0 if (LIKELY(mg != NULL))
127 4567 1215 if (c->freelist && c->freelist->alloc_klen >= klen) {
4537 30 if (c->freelist && c->freelist->alloc_klen >= klen) {
141 4851 0 if (e->value) {
145 4851 0 if (c->freelist_count < LRU_FREELIST_MAX) {
158 938 5 if (LIKELY(e->prev != NULL))
163 6 937 if (LIKELY(e->next != NULL))
174 5572 309 if (LIKELY(c->head != NULL))
177 309 5572 if (UNLIKELY(c->tail == NULL))
182 10865 99 if (LIKELY(e == c->head)) return; /* already MRU — fast path */
196 17197 9804 while (e) {
197 16784 413 if (e->hash == hash
198 16784 0 && e->klen == (U32)klen
199 16784 0 && memcmp(e->key, kpv, klen) == 0)
216 835 0 while (*pp) {
217 586 249 if (*pp == e) {
232 335 250 while (*pp) {
234 258 77 if (e->hash == hash
235 258 0 && e->klen == (U32)klen
236 258 0 && memcmp(e->key, kpv, klen) == 0) {
255 0 1 Newxz(new_buckets, new_count, LRUEntry*);
258 96 1 for (e = c->head; e; e = e->next) {
288 0 586 if (UNLIKELY(!victim)) return;
305 6563 0 PERL_HASH(hash, kpv, klen);
307 5560 1003 if (LIKELY(e != NULL)) {
319 2403 0 PERL_HASH(hash, kpv, klen);
321 2403 0 if (LIKELY(e != NULL))
331 11186 0 PERL_HASH(hash, kpv, klen);
334 5404 5782 if (e) {
340 586 5196 if (c->size >= c->capacity)
344 1 5781 if (UNLIKELY(c->size >= c->rehash_threshold))
366 6436 0 PERL_HASH(hash, kpv, klen);
382 0 0 PUSHs(val ? val : &PL_sv_undef);
405 0 0 PUSHs(lru_exists_internal(aTHX_ c, kpv, klen) ? &PL_sv_yes : &PL_sv_no);
422 1428 1001 SETs(val ? val : &PL_sv_undef);
448 1401 1003 SETs(lru_exists_internal(aTHX_ c, kpv, klen) ? &PL_sv_yes : &PL_sv_no);
461 1402 0 SETs(val ? val : &PL_sv_undef);
476 402 0 PERL_HASH(hash, kpv, klen);
480 202 200 if (e) {
498 2 1 if (c->tail) {
500 0 2 XPUSHs(c->tail->value);
512 1 1 if (c->head) {
514 0 1 XPUSHs(c->head->value);
528 0 150 if (!op) return FALSE;
529 3 147 if (op->op_type == OP_RV2SV) {
531 3 0 if (gvop && gvop->op_type == OP_GV) {
3 0 if (gvop && gvop->op_type == OP_GV) {
533 3 0 if (gv && GvNAMELEN(gv) == 1 && GvNAME(gv)[0] == '_')
3 0 if (gv && GvNAMELEN(gv) == 1 && GvNAME(gv)[0] == '_')
3 0 if (gv && GvNAMELEN(gv) == 1 && GvNAME(gv)[0] == '_')
549 38 0 if (!OpHAS_SIBLING(pushop))
552 38 0 cacheop = OpSIBLING(pushop);
553 0 38 if (!cacheop) return entersubop;
555 38 0 keyop = OpSIBLING(cacheop);
556 0 38 if (!keyop) return entersubop;
558 38 0 cvop = OpSIBLING(keyop);
559 0 38 if (!cvop) return entersubop;
561 38 0 if (OpSIBLING(keyop) != cvop) return entersubop;
0 38 if (OpSIBLING(keyop) != cvop) return entersubop;
588 23 0 if (!OpHAS_SIBLING(pushop))
591 23 0 cacheop = OpSIBLING(pushop);
592 0 23 if (!cacheop) return entersubop;
594 23 0 keyop = OpSIBLING(cacheop);
595 0 23 if (!keyop) return entersubop;
597 23 0 valop = OpSIBLING(keyop);
598 0 23 if (!valop) return entersubop;
600 23 0 cvop = OpSIBLING(valop);
601 0 23 if (!cvop) return entersubop;
603 23 0 if (OpSIBLING(valop) != cvop) return entersubop;
0 23 if (OpSIBLING(valop) != cvop) return entersubop;
606 0 23 lru_op_is_dollar_underscore(aTHX_ keyop) ||
634 5 0 if (!OpHAS_SIBLING(pushop))
637 5 0 cacheop = OpSIBLING(pushop);
638 0 5 if (!cacheop) return entersubop;
640 5 0 cvop = OpSIBLING(cacheop);
641 0 5 if (!cvop) return entersubop;
643 5 0 if (OpSIBLING(cacheop) != cvop) return entersubop;
0 5 if (OpSIBLING(cacheop) != cvop) return entersubop;
645 0 5 if (lru_op_is_dollar_underscore(aTHX_ cacheop))
734 0 6 if (items != 2) croak("Usage: lru_get($cache, $key)");
740 6 0 if (val) { ST(0) = val; XSRETURN(1); }
747 0 0 if (items != 3) croak("Usage: lru_set($cache, $key, $value)");
760 0 4 if (items != 2) croak("Usage: lru_exists($cache, $key)");
765 2 2 if (lru_exists_internal(aTHX_ c, kpv, klen)) XSRETURN_YES;
772 0 0 if (items != 2) croak("Usage: lru_peek($cache, $key)");
778 0 0 if (val) { ST(0) = val; XSRETURN(1); }
786 0 0 if (items != 2) croak("Usage: lru_delete($cache, $key)");
794 0 0 PERL_HASH(hash, kpv, klen);
796 0 0 if (e) {
811 0 0 if (items != 1) croak("Usage: lru_oldest($cache)");
815 0 0 if (c->tail) {
816 0 0 EXTEND(SP, 2);
827 0 0 if (items != 1) croak("Usage: lru_newest($cache)");
831 0 0 if (c->head) {
832 0 0 EXTEND(SP, 2);
850 12 0 pkg = CopSTASHPV(PL_curcop);
12 0 pkg = CopSTASHPV(PL_curcop);
12 0 pkg = CopSTASHPV(PL_curcop);
0 12 pkg = CopSTASHPV(PL_curcop);
0 0 pkg = CopSTASHPV(PL_curcop);
12 0 pkg = CopSTASHPV(PL_curcop);
0 12 pkg = CopSTASHPV(PL_curcop);
852 6 12 for (i = 1; i < items; i++) {
855 6 0 if (len == 6 && strEQ(arg, "import")) {
6 0 if (len == 6 && strEQ(arg, "import")) {
860 6 6 if (want_import) {
883 931 115 for (e = c->head; e; e = next) {
885 931 0 if (e->value) SvREFCNT_dec(e->value);
890 314 115 for (e = c->freelist; e; e = next) {
910 115 0 if (items < 1 || items > 2)
0 115 if (items < 1 || items > 2)
913 26 89 capacity = SvIV(items == 2 ? ST(1) : ST(0));
914 0 115 if (capacity < 1) croak("Capacity must be positive");
924 0 115 Newxz(c->buckets, c->bucket_count, LRUEntry*);
944 0 9110 if (items != 3) croak("Usage: $cache->set($key, $value)");
956 0 4128 if (items != 2) croak("Usage: $cache->get($key)");
962 4126 2 if (val) {
972 0 1001 if (items != 2) croak("Usage: $cache->peek($key)");
978 1001 0 if (val) {
988 0 4028 if (items != 2) croak("Usage: $cache->exists($key)");
993 2014 2014 if (lru_exists_internal(aTHX_ c, kpv, klen))
1002 0 106 if (items != 2) croak("Usage: $cache->delete($key)");
1010 106 0 PERL_HASH(hash, kpv, klen);
1012 56 50 if (e) {
1027 0 2011 if (items != 1) croak("Usage: $cache->size");
1036 0 1002 if (items != 1) croak("Usage: $cache->capacity");
1046 0 203 if (items != 1) croak("Usage: $cache->clear");
1051 4007 203 while (e) {
1057 0 203 Zero(c->buckets, c->bucket_count, LRUEntry*);
1067 0 203 if (items != 1) croak("Usage: $cache->keys");
1072 203 0 EXTEND(SP, c->size);
0 203 EXTEND(SP, c->size);
1073 4009 203 for (e = c->head; e; e = e->next)
1081 0 8 if (items != 1) croak("Usage: $cache->oldest");
1085 6 2 if (c->tail) {
1086 0 6 EXTEND(SP, 2);
1097 0 9 if (items != 1) croak("Usage: $cache->newest");
1101 7 2 if (c->head) {
1102 0 7 EXTEND(SP, 2);