Branch Coverage

XS.xs
Criterion Covered Total %
branch 223 374 59.6


line true false branch
235 0 1616 ASSUME(origin->state == XSPR_STATE_FINISHED);
237 765 851 if (callback->type == XSPR_CALLBACK_CHAIN) {
240 2 849 } else if (callback->type == XSPR_CALLBACK_FINALLY_CHAIN) {
243 1 1 RESULT_IS_REJECTED(origin->finished.result) ? origin->finished.result : callback->finally_chain.original_result
246 28 821 } else if (callback->type == XSPR_CALLBACK_PERL || callback->type == XSPR_CALLBACK_FINALLY) {
11 17 } else if (callback->type == XSPR_CALLBACK_PERL || callback->type == XSPR_CALLBACK_FINALLY) {
250 11 821 if (callback->type == XSPR_CALLBACK_FINALLY) {
256 11 0 if (callback_fn && SvOK(callback_fn)) {
11 0 if (callback_fn && SvOK(callback_fn)) {
262 796 25 if (RESULT_IS_RESOLVED(origin->finished.result)) {
264 25 0 } else if (RESULT_IS_REJECTED(origin->finished.result)) {
267 25 0 if (callback_fn && SvOK(callback_fn)) {
25 0 if (callback_fn && SvOK(callback_fn)) {
277 832 0 if (callback_fn != NULL) {
280 11 821 if (callback->type == XSPR_CALLBACK_FINALLY) {
291 41 791 if (next_promise == NULL) {
292 1 40 if (callback->type == XSPR_CALLBACK_FINALLY && RESULT_IS_RESOLVED(callback_result) && RESULT_IS_REJECTED(origin->finished.result)) {
1 0 if (callback->type == XSPR_CALLBACK_FINALLY && RESULT_IS_RESOLVED(callback_result) && RESULT_IS_REJECTED(origin->finished.result)) {
1 0 if (callback->type == XSPR_CALLBACK_FINALLY && RESULT_IS_RESOLVED(callback_result) && RESULT_IS_REJECTED(origin->finished.result)) {
307 783 8 if (callback_result->count > 0 && callback_result->state == XSPR_RESULT_RESOLVED) {
778 5 if (callback_result->count > 0 && callback_result->state == XSPR_RESULT_RESOLVED) {
310 769 9 if (promise != NULL) {
312 2 767 if (callback_result->count > 1) {
315 0 767 else if (promise == next_promise) {
331 2 765 if (callback->type == XSPR_CALLBACK_FINALLY) {
345 24 767 if (finish_promise) {
349 8 16 if ((callback->type == XSPR_CALLBACK_FINALLY) && RESULT_IS_RESOLVED(callback_result)) {
7 1 if ((callback->type == XSPR_CALLBACK_FINALLY) && RESULT_IS_RESOLVED(callback_result)) {
352 4 3 if (RESULT_IS_REJECTED(final_result)) {
371 4 20 if (final_result_needs_decref) {
379 0 0 } else if (next_promise) {
385 17 0 } else if (callback->type == XSPR_CALLBACK_ALL) {
389 4 13 if (state->done) {
391 3 1 if (RESULT_IS_REJECTED(origin->finished.result)) {
394 8 5 } else if (RESULT_IS_RESOLVED(origin->finished.result)) {
398 12 8 for (i = 0; i < (unsigned)origin->finished.result->count; i++) {
404 4 4 if (state->remaining == 0) {
409 0 5 ASSUME(RESULT_IS_REJECTED(origin->finished.result));
430 765 858 if (callback->type == XSPR_CALLBACK_CHAIN) {
433 824 34 } else if (callback->type == XSPR_CALLBACK_PERL) {
436 784 40 if (callback->perl.next != NULL)
439 14 20 } else if (callback->type == XSPR_CALLBACK_FINALLY) {
441 13 1 if (callback->finally.next != NULL)
444 2 18 } else if (callback->type == XSPR_CALLBACK_FINALLY_CHAIN) {
448 18 0 } else if (callback->type == XSPR_CALLBACK_ALL) {
463 0 0 if (MY_CXT.in_flush) {
470 0 0 while (MY_CXT.queue_head != NULL) {
481 0 0 if (cur->next == NULL) {
507 0 0 if (MY_CXT.queue_head == NULL) {
508 0 0 ASSUME(MY_CXT.queue_tail == NULL);
514 0 0 ASSUME(MY_CXT.queue_tail != NULL);
528 0 0 PUSHMARK(SP);
530 0 0 if (maybe_arg0) {
531 0 0 EXTEND(SP, 2);
535 0 0 EXTEND(SP, 1);
543 0 0 FREETMPS;
557 0 11 PUSHMARK(SP);
558 0 11 EXTEND(SP, argscount);
561 11 11 for (i=0; i
569 11 0 FREETMPS;
578 0 0 if (MY_CXT.queue_head == NULL || MY_CXT.backend_scheduled || MY_CXT.in_flush) {
0 0 if (MY_CXT.queue_head == NULL || MY_CXT.backend_scheduled || MY_CXT.in_flush) {
0 0 if (MY_CXT.queue_head == NULL || MY_CXT.backend_scheduled || MY_CXT.in_flush) {
585 0 0 if (!MY_CXT.pxs_flush_cr) {
588 0 0 if (method_gv != NULL && isGV(method_gv) && GvCV(method_gv) != NULL) {
0 0 if (method_gv != NULL && isGV(method_gv) && GvCV(method_gv) != NULL) {
0 0 if (method_gv != NULL && isGV(method_gv) && GvCV(method_gv) != NULL) {
606 0 833 if (!SvROK(perl_fn)) {
613 0 833 PUSHMARK(SP);
614 0 833 EXTEND(SP, input_count);
615 838 833 for (i = 0; i < input_count; i++) {
628 833 0 if (SvTRUE(ERRSV)) {
6 827 if (SvTRUE(ERRSV)) {
630 6 0 result->results[0] = newSVsv(ERRSV);
633 815 827 for (i = 0; i < count; i++) {
639 833 0 FREETMPS;
654 1678 1629 if (--(result->refs) == 0) {
655 46 1632 if (RESULT_IS_REJECTED(result) && result->rejection_should_warn) {
11 35 if (RESULT_IS_REJECTED(result) && result->rejection_should_warn) {
665 1682 1678 for (i = 0; i < result->count; i++) {
696 0 1629 ASSUME(promise->state == XSPR_STATE_PENDING);
707 0 1629 if (promise->on_ready_immediate != NULL) {
715 28 1629 for (i = 0; i < count; i++) {
719 14 14 if (pending_callbacks[i]->type == XSPR_CALLBACK_PERL && RESULT_IS_REJECTED(result) && result->rejection_should_warn) {
8 6 if (pending_callbacks[i]->type == XSPR_CALLBACK_PERL && RESULT_IS_REJECTED(result) && result->rejection_should_warn) {
6 2 if (pending_callbacks[i]->type == XSPR_CALLBACK_PERL && RESULT_IS_REJECTED(result) && result->rejection_should_warn) {
721 6 0 if (on_reject && SvOK(on_reject)) {
6 0 if (on_reject && SvOK(on_reject)) {
726 0 28 if (MY_CXT.deferral_cr) {
734 0 1629 if (promise->self_sv_ref != NULL) {
742 0 0 if (!SvWEAKREF(promise->self_sv_ref)) {
750 0 1629 if (MY_CXT.deferral_cr) {
775 14 12 for (i=0; icount; i++) {
798 1645 2408 if (--(promise->refs) == 0) {
799 16 1629 if (promise->state == XSPR_STATE_PENDING) {
804 7 16 for (i = 0; i < count; i++) {
809 1629 0 } else if (promise->state == XSPR_STATE_FINISHED) {
816 0 1645 if (promise->on_ready_immediate != NULL) {
843 799 25 if (SvOK(on_resolve))
845 36 788 if (SvOK(on_reject))
848 784 40 if (next)
858 14 0 if (SvOK(on_finally))
861 13 1 if (next)
899 12 6 for (i = 0; i < state->total; i++) {
911 11 18 if (state->refs == 0) {
914 22 11 for (i = 0; i < state->total; i++) {
915 12 10 if (state->results[i]) SvREFCNT_dec(state->results[i]);
927 0 11 if (g->state) pxs_all_state_decref(aTHX_ g->state);
928 0 11 if (g->output) xspr_promise_decref(aTHX_ g->output);
935 0 18 if (g->callback) xspr_callback_free(aTHX_ g->callback);
954 35 1588 if (promise->state == XSPR_STATE_PENDING) {
959 1588 0 } else if (promise->state == XSPR_STATE_FINISHED) {
961 0 1588 if (MY_CXT.deferral_cr) {
976 800 0 if (input == NULL || !sv_isobject(input)) {
13 787 if (input == NULL || !sv_isobject(input)) {
981 786 1 if (sv_derived_from(input, PROMISE_CLASS)) {
990 1 0 if (method_gv != NULL && isGV(method_gv) && GvCV(method_gv) != NULL) {
1 0 if (method_gv != NULL && isGV(method_gv) && GvCV(method_gv) != NULL) {
1 0 if (method_gv != NULL && isGV(method_gv) && GvCV(method_gv) != NULL) {
993 0 1 if (!converter_cv) croak("Need " CONVERTER_CR_NAME "!");
999 1 0 if (new_result->state == XSPR_RESULT_RESOLVED &&
1000 1 0 new_result->results != NULL &&
1001 1 0 new_result->count == 1 &&
1053 1645 0 if (dml_svgv) {
1057 1645 0 promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0;
4 1641 promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0;
1064 797 41 if (GIMME_V != G_VOID) {
1086 5 1686 if (promise->detect_leak_pid && PXS_IS_GLOBAL_DESTRUCTION && promise->detect_leak_pid == getpid()) {
3 2 if (promise->detect_leak_pid && PXS_IS_GLOBAL_DESTRUCTION && promise->detect_leak_pid == getpid()) {
2 1 if (promise->detect_leak_pid && PXS_IS_GLOBAL_DESTRUCTION && promise->detect_leak_pid == getpid()) {
1095 3 3 HV *stash = (self_sv == NULL) ? NULL : SvSTASH( SvRV(self_sv) );
1097 3 3 if (stash != NULL) {
1098 3 0 pkgname = HvNAME(stash);
3 0 pkgname = HvNAME(stash);
0 3 pkgname = HvNAME(stash);
0 0 pkgname = HvNAME(stash);
3 0 pkgname = HvNAME(stash);
0 3 pkgname = HvNAME(stash);
1101 3 3 if (pkgname == NULL) pkgname = DEFERRED_CLASS;
1103 2 4 if (my_items == 0) {
1115 804 797 for (i = 0; i < argslen; i++) {
1129 31 30 for (i = 0; i < argslen; i++) {
1132 30 1 if (!has_defined && SvOK(result->results[i])) {
24 6 if (!has_defined && SvOK(result->results[i])) {
1137 6 24 if (!has_defined) {
1138 3 3 const char* funcname = (self_sv == NULL) ? "rejected" : "reject";
1176 0 772 if (immortalize) _IMMORTALIZE_PROMISE_SV(promise_sv, promise_p);
1188 0 11 if (immortalize) _IMMORTALIZE_PROMISE_SV(promise_sv, promise_p);
1221 0 0 exs_call_method_void(
1229 0 0 exs_call_method_void(
1252 0 0 exs_call_method_void(
1260 0 0 exs_call_method_void(
1281 0 0 exs_call_method_void(
1289 0 0 exs_call_method_void(
1433 0 0 if (MY_CXT.deferral_cr) {
1437 0 0 if (MY_CXT.deferral_arg) {
1441 0 0 if (MY_CXT.stop_cr) {
1447 0 0 MY_CXT.deferral_arg = SvOK(deferral_arg) ? SvREFCNT_inc(deferral_arg) : NULL;
1451 0 0 MY_CXT.stop_cr = stop_cr ? SvREFCNT_inc(stop_cr) : NULL;
1476 0 25 if (self->promise->state != XSPR_STATE_PENDING) {
1482 23 2 if (GIMME_V == G_VOID) {
1497 0 19 if (self->promise->state != XSPR_STATE_PENDING) {
1503 19 0 if (GIMME_V == G_VOID) {
1518 0 0 RETVAL = (self->promise->state == XSPR_STATE_PENDING);
1527 2 0 if (self->promise->state == XSPR_STATE_FINISHED) {
1531 2 0 if (GIMME_V == G_VOID) {
1564 1 11 if (count == 0) {
1592 22 11 for (i = 0; i < count; i++) {
1596 4 18 if (input_promise == NULL) {
1604 2 2 if (state->remaining == 0 && !state->done) {
2 0 if (state->remaining == 0 && !state->done) {
1638 3 799 _CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION;
1644 0 799 if (on_resolve == NULL) on_resolve = &PL_sv_undef;
1645 788 11 if (on_reject == NULL) on_reject = &PL_sv_undef;
1657 0 25 _CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION;
1671 0 14 _CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION;
1755 0 0 RETVAL = (self->promise->state != XSPR_STATE_PENDING);
1765 0 0 ASSUME(self->promise->state == XSPR_STATE_FINISHED);
1770 0 0 if (RESULT_IS_RESOLVED(self->promise->finished.result)) {
1773 0 0 if (!result_count) XSRETURN_EMPTY;
1778 0 0 EXTEND(SP, result_count);
0 0 EXTEND(SP, result_count);
1780 0 0 for (i=0; i
1787 0 0 EXTEND(SP, 1);
1800 0 0 if (result_count) {
1827 0 0 RETVAL = 0;
1864 0 0 PUSHMARK(SP);