increment $VERSION after 0.26 release
[p5sagit/Sub-Name.git] / Name.xs
diff --git a/Name.xs b/Name.xs
index 59a62e8..c2c9b3c 100644 (file)
--- a/Name.xs
+++ b/Name.xs
@@ -11,6 +11,7 @@
 #define NEED_newSVpvn_flags
 #define NEED_gv_fetchpvn_flags
 #define NEED_sv_catpvn_flags
+#define NEED_croak_xs_usage
 #include "ppport.h"
 
 static MGVTBL subname_vtbl;
@@ -72,7 +73,8 @@ subname(name, sub)
        STRLEN namelen;
        const char* nameptr = SvPV(name, namelen);
        int utf8flag = SvUTF8(name);
-       int seen_quote = 0, need_subst = 0;
+       int quotes_seen = 0;
+       bool need_subst = FALSE;
     PPCODE:
        if (!SvROK(sub) && SvGMAGICAL(sub))
                mg_get(sub);
@@ -96,24 +98,24 @@ subname(name, sub)
                if (s > nameptr && *s == ':' && s[-1] == ':') {
                        end = s - 1;
                        begin = ++s;
-                       if (seen_quote)
-                               need_subst++;
+                       if (quotes_seen)
+                               need_subst = TRUE;
                }
                else if (s > nameptr && *s != '\0' && s[-1] == '\'') {
                        end = s - 1;
                        begin = s;
-                       if (seen_quote++)
-                               need_subst++;
+                       if (quotes_seen++)
+                               need_subst = TRUE;
                }
        }
        s--;
        if (end) {
                SV* tmp;
                if (need_subst) {
-                       STRLEN length = end - nameptr + seen_quote - (*end == '\'' ? 1 : 0);
+                       STRLEN length = end - nameptr + quotes_seen - (*end == '\'' ? 1 : 0);
                        char* left;
                        int i, j;
-                       tmp = newSV(length);
+                       tmp = sv_2mortal(newSV(length));
                        left = SvPVX(tmp);
                        for (i = 0, j = 0; j < end - nameptr; ++i, ++j) {
                                if (nameptr[j] == '\'') {
@@ -125,7 +127,6 @@ subname(name, sub)
                                }
                        }
                        stash = gv_stashpvn(left, length, GV_ADD | utf8flag);
-                       SvREFCNT_dec(tmp);
                }
                else
                        stash = gv_stashpvn(nameptr, end - nameptr, GV_ADD | utf8flag);
@@ -140,22 +141,19 @@ subname(name, sub)
 
                GV* oldgv = CvGV(cv);
                HV* oldhv = GvSTASH(oldgv);
-               SV* old_full_name = newSVpvn_flags(HvNAME(oldhv), HvNAMELEN_get(oldhv), HvNAMEUTF8(oldhv) ? SVf_UTF8 : 0);
+               SV* old_full_name = sv_2mortal(newSVpvn_flags(HvNAME(oldhv), HvNAMELEN_get(oldhv), HvNAMEUTF8(oldhv) ? SVf_UTF8 : 0));
                sv_catpvn(old_full_name, "::", 2);
                sv_catpvn_flags(old_full_name, GvNAME(oldgv), GvNAMELEN(oldgv), GvNAMEUTF8(oldgv) ? SV_CATUTF8 : SV_CATBYTES);
 
                old_data = hv_fetch_ent(DBsub, old_full_name, 0, 0);
 
-               SvREFCNT_dec(old_full_name);
-
                if (old_data && HeVAL(old_data)) {
-                       SV* new_full_name = newSVpvn_flags(HvNAME(stash), HvNAMELEN_get(stash), HvNAMEUTF8(stash) ? SVf_UTF8 : 0);
+                       SV* new_full_name = sv_2mortal(newSVpvn_flags(HvNAME(stash), HvNAMELEN_get(stash), HvNAMEUTF8(stash) ? SVf_UTF8 : 0));
                        sv_catpvn(new_full_name, "::", 2);
                        sv_catpvn_flags(new_full_name, nameptr, s - nameptr, utf8flag ? SV_CATUTF8 : SV_CATBYTES);
                        SvREFCNT_inc(HeVAL(old_data));
                        if (hv_store_ent(DBsub, new_full_name, HeVAL(old_data), 0) != NULL)
                                SvREFCNT_inc(HeVAL(old_data));
-                       SvREFCNT_dec(new_full_name);
                }
        }