Branch Coverage

XS.xs
Criterion Covered Total %
branch 386 760 50.7


line true false branch
29 131 0 if(CvXSUB(cv) == XS_TypeTiny_constraint_check){ /* built-in type constraints */
35 0 131 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 39 if(*p == '-') p++;
151 6 39 if (!*p) return FALSE;
153 75 15 while(*p){
154 24 51 if(!isDIGIT(*p)){
164 4 4 if(nv == (NV)(IV)nv){
178 2 45 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)) {
43 2 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
43 0 if (SvOK(sv) && !SvROK(sv) && !isGV(sv)) {
179 18 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 2 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);
2 0 return SvOK(sv) && !SvROK(sv) && !isGV(sv);
2 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)){
504 5 0 if( IsArrayRef(sv) ) {
2 3 if( IsArrayRef(sv) ) {
2 0 if( IsArrayRef(sv) ) {
508 3 0 if( SvAMAGIC(sv)
3 0 if( SvAMAGIC(sv)
3 0 if( SvAMAGIC(sv)
509 3 0 && ( stash = SvSTASH(SvRV(sv)) )
510 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)
511 3 0 && ( mg = mg_find((const SV*)stash, PERL_MAGIC_overload_table) )
512 3 0 && AMT_AMAGIC( amtp = (AMT*)mg->mg_ptr )
513 3 0 && ( cvp = amtp->table )
514 2 1 && cvp[0x02]
520 0 2 EXTEND(SP, 1);
521 0 2 PUSHMARK(SP);
528 2 0 FREETMPS;
534 21 1 for(i = 0; i < len; i++){
536 1 20 if(!typetiny_tc_check(aTHX_ param, value)){
547 14 2 if(IsHashRef(sv)){
14 0 if(IsHashRef(sv)){
13 1 if(IsHashRef(sv)){
552 14 10 while((he = hv_iternext(hv))){
554 3 11 if(!typetiny_tc_check(aTHX_ param, value)){
574 7 0 if( IsHashRef(sv) ) {
4 3 if( IsHashRef(sv) ) {
3 1 if( IsHashRef(sv) ) {
578 4 0 if( SvAMAGIC(sv)
3 1 if( SvAMAGIC(sv)
3 0 if( SvAMAGIC(sv)
579 3 0 && ( stash = SvSTASH(SvRV(sv)) )
580 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)
581 3 0 && ( mg = mg_find((const SV*)stash, PERL_MAGIC_overload_table) )
582 3 0 && AMT_AMAGIC( amtp = (AMT*)mg->mg_ptr )
583 3 0 && ( cvp = amtp->table )
584 2 1 && cvp[0x03]
590 0 2 EXTEND(SP, 1);
591 0 2 PUSHMARK(SP);
598 2 0 FREETMPS;
605 2 1 while((he = hv_iternext(hv))){
607 1 1 if(!typetiny_tc_check(aTHX_ param, value)){
619 7 1 if(IsHashRef(sv)){
7 0 if(IsHashRef(sv)){
6 1 if(IsHashRef(sv)){
628 6 3 while((he = hv_iternext(hv))){
632 5 1 if(!typetiny_tc_check(aTHX_ param1, key)
633 2 3 || !typetiny_tc_check(aTHX_ param2, value)){
646 9 0 if(IsArrayRef(sv)){
9 0 if(IsArrayRef(sv)){
8 1 if(IsArrayRef(sv)){
651 3 5 if (len - 1 != av_len(params)) {
655 13 3 for(i = 0; i < len; i++){
658 2 11 if(!typetiny_tc_check(aTHX_ check, value)){
674 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))) {
680 49 7 for(i = 0; i < len; i++){
682 10 39 if(sv_eq(sv, x)){
692 0 0 if(SvOK(sv)){
0 0 if(SvOK(sv)){
0 0 if(SvOK(sv)){
716 12 4 for(i = 0; i < len; i++){
717 3 9 if(typetiny_tc_check(aTHX_ AvARRAY(types)[i], sv)){
735 9 2 for(i = 0; i < len; i++){
736 4 5 if(!typetiny_tc_check(aTHX_ AvARRAY(types)[i], sv)){
760 0 4 if(name[0] == ':' && name[1] == ':'){
0 0 if(name[0] == ':' && name[1] == ':'){
765 0 4 while(strnEQ(name, "main::", sizeof("main::")-1)){
778 3 1 while(svp != end){
780 1 2 if(strEQ(klass_pv, typetiny_canonicalize_package_name(SvPVX(*svp)))){
794 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 */
806 4 0 if(IsObject(instance)){
4 0 if(IsObject(instance)){
812 4 0 if(myisa == NULL || GvCV(myisa) == GvCV(MY_CXT.universal_isa)){
3 1 if(myisa == NULL || GvCV(myisa) == GvCV(MY_CXT.universal_isa)){
814 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));
819 1 0 CV *isacv = isGV(myisa) ? GvCV(myisa) : (CV *)myisa;
824 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);
831 0 1 EXTEND(SP, 2);
832 0 1 PUSHMARK(SP);
841 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);
844 1 0 FREETMPS;
856 0 0 return SvROK(sv) && SvOBJECT(SvRV(sv));
0 0 return SvROK(sv) && SvOBJECT(SvRV(sv));
861 0 0 if(IsObject(instance)){
0 0 if(IsObject(instance)){
865 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;
868 0 0 for(i = 0; i < len; i++){
869 0 0 SV* const name = TYPETINY_av_at(methods, i);
871 0 0 if(use_builtin){
872 0 0 if(!find_method_pvn(mystash, SvPVX(name), SvCUR(name))){
884 0 0 FREETMPS;
887 0 0 if(!ok){
913 21 540 if(!name){
923 1 0 const char* klass_pv = SvPV_const(klass, klass_len);
929 1 0 if(strNE(klass_pv, "UNIVERSAL")){
953 0 0 for(i = 0; i < len; i++){
956 0 0 const char* const pv = SvPV_const(name, pvlen);
971 1 185 if(items < 1){
976 0 185 SvGETMAGIC(sv);
0 0 SvGETMAGIC(sv);
979 81 105 ST(0) = boolSV( CALL_FPTR((check_fptr_t)mg->mg_ptr)(aTHX_ mg->mg_obj, sv) );
1016 0 18 PUSHMARK(MARK);
1094 18 2 if(ix == TYPETINY_TC_MAP
1095 16 2 || ix == TYPETINY_TC_TUPLE
1096 13 3 || ix == TYPETINY_TC_ENUM
1097 12 1 || ix == TYPETINY_TC_ANYOF
1098 1 11 || ix == TYPETINY_TC_ALLOF) {
1099 9 0 if(!IsArrayRef(tc_code)){
9 0 if(!IsArrayRef(tc_code)){
0 9 if(!IsArrayRef(tc_code)){
1104 11 0 if(!IsCodeRef(tc_code)){
11 0 if(!IsCodeRef(tc_code)){
0 11 if(!IsCodeRef(tc_code)){