diff options
-rw-r--r-- | sv.c | 12 | ||||
-rw-r--r-- | sv.h | 3 | ||||
-rw-r--r-- | util.c | 26 |
3 files changed, 24 insertions, 17 deletions
@@ -3417,11 +3417,13 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) SvIsUV_on(dstr); SvIV_set(dstr, SvIVX(sstr)); } - if (SvVOK(sstr)) { - const MAGIC * const smg = mg_find(sstr,PERL_MAGIC_vstring); - sv_magic(dstr, NULL, PERL_MAGIC_vstring, - smg->mg_ptr, smg->mg_len); - SvRMAGICAL_on(dstr); + { + const MAGIC * const smg = SvVOK(sstr); + if (smg) { + sv_magic(dstr, NULL, PERL_MAGIC_vstring, + smg->mg_ptr, smg->mg_len); + SvRMAGICAL_on(dstr); + } } } else if (sflags & SVp_IOK) { @@ -751,7 +751,8 @@ in gv.h: */ SVf_IVisUV), \ SvFLAGS(sv) |= (SVf_POK|SVp_POK)) -#define SvVOK(sv) (SvMAGICAL(sv) && mg_find(sv,'V')) +#define SvVOK(sv) (SvMAGICAL(sv) \ + ? mg_find(sv,PERL_MAGIC_vstring) : NULL) #define SvOOK(sv) (SvFLAGS(sv) & SVf_OOK) #define SvOOK_on(sv) ((void)SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK) #define SvOOK_off(sv) ((void)(SvOOK(sv) && sv_backoff(sv))) @@ -4170,17 +4170,19 @@ Perl_new_version(pTHX_ SV *ver) return rv; } #ifdef SvVOK - if ( SvVOK(ver) ) { /* already a v-string */ - const MAGIC* const mg = mg_find(ver,PERL_MAGIC_vstring); - const STRLEN len = mg->mg_len; - char * const version = savepvn( (const char*)mg->mg_ptr, len); - sv_setpvn(rv,version,len); - Safefree(version); - } - else { + { + const MAGIC* const mg = SvVOK(ver); + if ( mg ) { /* already a v-string */ + const STRLEN len = mg->mg_len; + char * const version = savepvn( (const char*)mg->mg_ptr, len); + sv_setpvn(rv,version,len); + Safefree(version); + } + else { #endif - sv_setsv(rv,ver); /* make a duplicate */ + sv_setsv(rv,ver); /* make a duplicate */ #ifdef SvVOK + } } #endif return upg_version(rv); @@ -4203,6 +4205,9 @@ Perl_upg_version(pTHX_ SV *ver) { const char *version, *s; bool qv = 0; +#ifdef SvVOK + const MAGIC *mg; +#endif if ( SvNOK(ver) ) /* may get too much accuracy */ { @@ -4211,8 +4216,7 @@ Perl_upg_version(pTHX_ SV *ver) version = savepvn(tbuf, len); } #ifdef SvVOK - else if ( SvVOK(ver) ) { /* already a v-string */ - const MAGIC* const mg = mg_find(ver,PERL_MAGIC_vstring); + else if ( (mg = SvVOK(ver)) ) { /* already a v-string */ version = savepvn( (const char*)mg->mg_ptr,mg->mg_len ); qv = 1; } |