Version 0.13.
[gitmo/Class-C3-XS.git] / XS.xs
diff --git a/XS.xs b/XS.xs
index 07f0a9b..27de742 100644 (file)
--- 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)