diff options
Diffstat (limited to 'universal.c')
-rw-r--r-- | universal.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/universal.c b/universal.c index aeefca80ba..563761eb83 100644 --- a/universal.c +++ b/universal.c @@ -406,7 +406,6 @@ XS(XS_UNIVERSAL_VERSION) GV **gvp; GV *gv; SV *sv; - SV *ret; const char *undef; PERL_UNUSED_ARG(cv); @@ -423,12 +422,16 @@ XS(XS_UNIVERSAL_VERSION) gvp = pkg ? (GV**)hv_fetchs(pkg, "VERSION", FALSE) : NULL; if (gvp && isGV(gv = *gvp) && (sv = GvSV(gv)) && SvOK(sv)) { - ret = sv_newmortal(); - sv_setsv(ret, sv); + SV * const nsv = sv_newmortal(); + sv_setsv(nsv, sv); + sv = nsv; + if ( !sv_derived_from(sv, "version") || !SvROK(sv)) + upg_version(sv, FALSE); + undef = NULL; } else { - sv = ret = &PL_sv_undef; + sv = &PL_sv_undef; undef = "(undef)"; } @@ -449,9 +452,6 @@ XS(XS_UNIVERSAL_VERSION) } } - if ( !sv_derived_from(sv, "version") || !SvROK(sv)) - upg_version(sv, FALSE); - if ( !sv_derived_from(req, "version") || !SvROK(req)) { /* req may very well be R/O, so create a new object */ req = sv_2mortal( new_version(req) ); @@ -475,7 +475,11 @@ XS(XS_UNIVERSAL_VERSION) } - ST(0) = ret; + if ( SvOK(sv) && sv_derived_from(sv, "version") ) { + ST(0) = sv_2mortal(vstringify(sv)); + } else { + ST(0) = sv; + } XSRETURN(1); } |