summaryrefslogtreecommitdiff
path: root/universal.c
diff options
context:
space:
mode:
Diffstat (limited to 'universal.c')
-rw-r--r--universal.c20
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);
}