X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Name.xs;h=c2c9b3c0f0cd7fea5ec744902c0e0f062f83652c;hb=04f447d361edc7809ad1ae2c945187bab4c29f80;hp=ad305332a7d325ba996bd237ea881fa6157bd6a0;hpb=456cbdf2b59b7c725a0f4119675ef8cb73e4ec83;p=p5sagit%2FSub-Name.git diff --git a/Name.xs b/Name.xs index ad30533..c2c9b3c 100644 --- a/Name.xs +++ b/Name.xs @@ -10,6 +10,8 @@ #define NEED_sv_2pv_flags #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; @@ -50,6 +52,10 @@ static MGVTBL subname_vtbl; #define SV_CATBYTES 0 #endif +#ifndef sv_catpvn_flags +#define sv_catpvn_flags(b,n,l,f) sv_catpvn(b,n,l) +#endif + MODULE = Sub::Name PACKAGE = Sub::Name PROTOTYPES: DISABLE @@ -67,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); @@ -91,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] == '\'') { @@ -120,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); @@ -135,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); } }