| line |
true |
false |
branch |
|
202
|
0 |
1608 |
ASSUME(origin->state == XSPR_STATE_FINISHED); |
|
204
|
770 |
838 |
if (callback->type == XSPR_CALLBACK_CHAIN) { |
|
207
|
2 |
836 |
} else if (callback->type == XSPR_CALLBACK_FINALLY_CHAIN) { |
|
208
|
1 |
1 |
xspr_promise_finish(aTHX_ |
|
213
|
11 |
825 |
} else if (callback->type == XSPR_CALLBACK_PERL || callback->type == XSPR_CALLBACK_FINALLY) { |
|
|
11 |
0 |
} else if (callback->type == XSPR_CALLBACK_PERL || callback->type == XSPR_CALLBACK_FINALLY) { |
|
217
|
11 |
825 |
if (callback->type == XSPR_CALLBACK_FINALLY) { |
|
223
|
11 |
0 |
if (callback_fn && SvOK(callback_fn)) { |
|
|
0 |
11 |
if (callback_fn && SvOK(callback_fn)) { |
|
|
0 |
0 |
if (callback_fn && SvOK(callback_fn)) { |
|
|
0 |
0 |
if (callback_fn && SvOK(callback_fn)) { |
|
229
|
804 |
21 |
if (RESULT_IS_RESOLVED(origin->finished.result)) { |
|
231
|
21 |
0 |
} else if (RESULT_IS_REJECTED(origin->finished.result)) { |
|
234
|
21 |
0 |
if (callback_fn && SvOK(callback_fn)) { |
|
|
0 |
21 |
if (callback_fn && SvOK(callback_fn)) { |
|
|
0 |
0 |
if (callback_fn && SvOK(callback_fn)) { |
|
|
0 |
0 |
if (callback_fn && SvOK(callback_fn)) { |
|
244
|
836 |
0 |
if (callback_fn != NULL) { |
|
247
|
11 |
825 |
if (callback->type == XSPR_CALLBACK_FINALLY) { |
|
258
|
33 |
803 |
if (next_promise == NULL) { |
|
259
|
1 |
32 |
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)) { |
|
274
|
795 |
8 |
if (callback_result->count > 0 && callback_result->state == XSPR_RESULT_RESOLVED) { |
|
|
790 |
5 |
if (callback_result->count > 0 && callback_result->state == XSPR_RESULT_RESOLVED) { |
|
277
|
774 |
16 |
if (promise != NULL) { |
|
279
|
2 |
772 |
if (callback_result->count > 1) { |
|
282
|
0 |
772 |
else if (promise == next_promise) { |
|
298
|
2 |
770 |
if (callback->type == XSPR_CALLBACK_FINALLY) { |
|
312
|
31 |
772 |
if (finish_promise) { |
|
316
|
8 |
23 |
if ((callback->type == XSPR_CALLBACK_FINALLY) && RESULT_IS_RESOLVED(callback_result)) { |
|
|
7 |
1 |
if ((callback->type == XSPR_CALLBACK_FINALLY) && RESULT_IS_RESOLVED(callback_result)) { |
|
319
|
4 |
3 |
if (RESULT_IS_REJECTED(final_result)) { |
|
338
|
4 |
27 |
if (final_result_needs_decref) { |
|
346
|
0 |
0 |
} else if (next_promise) { |
|
360
|
770 |
844 |
if (callback->type == XSPR_CALLBACK_CHAIN) { |
|
363
|
828 |
16 |
} else if (callback->type == XSPR_CALLBACK_PERL) { |
|
366
|
796 |
32 |
if (callback->perl.next != NULL) |
|
369
|
14 |
2 |
} else if (callback->type == XSPR_CALLBACK_FINALLY) { |
|
371
|
13 |
1 |
if (callback->finally.next != NULL) |
|
374
|
2 |
0 |
} else if (callback->type == XSPR_CALLBACK_FINALLY_CHAIN) { |
|
390
|
0 |
0 |
if (MY_CXT.in_flush) { |
|
397
|
0 |
0 |
while (MY_CXT.queue_head != NULL) { |
|
408
|
0 |
0 |
if (cur->next == NULL) { |
|
434
|
0 |
0 |
if (MY_CXT.queue_head == NULL) { |
|
435
|
0 |
0 |
ASSUME(MY_CXT.queue_tail == NULL); |
|
441
|
0 |
0 |
ASSUME(MY_CXT.queue_tail != NULL); |
|
455
|
0 |
0 |
PUSHMARK(SP); |
|
457
|
0 |
0 |
if (maybe_arg0) { |
|
458
|
0 |
0 |
EXTEND(SP, 2); |
|
462
|
0 |
0 |
EXTEND(SP, 1); |
|
470
|
0 |
0 |
FREETMPS; |
|
484
|
0 |
10 |
PUSHMARK(SP); |
|
485
|
0 |
10 |
EXTEND(SP, argscount); |
|
488
|
10 |
10 |
for (i=0; i
|
|
496
|
10 |
0 |
FREETMPS; |
|
505
|
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) { |
|
512
|
0 |
0 |
if (!MY_CXT.pxs_flush_cr) { |
|
515
|
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) { |
|
533
|
0 |
837 |
if (!SvROK(perl_fn)) { |
|
540
|
0 |
837 |
PUSHMARK(SP); |
|
541
|
0 |
837 |
EXTEND(SP, input_count); |
|
542
|
840 |
837 |
for (i = 0; i < input_count; i++) { |
|
555
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
837 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
837 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
837 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
831 |
6 |
if (SvTRUE(ERRSV)) { |
|
|
831 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
831 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
6 |
831 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
|
0 |
0 |
if (SvTRUE(ERRSV)) { |
|
557
|
6 |
0 |
result->results[0] = newSVsv(ERRSV); |
|
560
|
820 |
831 |
for (i = 0; i < count; i++) { |
|
566
|
837 |
0 |
FREETMPS; |
|
581
|
1661 |
1620 |
if (--(result->refs) == 0) { |
|
582
|
33 |
1628 |
if (RESULT_IS_REJECTED(result) && result->rejection_should_warn) { |
|
|
10 |
23 |
if (RESULT_IS_REJECTED(result) && result->rejection_should_warn) { |
|
586
|
0 |
10 |
Copy(result->results, warn_args, result->count, SV*); |
|
592
|
1657 |
1661 |
for (i = 0; i < result->count; i++) { |
|
623
|
0 |
1620 |
ASSUME(promise->state == XSPR_STATE_PENDING); |
|
634
|
0 |
1620 |
if (promise->on_ready_immediate != NULL) { |
|
642
|
12 |
1620 |
for (i = 0; i < count; i++) { |
|
646
|
9 |
3 |
if (pending_callbacks[i]->type == XSPR_CALLBACK_PERL && RESULT_IS_REJECTED(result) && result->rejection_should_warn) { |
|
|
5 |
4 |
if (pending_callbacks[i]->type == XSPR_CALLBACK_PERL && RESULT_IS_REJECTED(result) && result->rejection_should_warn) { |
|
|
3 |
2 |
if (pending_callbacks[i]->type == XSPR_CALLBACK_PERL && RESULT_IS_REJECTED(result) && result->rejection_should_warn) { |
|
648
|
3 |
0 |
if (on_reject && SvOK(on_reject)) { |
|
|
0 |
3 |
if (on_reject && SvOK(on_reject)) { |
|
|
0 |
0 |
if (on_reject && SvOK(on_reject)) { |
|
|
0 |
0 |
if (on_reject && SvOK(on_reject)) { |
|
653
|
0 |
12 |
if (MY_CXT.deferral_cr) { |
|
661
|
0 |
1620 |
if (promise->self_sv_ref != NULL) { |
|
669
|
0 |
0 |
if (!SvWEAKREF(promise->self_sv_ref)) { |
|
677
|
0 |
1620 |
if (MY_CXT.deferral_cr) { |
|
689
|
0 |
1661 |
Newxz(result->results, count, SV*); |
|
702
|
9 |
7 |
for (i=0; icount; i++) { |
|
725
|
1635 |
2389 |
if (--(promise->refs) == 0) { |
|
726
|
15 |
1620 |
if (promise->state == XSPR_STATE_PENDING) { |
|
731
|
6 |
15 |
for (i = 0; i < count; i++) { |
|
736
|
1620 |
0 |
} else if (promise->state == XSPR_STATE_FINISHED) { |
|
743
|
0 |
1635 |
if (promise->on_ready_immediate != NULL) { |
|
770
|
21 |
807 |
if (SvOK(on_resolve)) |
|
|
21 |
0 |
if (SvOK(on_resolve)) |
|
|
0 |
21 |
if (SvOK(on_resolve)) |
|
772
|
796 |
32 |
if (SvOK(on_reject)) |
|
|
796 |
0 |
if (SvOK(on_reject)) |
|
|
0 |
796 |
if (SvOK(on_reject)) |
|
775
|
796 |
32 |
if (next) |
|
785
|
0 |
14 |
if (SvOK(on_finally)) |
|
|
0 |
0 |
if (SvOK(on_finally)) |
|
|
0 |
0 |
if (SvOK(on_finally)) |
|
788
|
13 |
1 |
if (next) |
|
826
|
18 |
1596 |
if (promise->state == XSPR_STATE_PENDING) { |
|
828
|
0 |
18 |
Renew(promise->pending.callbacks, promise->pending.callbacks_count, xspr_callback_t*); |
|
831
|
1596 |
0 |
} else if (promise->state == XSPR_STATE_FINISHED) { |
|
833
|
0 |
1596 |
if (MY_CXT.deferral_cr) { |
|
848
|
790 |
0 |
if (input == NULL || !sv_isobject(input)) { |
|
|
16 |
774 |
if (input == NULL || !sv_isobject(input)) { |
|
853
|
773 |
1 |
if (sv_derived_from(input, PROMISE_CLASS)) { |
|
854
|
773 |
0 |
IV tmp = SvIV((SV*)SvRV(input)); |
|
862
|
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) { |
|
865
|
0 |
1 |
if (!converter_cv) croak("Need " CONVERTER_CR_NAME "!"); |
|
871
|
1 |
0 |
if (new_result->state == XSPR_RESULT_RESOLVED && |
|
|
1 |
0 |
if (new_result->state == XSPR_RESULT_RESOLVED && |
|
872
|
1 |
0 |
new_result->results != NULL && |
|
873
|
1 |
0 |
new_result->count == 1 && |
|
874
|
1 |
0 |
SvROK(new_result->results[0]) && |
|
877
|
1 |
0 |
IV tmp = SvIV((SV*)SvRV(new_result->results[0])); |
|
900
|
0 |
109 |
return INT2PTR(DEFERRED_CLASS_TYPE*, SvUV(referent)); |
|
905
|
0 |
2471 |
return INT2PTR(PROMISE_CLASS_TYPE*, SvUV(referent)); |
|
925
|
1635 |
0 |
if (dml_svgv) { |
|
929
|
1635 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
1635 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
1635 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
1631 |
4 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
1631 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
1631 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
4 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
4 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
4 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
4 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
4 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
|
0 |
0 |
promise->detect_leak_pid = detect_leak_perl && SvTRUE(detect_leak_perl) ? getpid() : 0; |
|
936
|
77 |
765 |
if (GIMME_V != G_VOID) { |
|
|
809 |
33 |
if (GIMME_V != G_VOID) { |
|
958
|
5 |
1664 |
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()) { |
|
959
|
0 |
2 |
warn( "======================================================================\nXXXXXX - %s survived until global destruction; memory leak likely!\n======================================================================\n", SvPV_nolen(self_sv) ); |
|
967
|
3 |
3 |
HV *stash = (self_sv == NULL) ? NULL : SvSTASH( SvRV(self_sv) ); |
|
969
|
3 |
3 |
if (stash != NULL) { |
|
970
|
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); |
|
973
|
3 |
3 |
if (pkgname == NULL) pkgname = DEFERRED_CLASS; |
|
975
|
2 |
4 |
if (my_items == 0) { |
|
987
|
799 |
795 |
for (i = 0; i < argslen; i++) { |
|
1001
|
23 |
22 |
for (i = 0; i < argslen; i++) { |
|
1004
|
22 |
1 |
if (!has_defined && SvOK(result->results[i])) { |
|
|
6 |
16 |
if (!has_defined && SvOK(result->results[i])) { |
|
|
6 |
0 |
if (!has_defined && SvOK(result->results[i])) { |
|
|
0 |
6 |
if (!has_defined && SvOK(result->results[i])) { |
|
1009
|
6 |
16 |
if (!has_defined) { |
|
1010
|
3 |
3 |
const char* funcname = (self_sv == NULL) ? "rejected" : "reject"; |
|
1048
|
0 |
774 |
if (immortalize) _IMMORTALIZE_PROMISE_SV(promise_sv, promise_p); |
|
1060
|
0 |
10 |
if (immortalize) _IMMORTALIZE_PROMISE_SV(promise_sv, promise_p); |
|
1093
|
0 |
0 |
exs_call_method_void( |
|
1101
|
0 |
0 |
exs_call_method_void( |
|
1124
|
0 |
0 |
exs_call_method_void( |
|
1132
|
0 |
0 |
exs_call_method_void( |
|
1153
|
0 |
0 |
exs_call_method_void( |
|
1161
|
0 |
0 |
exs_call_method_void( |
|
1305
|
0 |
0 |
if (MY_CXT.deferral_cr) { |
|
1309
|
0 |
0 |
if (MY_CXT.deferral_arg) { |
|
1313
|
0 |
0 |
if (MY_CXT.stop_cr) { |
|
1319
|
0 |
0 |
MY_CXT.deferral_arg = SvOK(deferral_arg) ? SvREFCNT_inc(deferral_arg) : NULL; |
|
|
0 |
0 |
MY_CXT.deferral_arg = SvOK(deferral_arg) ? SvREFCNT_inc(deferral_arg) : NULL; |
|
|
0 |
0 |
MY_CXT.deferral_arg = SvOK(deferral_arg) ? SvREFCNT_inc(deferral_arg) : NULL; |
|
1323
|
0 |
0 |
MY_CXT.stop_cr = stop_cr ? SvREFCNT_inc(stop_cr) : NULL; |
|
1348
|
0 |
21 |
if (self->promise->state != XSPR_STATE_PENDING) { |
|
1354
|
21 |
0 |
if (GIMME_V == G_VOID) { |
|
|
19 |
2 |
if (GIMME_V == G_VOID) { |
|
1369
|
0 |
12 |
if (self->promise->state != XSPR_STATE_PENDING) { |
|
1375
|
11 |
1 |
if (GIMME_V == G_VOID) { |
|
|
12 |
0 |
if (GIMME_V == G_VOID) { |
|
1399
|
2 |
0 |
if (self->promise->state == XSPR_STATE_FINISHED) { |
|
1403
|
2 |
0 |
if (GIMME_V == G_VOID) { |
|
|
2 |
0 |
if (GIMME_V == G_VOID) { |
|
1432
|
3 |
807 |
_CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION; |
|
1438
|
0 |
807 |
if (on_resolve == NULL) on_resolve = &PL_sv_undef; |
|
1439
|
796 |
11 |
if (on_reject == NULL) on_reject = &PL_sv_undef; |
|
1451
|
0 |
21 |
_CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION; |
|
1465
|
0 |
14 |
_CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION; |
|
1559
|
0 |
0 |
ASSUME(self->promise->state == XSPR_STATE_FINISHED); |
|
1564
|
0 |
0 |
if (RESULT_IS_RESOLVED(self->promise->finished.result)) { |
|
1567
|
0 |
0 |
if (!result_count) XSRETURN_EMPTY; |
|
1569
|
0 |
0 |
switch (GIMME_V) { |
|
1572
|
0 |
0 |
EXTEND(SP, result_count); |
|
|
0 |
0 |
EXTEND(SP, result_count); |
|
1574
|
0 |
0 |
for (i=0; i
|
|
1581
|
0 |
0 |
EXTEND(SP, 1); |
|
1594
|
0 |
0 |
if (result_count) { |
|
1658
|
0 |
0 |
PUSHMARK(SP); |
|
1660
|
0 |
0 |
int count = call_method("AWAIT_GET", GIMME_V); |