X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=XS.xs;h=27de74240cc7ad3ebec1671c702c88cf70e81dfc;hb=2ad0250eb6f2a158c97851012f770ebd67e77676;hp=07f0a9ba05063863b82a6e9dfdee868c1ada9666;hpb=d581cf05b55a8bd9fe6268a1051ffdd82bc8f403;p=gitmo%2FClass-C3-XS.git diff --git a/XS.xs b/XS.xs index 07f0a9b..27de742 100644 --- a/XS.xs +++ b/XS.xs @@ -189,9 +189,15 @@ __mro_linear_isa_c3(pTHX_ HV* stash, HV* cache, I32 level) HE* const he = hv_fetch_ent(tails, seqitem, 1, 0); if(he) { SV* const val = HeVAL(he); - /* This will increment undef to 1, which is what we - want for a newly created entry. */ - sv_inc(val); + /* For 5.8.0 and later, sv_inc() with increment undef to + an IV of 1, which is what we want for a newly created + entry. However, for 5.6.x it will become an NV of + 1.0, which confuses the SvIVX() checks above */ + if(SvIOK(val)) { + SvIVX(val)++; + } else { + sv_setiv(val, 1); + } } else { croak("failed to store value in hash"); } @@ -407,12 +413,18 @@ XS(XS_Class_C3_XS_nextcan) } /* we found a real sub here */ - sv = sv_2mortal(newSV(0)); + sv = sv_newmortal(); gv_efullname3(sv, cvgv, NULL); - fq_subname = SvPVX(sv); - fq_subname_len = SvCUR(sv); + if (SvPOK(sv)) { + fq_subname = SvPVX(sv); + fq_subname_len = SvCUR(sv); + + subname = strrchr(fq_subname, ':'); + } else { + subname = NULL; + } subname = strrchr(fq_subname, ':'); if(!subname)