From a2f871a29d6365cd9bb6b78aff1e44658f81cc1b Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Fri, 8 Oct 2010 14:59:10 +0100 Subject: [PATCH] Refactor xs_version_bootcheck() to remove complex constructions. Replace complex format strings ternary conditionals with an if/else block. Avoid assignment within expressions. Directly use the SV for the module's name, rather than converting it to a char *. --- util.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/util.c b/util.c index e09147f..427f053 100644 --- a/util.c +++ b/util.c @@ -6472,7 +6472,7 @@ Perl_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p, { SV *sv; const char *vn = NULL; - const char *module = SvPV_nolen_const(PL_stack_base[ax]); + SV *const module = PL_stack_base[ax]; PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK; @@ -6480,25 +6480,34 @@ Perl_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p, sv = PL_stack_base[ax + 1]; else { /* XXX GV_ADDWARN */ - sv = get_sv(Perl_form(aTHX_ "%s::%s", module, vn = "XS_VERSION"), 0); - if (!sv || !SvOK(sv)) - sv = get_sv(Perl_form(aTHX_ "%s::%s", module, vn = "VERSION"), 0); + vn = "XS_VERSION"; + sv = get_sv(Perl_form(aTHX_ "%"SVf"::%s", module, vn), 0); + if (!sv || !SvOK(sv)) { + vn = "VERSION"; + sv = get_sv(Perl_form(aTHX_ "%"SVf"::%s", module, vn), 0); + } } if (sv) { - SV *xpt = NULL; SV *xssv = Perl_newSVpvn_flags(aTHX_ xs_p, xs_len, SVs_TEMP); SV *pmsv = sv_derived_from(sv, "version") ? sv : sv_2mortal(new_version(sv)); xssv = upg_version(xssv, 0); if ( vcmp(pmsv,xssv) ) { - xpt = Perl_newSVpvf(aTHX_ "%s object version %"SVf - " does not match %s%s%s%s %"SVf, - module, - SVfARG(Perl_sv_2mortal(aTHX_ vstringify(xssv))), - vn ? "$" : "", vn ? module : "", - vn ? "::" : "", - vn ? vn : "bootstrap parameter", - SVfARG(Perl_sv_2mortal(aTHX_ vstringify(pmsv)))); + SV *string = vstringify(xssv); + SV *xpt = Perl_newSVpvf(aTHX_ "%"SVf" object version %"SVf + " does not match ", module, string); + + SvREFCNT_dec(string); + string = vstringify(pmsv); + + if (vn) { + Perl_sv_catpvf(aTHX_ xpt, "$%"SVf"::%s %"SVf, module, vn, + string); + } else { + Perl_sv_catpvf(aTHX_ xpt, "bootstrap parameter %"SVf, string); + } + SvREFCNT_dec(string); + Perl_sv_2mortal(aTHX_ xpt); Perl_croak_sv(aTHX_ xpt); } -- 1.8.3.1