Branch Coverage

Future.xs
Criterion Covered Total %
branch 341 476 71.6


line true false branch
31 21 1080 if (!*(g->is_freed)) {
79 24 0 if (!ctx_ptr || !*ctx_ptr) return;
0 24 if (!ctx_ptr || !*ctx_ptr) return;
83 20 4 if (ctx->is_freed_ptr) {
87 4 20 if (ctx->shared_cv) {
91 20 4 if (ctx->cvs) {
93 6033 20 for (i = 0; i < ctx->num_cvs; i++) {
94 6023 10 if (ctx->cvs[i]) {
101 24 0 if (ctx->tasks) SvREFCNT_dec((SV*)ctx->tasks);
102 24 0 if (ctx->final_cb) SvREFCNT_dec(ctx->final_cb);
108 6127 0 SvREFCNT_inc_simple_void(cv);
111 2 6125 if (!ctx) {
115 6019 106 if (ctx->cvs) {
119 17 6108 if (--ctx->remaining <= 0) {
121 17 0 if (IS_PVCV(cb)) {
16 1 if (IS_PVCV(cb)) {
16 0 if (IS_PVCV(cb)) {
127 0 16 PUSHMARK(SP);
134 15 0 FREETMPS;
144 31 0 if (!ctx_ptr || !*ctx_ptr) return;
0 31 if (!ctx_ptr || !*ctx_ptr) return;
148 26 5 if (ctx->is_freed_ptr) {
152 8 23 if (ctx->current_cv) {
156 31 0 if (ctx->tasks) SvREFCNT_dec((SV*)ctx->tasks);
157 31 0 if (ctx->final_cb) SvREFCNT_dec(ctx->final_cb);
165 5040 0 SvREFCNT_inc_simple_void(cv);
168 3 5037 if (!ctx) {
172 5031 6 if (!ctx->unsafe) {
174 5031 0 if (ctx->current_cv == cv) {
180 3 5034 if (items > 0 && SvTRUE(ST(0))) {
3 0 if (items > 0 && SvTRUE(ST(0))) {
188 5070 0 if (!ctx_ptr || !*ctx_ptr) return;
0 5070 if (!ctx_ptr || !*ctx_ptr) return;
191 5028 42 if (ctx->running) {
199 5080 10 while (ctx->delayed) {
201 5080 0 SV **task_ary = (AvREAL(ctx->tasks) && !SvMAGICAL(ctx->tasks)) ? AvARRAY(ctx->tasks) : NULL;
5076 4 SV **task_ary = (AvREAL(ctx->tasks) && !SvMAGICAL(ctx->tasks)) ? AvARRAY(ctx->tasks) : NULL;
202 26 5054 if (ctx->current_idx >= ctx->total_tasks) {
204 26 0 if (IS_PVCV(cb)) {
25 1 if (IS_PVCV(cb)) {
25 0 if (IS_PVCV(cb)) {
210 0 25 PUSHMARK(SP);
214 23 0 FREETMPS;
222 0 5051 SV **fetch_ptr = (task_ary && ctx->current_idx <= AvFILL(ctx->tasks))
5051 0 SV **fetch_ptr = (task_ary && ctx->current_idx <= AvFILL(ctx->tasks))
224 5051 3 : av_fetch(ctx->tasks, ctx->current_idx, 0);
225 5054 0 SV *task_sv = fetch_ptr ? *fetch_ptr : NULL;
229 5052 2 if (IS_PVCV(task_sv)) {
5043 9 if (IS_PVCV(task_sv)) {
5043 0 if (IS_PVCV(task_sv)) {
230 5037 6 if (!ctx->unsafe) {
231 0 5037 if (ctx->current_cv) {
238 4 2 } else if (!ctx->current_cv) {
247 5037 6 if (!ctx->unsafe) {
252 0 5043 PUSHMARK(SP);
253 0 5043 XPUSHs(next_rv);
256 6 5037 U32 flags = G_DISCARD | (ctx->unsafe ? 0 : G_EVAL);
259 5037 5 if (!ctx->unsafe) {
261 5037 0 if (SvTRUE(ERRSV)) {
5 5032 if (SvTRUE(ERRSV)) {
262 5 0 SV *err = sv_mortalcopy(ERRSV);
268 5037 0 FREETMPS;
270 0 5037 if (!*ctx_ptr) return;
276 10 0 if (*ctx_ptr) (*ctx_ptr)->running = 0;
280 25 0 if (!ctx_ptr || !*ctx_ptr) return;
0 25 if (!ctx_ptr || !*ctx_ptr) return;
284 21 4 if (ctx->is_freed_ptr) {
288 4 21 if (ctx->shared_cv) {
292 21 4 if (ctx->cvs) {
294 1049 21 for (i = 0; i < ctx->num_cvs; i++) {
295 1037 12 if (ctx->cvs[i]) {
302 25 0 if (ctx->tasks) SvREFCNT_dec((SV*)ctx->tasks);
303 25 0 if (ctx->final_cb) SvREFCNT_dec(ctx->final_cb);
311 1142 0 SvREFCNT_inc_simple_void(cv);
314 2 1140 if (!ctx) {
318 1033 107 if (ctx->cvs) {
324 17 1123 if (--ctx->remaining <= 0) {
326 17 0 if (IS_PVCV(cb)) {
16 1 if (IS_PVCV(cb)) {
16 0 if (IS_PVCV(cb)) {
332 0 16 PUSHMARK(SP);
339 15 0 FREETMPS;
351 1148 0 if (!ctx_ptr || !*ctx_ptr) return;
0 1148 if (!ctx_ptr || !*ctx_ptr) return;
354 1111 37 if (ctx->running) {
366 37 15 while (ctx->delayed) {
369 1171 0 while (!is_freed && ctx->active < ctx->limit && ctx->current_idx < ctx->total_tasks) {
1160 11 while (!is_freed && ctx->active < ctx->limit && ctx->current_idx < ctx->total_tasks) {
1156 4 while (!is_freed && ctx->active < ctx->limit && ctx->current_idx < ctx->total_tasks) {
370 1156 0 SV **task_ary = (AvREAL(ctx->tasks) && !SvMAGICAL(ctx->tasks)) ? AvARRAY(ctx->tasks) : NULL;
1153 3 SV **task_ary = (AvREAL(ctx->tasks) && !SvMAGICAL(ctx->tasks)) ? AvARRAY(ctx->tasks) : NULL;
371 0 1153 SV **fetch_ptr = (task_ary && ctx->current_idx <= AvFILL(ctx->tasks))
1153 0 SV **fetch_ptr = (task_ary && ctx->current_idx <= AvFILL(ctx->tasks))
373 1153 3 : av_fetch(ctx->tasks, ctx->current_idx, 0);
374 1156 0 SV *task_sv = fetch_ptr ? *fetch_ptr : NULL;
378 1154 2 if (IS_PVCV(task_sv)) {
1144 10 if (IS_PVCV(task_sv)) {
1144 0 if (IS_PVCV(task_sv)) {
383 1037 107 if (!ctx->unsafe) {
394 1037 107 if (!ctx->unsafe) {
399 0 1144 PUSHMARK(SP);
400 0 1144 XPUSHs(done_rv);
403 107 1037 U32 flags = G_DISCARD | (task_unsafe ? 0 : G_EVAL);
406 1037 106 if (!task_unsafe) {
408 1037 0 if (SvTRUE(ERRSV)) {
5 1032 if (SvTRUE(ERRSV)) {
409 5 0 SV *err = sv_mortalcopy(ERRSV);
410 4 1 if (!is_freed) {
413 5 0 if (old_is_freed_ptr) *old_is_freed_ptr = 1;
418 1138 0 FREETMPS;
420 12 1126 if (is_freed) goto done;
422 4 8 if (--ctx->remaining <= 0) {
424 4 0 if (IS_PVCV(cb)) {
4 0 if (IS_PVCV(cb)) {
4 0 if (IS_PVCV(cb)) {
430 0 4 PUSHMARK(SP);
433 4 0 if (old_is_freed_ptr) *old_is_freed_ptr = 1;
435 3 0 FREETMPS;
439 0 0 if (old_is_freed_ptr) *old_is_freed_ptr = 1;
448 0 15 if (!is_freed) {
453 15 15 if (is_freed && old_is_freed_ptr) {
15 0 if (is_freed && old_is_freed_ptr) {
459 1018 0 if (!ctx_ptr || !*ctx_ptr) return;
0 1018 if (!ctx_ptr || !*ctx_ptr) return;
463 1013 5 if (ctx->is_freed_ptr) {
467 4 1014 if (ctx->shared_cv) {
471 1014 4 if (ctx->cvs) {
473 2026 1014 for (i = 0; i < ctx->num_cvs; i++) {
474 1017 1009 if (ctx->cvs[i]) {
481 1018 0 if (ctx->tasks) SvREFCNT_dec((SV*)ctx->tasks);
482 1018 0 if (ctx->final_cb) SvREFCNT_dec(ctx->final_cb);
488 1019 0 SvREFCNT_inc_simple_void(cv);
491 1014 5 if (!ctx || ctx->settled) {
0 1014 if (!ctx || ctx->settled) {
496 1010 4 if (ctx->cvs) {
501 1014 0 if (IS_PVCV(cb)) {
1013 1 if (IS_PVCV(cb)) {
1013 0 if (IS_PVCV(cb)) {
508 0 1013 PUSHMARK(SP);
509 1013 1013 for (I32 i = 0; i < items; i++) {
510 0 1013 XPUSHs(sv_mortalcopy(ST(i)));
518 1012 0 FREETMPS;
531 0 8 I_EV_API ("EV::Future");
8 0 I_EV_API ("EV::Future");
0 8 I_EV_API ("EV::Future");
539 4 22 if (items > 2 && SvTRUE(ST(2))) unsafe = 1;
4 0 if (items > 2 && SvTRUE(ST(2))) unsafe = 1;
542 1 25 if (len <= 0) {
543 1 0 if (IS_PVCV(final_cb)) {
1 0 if (IS_PVCV(final_cb)) {
1 0 if (IS_PVCV(final_cb)) {
547 0 1 PUSHMARK(SP);
550 0 1 FREETMPS;
578 4 21 if (unsafe) {
590 4 21 U32 flags = G_DISCARD | (unsafe ? 0 : G_EVAL);
592 6141 16 for (i = 0; i < len; i++) {
593 0 6141 if (*is_freed) break;
595 6141 0 SV **task_ary = (AvREAL(tasks) && !SvMAGICAL(tasks)) ? AvARRAY(tasks) : NULL;
6138 3 SV **task_ary = (AvREAL(tasks) && !SvMAGICAL(tasks)) ? AvARRAY(tasks) : NULL;
596 0 6138 SV **fetch_ptr = (task_ary && i <= AvFILL(tasks))
6137 1 SV **fetch_ptr = (task_ary && i <= AvFILL(tasks))
598 6138 3 : av_fetch(tasks, i, 0);
599 6140 1 SV *task_sv = fetch_ptr ? *fetch_ptr : NULL;
601 6138 3 if (IS_PVCV(task_sv)) {
6130 8 if (IS_PVCV(task_sv)) {
6130 0 if (IS_PVCV(task_sv)) {
603 6024 106 if (!unsafe) {
611 6024 106 if (!unsafe) {
614 0 6130 PUSHMARK(SP);
615 0 6130 XPUSHs(done_rv);
620 6024 105 if (!unsafe) {
621 6024 0 if (SvTRUE(ERRSV)) {
4 6020 if (SvTRUE(ERRSV)) {
622 4 0 SV *err = sv_mortalcopy(ERRSV);
623 3 1 if (!*is_freed) {
630 6020 105 FREETMPS;
633 4 7 if (--ctx->remaining <= 0) {
635 4 0 if (IS_PVCV(cb)) {
4 0 if (IS_PVCV(cb)) {
4 0 if (IS_PVCV(cb)) {
640 0 4 PUSHMARK(SP);
644 3 0 FREETMPS;
661 4 30 if (items > 2 && SvTRUE(ST(2))) unsafe = 1;
4 0 if (items > 2 && SvTRUE(ST(2))) unsafe = 1;
664 1 33 if (len <= 0) {
665 1 0 if (IS_PVCV(final_cb)) {
1 0 if (IS_PVCV(final_cb)) {
1 0 if (IS_PVCV(final_cb)) {
669 0 1 PUSHMARK(SP);
672 0 1 FREETMPS;
712 4 22 if (items > 3 && SvTRUE(ST(3))) unsafe = 1;
4 0 if (items > 3 && SvTRUE(ST(3))) unsafe = 1;
715 1 25 if (len <= 0) {
716 1 0 if (IS_PVCV(final_cb)) {
1 0 if (IS_PVCV(final_cb)) {
1 0 if (IS_PVCV(final_cb)) {
720 0 1 PUSHMARK(SP);
723 0 1 FREETMPS;
729 1 24 if (limit < 1) limit = 1;
730 9 16 if (limit > len) limit = len;
760 4 21 if (unsafe) {
778 4 1016 if (items > 2 && SvTRUE(ST(2))) unsafe = 1;
4 0 if (items > 2 && SvTRUE(ST(2))) unsafe = 1;
781 2 1018 if (len <= 0) {
782 2 0 if (IS_PVCV(final_cb)) {
1 1 if (IS_PVCV(final_cb)) {
1 0 if (IS_PVCV(final_cb)) {
786 0 1 PUSHMARK(SP);
789 0 1 FREETMPS;
817 4 1014 if (unsafe) {
829 4 1014 U32 flags = G_DISCARD | (unsafe ? 0 : G_EVAL);
831 2029 8 for (i = 0; i < len; i++) {
832 1025 1004 if (*is_freed || ctx->settled) break;
1025 0 if (*is_freed || ctx->settled) break;
834 1025 0 SV **task_ary = (AvREAL(tasks) && !SvMAGICAL(tasks)) ? AvARRAY(tasks) : NULL;
1025 0 SV **task_ary = (AvREAL(tasks) && !SvMAGICAL(tasks)) ? AvARRAY(tasks) : NULL;
835 0 1025 SV **fetch_ptr = (task_ary && i <= AvFILL(tasks))
1025 0 SV **fetch_ptr = (task_ary && i <= AvFILL(tasks))
837 1025 0 : av_fetch(tasks, i, 0);
838 1025 0 SV *task_sv = fetch_ptr ? *fetch_ptr : NULL;
840 1024 1 if (IS_PVCV(task_sv)) {
1023 1 if (IS_PVCV(task_sv)) {
1023 0 if (IS_PVCV(task_sv)) {
842 1017 6 if (!unsafe) {
850 1017 6 if (!unsafe) {
853 0 1023 PUSHMARK(SP);
854 0 1023 XPUSHs(done_rv);
859 1017 5 if (!unsafe) {
860 1017 0 if (SvTRUE(ERRSV)) {
3 1014 if (SvTRUE(ERRSV)) {
861 3 0 SV *err = sv_mortalcopy(ERRSV);
862 2 1 if (!*is_freed) {
869 1014 5 FREETMPS;
874 2 0 if (IS_PVCV(cb)) {
2 0 if (IS_PVCV(cb)) {
2 0 if (IS_PVCV(cb)) {
879 0 2 PUSHMARK(SP);
883 2 0 FREETMPS;