Branch Coverage

XS.xs
Criterion Covered Total %
branch 380 748 50.8


line true false branch
29 137 0 if(CvXSUB(cv) == XS_TypeTiny_constraint_check){ /* built-in type constraints */
35 0 137 SvGETMAGIC(sv);
0 0 SvGETMAGIC(sv);
47 0 0 PUSHMARK(SP);
48 0 0 XPUSHs(sv);
49 0 0 if( MY_CXT.tc_extra_args ) {
53 0 0 for(i = 0; i < len; i++) {
54 0 0 XPUSHs( AvARRAY(av)[i] );
65 0 0 FREETMPS;
89 2 4 if (SvROK(sv)) {
93 1 3 if(sv_true(sv)){
94 0 1 if(SvPOKp(sv)){ /* "1" */
95 0 0 return SvCUR(sv) == 1 && SvPVX(sv)[0] == '1';
0 0 return SvCUR(sv) == 1 && SvPVX(sv)[0] == '1';
97 1 0 else if(SvIOKp(sv)){
100 0 0 else if(SvNOKp(sv)){
105 0 0 char * ptr = SvPV(sv, len);
106 0 0 if(len == 1 && ptr[0] == '1'){
0 0 if(len == 1 && ptr[0] == '1'){
122 3 0 return !SvOK(sv);
3 0 return !SvOK(sv);
3 0 return !SvOK(sv);
128 0 0 return SvOK(sv);
0 0 return SvOK(sv);
0 0 return SvOK(sv);
134 0 0 return SvOK(sv) && !SvROK(sv);
0 0 return SvOK(sv) && !SvROK(sv);
0 0 return SvOK(sv) && !SvROK(sv);
0 0 return SvOK(sv) && !SvROK(sv);
149 6 41 if(*p == '-') p++;
151 6 41 if (!*p) return FALSE;
153 77 17 while(*p){
154 24 53 if(!isDIGIT(*p)){
164 4 4 if(nv == (NV)(IV)nv){
178 2 47 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
2 0 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
0 2 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
45 2 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
45 0 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
179 20 25 if(SvPOK(sv)){
182 22 3 else if(SvIOK(sv)){
185 3 0 else if(SvNOK(sv)) {
198 2 27 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
2 0 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
0 2 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
26 1 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
0 26 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
201 13 13 if(SvPOKp(sv)){
202 8 5 if (!S_pv_is_integer(aTHX_ SvPVX(sv))) {
206 5 8 else if(SvIOKp(sv)){
209 5 0 else if(SvNOKp(sv)) {
210 1 4 if (!S_nv_is_integer(aTHX_ SvNVX(sv))) {
215 5 12 i = SvPVx(sv, len);
216 6 11 if (len == 1 && i[0] == '0') {
3 3 if (len == 1 && i[0] == '0') {
219 2 12 else if (i[0] == '0') {
220 5 2 for (j = 0; j < len; j++) {
221 0 5 if (i[j] != '0') {
227 12 0 return ((len > 0 && i[0] != '-') ? TRUE : FALSE);
7 5 return ((len > 0 && i[0] != '-') ? TRUE : FALSE);
235 1 14 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
1 0 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
0 1 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
13 1 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
0 13 if ((!SvOK(sv)) || SvROK(sv) || isGV(sv)) {
238 10 3 if(SvPOKp(sv)){
239 7 3 if (!S_pv_is_integer(aTHX_ SvPVX(sv))) {
243 0 3 else if(SvIOKp(sv)){
246 0 0 else if(SvNOKp(sv)) {
247 0 0 if (!S_nv_is_integer(aTHX_ SvNVX(sv))) {
252 3 3 i = SvPVx(sv, len);
253 6 0 return ((len > 0 && i[0] != '-') ? TRUE : FALSE);
4 2 return ((len > 0 && i[0] != '-') ? TRUE : FALSE);
259 1 4 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
1 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
0 1 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
4 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
4 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
271 0 12 if ( SvOK(sv) && !SvROK(sv) && !isGV(sv) ) {
0 0 if ( SvOK(sv) && !SvROK(sv) && !isGV(sv) ) {
0 0 if ( SvOK(sv) && !SvROK(sv) && !isGV(sv) ) {
6 6 if ( SvOK(sv) && !SvROK(sv) && !isGV(sv) ) {
6 0 if ( SvOK(sv) && !SvROK(sv) && !isGV(sv) ) {
275 6 0 if ( SvAMAGIC(sv)
5 1 if ( SvAMAGIC(sv)
5 0 if ( SvAMAGIC(sv)
276 5 0 && ( stash = SvSTASH(SvRV(sv)) )
277 5 0 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
0 0 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
278 5 0 && ( mg = mg_find((const SV*)stash, PERL_MAGIC_overload_table) )
279 5 0 && AMT_AMAGIC( amtp = (AMT*)mg->mg_ptr )
280 5 0 && ( cvp = amtp->table )
281 3 2 && cvp[0x0a] // AMG_STRING
292 0 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
0 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
0 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
0 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
0 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
298 1 7 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
1 0 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
0 1 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
5 2 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
5 0 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
320 8 0 if(SvROK(sv)){
322 8 0 return !SvOBJECT(sv) && (SvTYPE(sv) <= SVt_PVLV && !isGV(sv));
8 0 return !SvOBJECT(sv) && (SvTYPE(sv) <= SVt_PVLV && !isGV(sv));
8 0 return !SvOBJECT(sv) && (SvTYPE(sv) <= SVt_PVLV && !isGV(sv));
330 1 1 return IsArrayRef(sv);
1 0 return IsArrayRef(sv);
1 0 return IsArrayRef(sv);
342 12 1 if ( IsArrayRef(sv) ) {
7 5 if ( IsArrayRef(sv) ) {
6 1 if ( IsArrayRef(sv) ) {
346 6 1 if ( SvAMAGIC(sv)
5 1 if ( SvAMAGIC(sv)
5 0 if ( SvAMAGIC(sv)
347 5 0 && ( stash = SvSTASH(SvRV(sv)) )
348 5 0 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
0 0 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
349 5 0 && ( mg = mg_find((const SV*)stash, PERL_MAGIC_overload_table) )
350 5 0 && AMT_AMAGIC( amtp = (AMT*)mg->mg_ptr )
351 5 0 && ( cvp = amtp->table )
352 3 2 && cvp[0x02] // AMG_TO_AV
363 0 0 return IsHashRef(sv);
0 0 return IsHashRef(sv);
0 0 return IsHashRef(sv);
375 12 1 if ( IsHashRef(sv) ) {
8 4 if ( IsHashRef(sv) ) {
6 2 if ( IsHashRef(sv) ) {
379 6 1 if ( SvAMAGIC(sv)
4 2 if ( SvAMAGIC(sv)
4 0 if ( SvAMAGIC(sv)
380 4 0 && ( stash = SvSTASH(SvRV(sv)) )
381 4 0 && Gv_AMG(stash)
4 0 && Gv_AMG(stash)
0 4 && Gv_AMG(stash)
0 0 && Gv_AMG(stash)
4 0 && Gv_AMG(stash)
0 4 && Gv_AMG(stash)
4 0 && Gv_AMG(stash)
0 4 && Gv_AMG(stash)
4 0 && Gv_AMG(stash)
382 4 0 && ( mg = mg_find((const SV*)stash, PERL_MAGIC_overload_table) )
383 4 0 && AMT_AMAGIC( amtp = (AMT*)mg->mg_ptr )
384 4 0 && ( cvp = amtp->table )
385 2 2 && cvp[0x03] // AMG_TO_HV
396 0 0 return IsHashRef(sv);
0 0 return IsHashRef(sv);
0 0 return IsHashRef(sv);
402 0 0 return IsArrayRef(sv);
0 0 return IsArrayRef(sv);
0 0 return IsArrayRef(sv);
408 0 0 return IsCodeRef(sv);
0 0 return IsCodeRef(sv);
0 0 return IsCodeRef(sv);
420 12 1 if ( IsCodeRef(sv) ) {
7 5 if ( IsCodeRef(sv) ) {
6 1 if ( IsCodeRef(sv) ) {
424 6 1 if ( SvAMAGIC(sv)
5 1 if ( SvAMAGIC(sv)
5 0 if ( SvAMAGIC(sv)
425 5 0 && ( stash = SvSTASH(SvRV(sv)) )
426 5 0 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
0 0 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
0 5 && Gv_AMG(stash)
5 0 && Gv_AMG(stash)
427 5 0 && ( mg = mg_find((const SV*)stash, PERL_MAGIC_overload_table) )
428 5 0 && AMT_AMAGIC( amtp = (AMT*)mg->mg_ptr )
429 5 0 && ( cvp = amtp->table )
430 3 2 && cvp[0x05] // AMG_TO_CV
447 0 0 return SvROK(sv) && !SvOBJECT(SvRV(sv)) && isGV(SvRV(sv));
0 0 return SvROK(sv) && !SvOBJECT(SvRV(sv)) && isGV(SvRV(sv));
0 0 return SvROK(sv) && !SvOBJECT(SvRV(sv)) && isGV(SvRV(sv));
457 0 0 gv = (GV*)(SvROK(sv) ? SvRV(sv) : sv);
458 0 0 if(isGV(gv) || SvTYPE(gv) == SVt_PVIO){
0 0 if(isGV(gv) || SvTYPE(gv) == SVt_PVIO){
459 0 0 IO* const io = isGV(gv) ? GvIO(gv) : (IO*)gv;
0 0 IO* const io = isGV(gv) ? GvIO(gv) : (IO*)gv;
0 0 IO* const io = isGV(gv) ? GvIO(gv) : (IO*)gv;
0 0 IO* const io = isGV(gv) ? GvIO(gv) : (IO*)gv;
0 0 IO* const io = isGV(gv) ? GvIO(gv) : (IO*)gv;
461 0 0 if(io && ( IoIFP(io) || SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar) )){
0 0 if(io && ( IoIFP(io) || SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar) )){
0 0 if(io && ( IoIFP(io) || SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar) )){
0 0 if(io && ( IoIFP(io) || SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar) )){
472 0 0 return SvROK(sv) && SvOBJECT(SvRV(sv));
0 0 return SvROK(sv) && SvOBJECT(SvRV(sv));
479 25 2 if(IsArrayRef(sv)){
25 0 if(IsArrayRef(sv)){
22 3 if(IsArrayRef(sv)){
483 49 14 for(i = 0; i < len; i++){
485 8 41 if(!typetiny_tc_check(aTHX_ param, value)){
503 5 0 if( IsArrayRef(sv) ) {
2 3 if( IsArrayRef(sv) ) {
2 0 if( IsArrayRef(sv) ) {
507 3 0 if( SvAMAGIC(sv)
3 0 if( SvAMAGIC(sv)
3 0 if( SvAMAGIC(sv)
508 3 0 && ( stash = SvSTASH(SvRV(sv)) )
509 3 0 && Gv_AMG(stash)
3 0 && Gv_AMG(stash)
0 3 && Gv_AMG(stash)
0 0 && Gv_AMG(stash)
3 0 && Gv_AMG(stash)
0 3 && Gv_AMG(stash)
3 0 && Gv_AMG(stash)
0 3 && Gv_AMG(stash)
3 0 && Gv_AMG(stash)
510 3 0 && ( mg = mg_find((const SV*)stash, PERL_MAGIC_overload_table) )
511 3 0 && AMT_AMAGIC( amtp = (AMT*)mg->mg_ptr )
512 3 0 && ( cvp = amtp->table )
513 2 1 && cvp[0x02] // AMG_TO_AV
519 21 1 for(i = 0; i < len; i++){
521 1 20 if(!typetiny_tc_check(aTHX_ param, value)){
532 14 2 if(IsHashRef(sv)){
14 0 if(IsHashRef(sv)){
13 1 if(IsHashRef(sv)){
537 16 10 while((he = hv_iternext(hv))){
539 3 13 if(!typetiny_tc_check(aTHX_ param, value)){
558 7 0 if( IsHashRef(sv) ) {
4 3 if( IsHashRef(sv) ) {
3 1 if( IsHashRef(sv) ) {
562 4 0 if( SvAMAGIC(sv)
3 1 if( SvAMAGIC(sv)
3 0 if( SvAMAGIC(sv)
563 3 0 && ( stash = SvSTASH(SvRV(sv)) )
564 3 0 && Gv_AMG(stash)
3 0 && Gv_AMG(stash)
0 3 && Gv_AMG(stash)
0 0 && Gv_AMG(stash)
3 0 && Gv_AMG(stash)
0 3 && Gv_AMG(stash)
3 0 && Gv_AMG(stash)
0 3 && Gv_AMG(stash)
3 0 && Gv_AMG(stash)
565 3 0 && ( mg = mg_find((const SV*)stash, PERL_MAGIC_overload_table) )
566 3 0 && AMT_AMAGIC( amtp = (AMT*)mg->mg_ptr )
567 3 0 && ( cvp = amtp->table )
568 2 1 && cvp[0x03] // AMG_TO_HV
575 2 1 while((he = hv_iternext(hv))){
577 1 1 if(!typetiny_tc_check(aTHX_ param, value)){
589 7 1 if(IsHashRef(sv)){
7 0 if(IsHashRef(sv)){
6 1 if(IsHashRef(sv)){
598 8 3 while((he = hv_iternext(hv))){
602 7 1 if(!typetiny_tc_check(aTHX_ param1, key)
603 2 5 || !typetiny_tc_check(aTHX_ param2, value)){
616 9 0 if(IsArrayRef(sv)){
9 0 if(IsArrayRef(sv)){
8 1 if(IsArrayRef(sv)){
621 3 5 if (len - 1 != av_len(params)) {
625 13 3 for(i = 0; i < len; i++){
628 2 11 if(!typetiny_tc_check(aTHX_ check, value)){
644 2 21 if(!(SvOK(sv) && !SvROK(sv) && !isGV(sv))) {
2 0 if(!(SvOK(sv) && !SvROK(sv) && !isGV(sv))) {
0 2 if(!(SvOK(sv) && !SvROK(sv) && !isGV(sv))) {
17 4 if(!(SvOK(sv) && !SvROK(sv) && !isGV(sv))) {
0 17 if(!(SvOK(sv) && !SvROK(sv) && !isGV(sv))) {
650 49 7 for(i = 0; i < len; i++){
652 10 39 if(sv_eq(sv, x)){
662 0 0 if(SvOK(sv)){
0 0 if(SvOK(sv)){
0 0 if(SvOK(sv)){
686 12 4 for(i = 0; i < len; i++){
687 3 9 if(typetiny_tc_check(aTHX_ AvARRAY(types)[i], sv)){
705 9 2 for(i = 0; i < len; i++){
706 4 5 if(!typetiny_tc_check(aTHX_ AvARRAY(types)[i], sv)){
730 0 4 if(name[0] == ':' && name[1] == ':'){
0 0 if(name[0] == ':' && name[1] == ':'){
735 0 4 while(strnEQ(name, "main::", sizeof("main::")-1)){
748 3 1 while(svp != end){
750 1 2 if(strEQ(klass_pv, typetiny_canonicalize_package_name(SvPVX(*svp)))){
764 1 3 if(gvp && isGV(*gvp) && GvCV(*gvp)){ /* shortcut */
1 0 if(gvp && isGV(*gvp) && GvCV(*gvp)){ /* shortcut */
1 0 if(gvp && isGV(*gvp) && GvCV(*gvp)){ /* shortcut */
776 4 0 if(IsObject(instance)){
4 0 if(IsObject(instance)){
782 4 0 if(myisa == NULL || GvCV(myisa) == GvCV(MY_CXT.universal_isa)){
3 1 if(myisa == NULL || GvCV(myisa) == GvCV(MY_CXT.universal_isa)){
784 2 1 || typetiny_lookup_isa(aTHX_ instance_stash, HvNAME_get(stash));
2 0 || typetiny_lookup_isa(aTHX_ instance_stash, HvNAME_get(stash));
2 0 || typetiny_lookup_isa(aTHX_ instance_stash, HvNAME_get(stash));
0 2 || typetiny_lookup_isa(aTHX_ instance_stash, HvNAME_get(stash));
0 0 || typetiny_lookup_isa(aTHX_ instance_stash, HvNAME_get(stash));
2 0 || typetiny_lookup_isa(aTHX_ instance_stash, HvNAME_get(stash));
0 2 || typetiny_lookup_isa(aTHX_ instance_stash, HvNAME_get(stash));
1 1 || typetiny_lookup_isa(aTHX_ instance_stash, HvNAME_get(stash));
789 1 0 CV *isacv = isGV(myisa) ? GvCV(myisa) : (CV *)myisa;
794 1 0 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
1 0 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
0 1 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
0 0 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
1 0 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
0 1 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
1 0 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
1 0 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
0 1 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
0 0 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
1 0 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
0 1 package = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
801 0 1 EXTEND(SP, 2);
802 0 1 PUSHMARK(SP);
811 1 0 ret = SvTRUE(retsv);
0 1 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
0 1 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
0 1 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
1 0 ret = SvTRUE(retsv);
1 0 ret = SvTRUE(retsv);
0 1 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
1 0 ret = SvTRUE(retsv);
0 0 ret = SvTRUE(retsv);
814 1 0 FREETMPS;
826 0 0 return SvROK(sv) && SvOBJECT(SvRV(sv));
0 0 return SvROK(sv) && SvOBJECT(SvRV(sv));
831 0 0 if(IsObject(instance)){
0 0 if(IsObject(instance)){
835 0 0 bool const use_builtin = (mycan == NULL || GvCV(mycan) == GvCV(MY_CXT.universal_can)) ? TRUE : FALSE;
0 0 bool const use_builtin = (mycan == NULL || GvCV(mycan) == GvCV(MY_CXT.universal_can)) ? TRUE : FALSE;
838 0 0 for(i = 0; i < len; i++){
839 0 0 SV* const name = TYPETINY_av_at(methods, i);
841 0 0 if(use_builtin){
842 0 0 if(!find_method_pvn(mystash, SvPVX(name), SvCUR(name))){
854 0 0 FREETMPS;
857 0 0 if(!ok){
883 21 540 if(!name){
893 1 0 const char* klass_pv = SvPV_const(klass, klass_len);
899 1 0 if(strNE(klass_pv, "UNIVERSAL")){
923 0 0 for(i = 0; i < len; i++){
926 0 0 const char* const pv = SvPV_const(name, pvlen);
941 1 185 if(items < 1){
946 0 185 SvGETMAGIC(sv);
0 0 SvGETMAGIC(sv);
949 81 105 ST(0) = boolSV( CALL_FPTR((check_fptr_t)mg->mg_ptr)(aTHX_ mg->mg_obj, sv) );
986 0 18 PUSHMARK(MARK);
1064 18 2 if(ix == TYPETINY_TC_MAP
1065 16 2 || ix == TYPETINY_TC_TUPLE
1066 13 3 || ix == TYPETINY_TC_ENUM
1067 12 1 || ix == TYPETINY_TC_ANYOF
1068 1 11 || ix == TYPETINY_TC_ALLOF) {
1069 9 0 if(!IsArrayRef(tc_code)){
9 0 if(!IsArrayRef(tc_code)){
0 9 if(!IsArrayRef(tc_code)){
1074 11 0 if(!IsCodeRef(tc_code)){
11 0 if(!IsCodeRef(tc_code)){
0 11 if(!IsCodeRef(tc_code)){