From: Marcus Holland-Moritz Date: Fri, 4 Jan 2008 01:06:10 +0000 (+0000) Subject: Add macros mPUSHs() and mXPUSHs() for pushing SVs on the stack X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6e449a3ab1e3bd9d7e138ca681c733e57d4daa49;p=p5sagit%2Fp5-mst-13.2.git Add macros mPUSHs() and mXPUSHs() for pushing SVs on the stack and mortalizing them. Use these macros where possible. And also mX?PUSH[inpu] where possible. p4raw-id: //depot/perl@32821 --- diff --git a/av.c b/av.c index fcb63e5..343274f 100644 --- a/av.c +++ b/av.c @@ -77,7 +77,7 @@ Perl_av_extend(pTHX_ AV *av, I32 key) PUSHMARK(SP); EXTEND(SP,2); PUSHs(SvTIED_obj((SV*)av, mg)); - PUSHs(sv_2mortal(newSViv(key+1))); + mPUSHi(key + 1); PUTBACK; call_method("EXTEND", G_SCALAR|G_DISCARD); POPSTACK; @@ -762,7 +762,7 @@ Perl_av_fill(pTHX_ register AV *av, I32 fill) PUSHMARK(SP); EXTEND(SP,2); PUSHs(SvTIED_obj((SV*)av, mg)); - PUSHs(sv_2mortal(newSViv(fill+1))); + mPUSHi(fill + 1); PUTBACK; call_method("STORESIZE", G_SCALAR|G_DISCARD); POPSTACK; diff --git a/mg.c b/mg.c index ce5b99c..d7c68c5 100644 --- a/mg.c +++ b/mg.c @@ -1607,12 +1607,12 @@ S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int if (n > 1) { if (mg->mg_ptr) { if (mg->mg_len >= 0) - PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP)); + mPUSHp(mg->mg_ptr, mg->mg_len); else if (mg->mg_len == HEf_SVKEY) PUSHs((SV*)mg->mg_ptr); } else if (mg->mg_type == PERL_MAGIC_tiedelem) { - PUSHs(sv_2mortal(newSViv(mg->mg_len))); + mPUSHi(mg->mg_len); } } if (n > 2) { diff --git a/mro.c b/mro.c index 9c57b79..77112e1 100644 --- a/mro.c +++ b/mro.c @@ -822,7 +822,7 @@ XS(XS_mro_get_isarev) while((iter = hv_iternext(isarev))) av_push(ret_array, newSVsv(hv_iterkeysv(iter))); } - XPUSHs(sv_2mortal(newRV_noinc((SV*)ret_array))); + mXPUSHs(newRV_noinc((SV*)ret_array)); PUTBACK; return; @@ -912,9 +912,7 @@ XS(XS_mro_get_pkg_gen) SP -= items; - XPUSHs(sv_2mortal(newSViv( - class_stash ? HvMROMETA(class_stash)->pkg_gen : 0 - ))); + mXPUSHi(class_stash ? HvMROMETA(class_stash)->pkg_gen : 0); PUTBACK; return; @@ -1041,7 +1039,7 @@ XS(XS_mro_nextcan) Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname); XSRETURN_EMPTY; } - XPUSHs(sv_2mortal(newRV_inc(val))); + mXPUSHs(newRV_inc(val)); XSRETURN(1); } } @@ -1102,7 +1100,7 @@ XS(XS_mro_nextcan) if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) { SvREFCNT_inc_simple_void_NN((SV*)cand_cv); (void)hv_store_ent(nmcache, newSVsv(sv), (SV*)cand_cv, 0); - XPUSHs(sv_2mortal(newRV_inc((SV*)cand_cv))); + mXPUSHs(newRV_inc((SV*)cand_cv)); XSRETURN(1); } } diff --git a/perl.c b/perl.c index 6095df7..abebfa6 100644 --- a/perl.c +++ b/perl.c @@ -2522,7 +2522,7 @@ Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv) PUSHMARK(SP); if (argv) { while (*argv) { - XPUSHs(sv_2mortal(newSVpv(*argv,0))); + mXPUSHs(newSVpv(*argv,0)); argv++; } PUTBACK; diff --git a/pp.c b/pp.c index 7e5cef3..b4e81d6 100644 --- a/pp.c +++ b/pp.c @@ -4251,8 +4251,8 @@ PP(pp_anonlist) const I32 items = SP - MARK; SV * const av = (SV *) av_make(items, MARK+1); SP = ORIGMARK; /* av_make() might realloc stack_sp */ - XPUSHs(sv_2mortal((PL_op->op_flags & OPf_SPECIAL) - ? newRV_noinc(av) : av)); + mXPUSHs((PL_op->op_flags & OPf_SPECIAL) + ? newRV_noinc(av) : av); RETURN; } @@ -4271,8 +4271,8 @@ PP(pp_anonhash) (void)hv_store_ent(hv,key,val,0); } SP = ORIGMARK; - XPUSHs(sv_2mortal((PL_op->op_flags & OPf_SPECIAL) - ? newRV_noinc((SV*) hv) : (SV*)hv)); + mXPUSHs((PL_op->op_flags & OPf_SPECIAL) + ? newRV_noinc((SV*) hv) : (SV*) hv); RETURN; } diff --git a/pp.h b/pp.h index 9abd962..c2cf691 100644 --- a/pp.h +++ b/pp.h @@ -224,6 +224,11 @@ called to declare it. Do not call multiple C-oriented macros to return lists from XSUB's - see C instead. See also C and C. +=for apidoc Am|void|mPUSHs|SV* sv +Push an SV onto the stack and mortalizes the SV. The stack must have room +for this element. Does not handle 'set' magic. Does not use C. +See also C and C. + =for apidoc Am|void|PUSHmortal Push a new mortal SV onto the stack. The stack must have room for this element. Does not handle 'set' magic. Does not use C. See also @@ -249,6 +254,11 @@ Push an unsigned integer onto the stack. The stack must have room for this element. Handles 'set' magic. Does not use C. See also C, C and C. +=for apidoc Am|void|mXPUSHs|SV* sv +Push an SV onto the stack, extending the stack if necessary and mortalizes +the SV. Does not handle 'set' magic. Does not use C. See also +C and C. + =for apidoc Am|void|XPUSHmortal Push a new mortal SV onto the stack, extending the stack if necessary. Does not handle 'set' magic. Does not use C. See also C, @@ -303,12 +313,14 @@ and C. #define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END #define XPUSHundef STMT_START { SvOK_off(TARG); XPUSHs(TARG); } STMT_END +#define mPUSHs(s) PUSHs(sv_2mortal(s)) #define PUSHmortal PUSHs(sv_newmortal()) #define mPUSHp(p,l) sv_setpvn_mg(PUSHmortal, (p), (l)) #define mPUSHn(n) sv_setnv_mg(PUSHmortal, (NV)(n)) #define mPUSHi(i) sv_setiv_mg(PUSHmortal, (IV)(i)) #define mPUSHu(u) sv_setuv_mg(PUSHmortal, (UV)(u)) +#define mXPUSHs(s) XPUSHs(sv_2mortal(s)) #define XPUSHmortal XPUSHs(sv_newmortal()) #define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END #define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END diff --git a/pp_ctl.c b/pp_ctl.c index e1ad0e9..36e02df 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -253,7 +253,7 @@ PP(pp_substcont) SvPV_set(dstr, NULL); TAINT_IF(cx->sb_rxtainted & 1); - PUSHs(sv_2mortal(newSViv(saviters - 1))); + mPUSHi(saviters - 1); (void)SvPOK_only_UTF8(targ); TAINT_IF(cx->sb_rxtainted); @@ -925,7 +925,7 @@ PP(pp_grepstart) if (PL_stack_base + *PL_markstack_ptr == SP) { (void)POPMARK; if (GIMME_V == G_SCALAR) - XPUSHs(sv_2mortal(newSViv(0))); + mXPUSHi(0); RETURNOP(PL_op->op_next->op_next); } PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1; @@ -1628,9 +1628,9 @@ PP(pp_caller) if (!stashname) PUSHs(&PL_sv_undef); else - PUSHs(sv_2mortal(newSVpv(stashname, 0))); - PUSHs(sv_2mortal(newSVpv(OutCopFILE(cx->blk_oldcop), 0))); - PUSHs(sv_2mortal(newSViv((I32)CopLINE(cx->blk_oldcop)))); + mPUSHs(newSVpv(stashname, 0)); + mPUSHs(newSVpv(OutCopFILE(cx->blk_oldcop), 0)); + mPUSHi((I32)CopLINE(cx->blk_oldcop)); if (!MAXARG) RETURN; if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) { @@ -1639,23 +1639,23 @@ PP(pp_caller) if (isGV(cvgv)) { SV * const sv = newSV(0); gv_efullname3(sv, cvgv, NULL); - PUSHs(sv_2mortal(sv)); - PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs))); + mPUSHs(sv); + mPUSHi((I32)cx->blk_sub.hasargs); } else { PUSHs(newSVpvs_flags("(unknown)", SVs_TEMP)); - PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs))); + mPUSHi((I32)cx->blk_sub.hasargs); } } else { PUSHs(newSVpvs_flags("(eval)", SVs_TEMP)); - PUSHs(sv_2mortal(newSViv(0))); + mPUSHi(0); } gimme = (I32)cx->blk_gimme; if (gimme == G_VOID) PUSHs(&PL_sv_undef); else - PUSHs(sv_2mortal(newSViv(gimme & G_ARRAY))); + mPUSHi(gimme & G_ARRAY); if (CxTYPE(cx) == CXt_EVAL) { /* eval STRING */ if (cx->blk_eval.old_op_type == OP_ENTEREVAL) { @@ -1664,7 +1664,7 @@ PP(pp_caller) } /* require */ else if (cx->blk_eval.old_namesv) { - PUSHs(sv_2mortal(newSVsv(cx->blk_eval.old_namesv))); + mPUSHs(newSVsv(cx->blk_eval.old_namesv)); PUSHs(&PL_sv_yes); } /* eval BLOCK (try blocks have old_namesv == 0) */ @@ -1698,7 +1698,7 @@ PP(pp_caller) /* XXX only hints propagated via op_private are currently * visible (others are not easily accessible, since they * use the global PL_hints) */ - PUSHs(sv_2mortal(newSViv(CopHINTS_get(cx->blk_oldcop)))); + mPUSHi(CopHINTS_get(cx->blk_oldcop)); { SV * mask ; STRLEN * const old_warnings = cx->blk_oldcop->cop_warnings ; @@ -1721,7 +1721,7 @@ PP(pp_caller) } else mask = newSVpvn((char *) (old_warnings + 1), old_warnings[0]); - PUSHs(sv_2mortal(mask)); + mPUSHs(mask); } PUSHs(cx->blk_oldcop->cop_hints_hash ? @@ -4682,7 +4682,7 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen) DEFSV = upstream; PUSHMARK(SP); - PUSHs(sv_2mortal(newSViv(0))); + mPUSHi(0); if (filter_state) { PUSHs(filter_state); } diff --git a/pp_hot.c b/pp_hot.c index efdb8a4..e1d8621 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -43,7 +43,7 @@ PP(pp_const) /* This is a const op added to hold the hints hash for pp_entereval. The hash can be modified by the code being eval'ed, so we return a copy instead. */ - XPUSHs(sv_2mortal((SV*)Perl_hv_copy_hints_hv(aTHX_ (HV*)cSVOP_sv))); + mXPUSHs((SV*)Perl_hv_copy_hints_hv(aTHX_ (HV*)cSVOP_sv)); else /* Normal const. */ XPUSHs(cSVOP_sv); @@ -2251,7 +2251,7 @@ PP(pp_subst) } TAINT_IF(rxtainted & 1); SPAGAIN; - PUSHs(sv_2mortal(newSViv((I32)iters))); + mPUSHi((I32)iters); } (void)SvPOK_only_UTF8(TARG); TAINT_IF(rxtainted); @@ -2337,7 +2337,7 @@ PP(pp_subst) TAINT_IF(rxtainted & 1); SPAGAIN; - PUSHs(sv_2mortal(newSViv((I32)iters))); + mPUSHi((I32)iters); (void)SvPOK_only(TARG); if (doutf8) diff --git a/pp_pack.c b/pp_pack.c index 21e6494..7bf1ce1 100644 --- a/pp_pack.c +++ b/pp_pack.c @@ -1293,7 +1293,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c sv = from <= s ? newSVuv( u8 ? (UV) utf8_length((const U8*)from, (const U8*)s) : (UV) (s-from)) : newSViv(-(u8 ? (IV) utf8_length((const U8*)s, (const U8*)from) : (IV) (from-s))); - XPUSHs(sv_2mortal(sv)); + mXPUSHs(sv); break; } #ifdef PERL_PACK_CAN_SHRIEKSIGN @@ -1443,7 +1443,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c if (!(symptr->flags & FLAG_WAS_UTF8)) sv_utf8_downgrade(sv, 0); } - XPUSHs(sv_2mortal(sv)); + mXPUSHs(sv); s += len; break; case 'B': @@ -1586,7 +1586,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c if (aint >= 128 && datumtype != 'C') /* fake up signed chars */ aint -= 256; if (!checksum) - PUSHs(sv_2mortal(newSViv((IV)aint))); + mPUSHi(aint); else if (checksum > bits_in_uv) cdouble += (NV)aint; else @@ -1604,7 +1604,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c Perl_croak(aTHX_ "Malformed UTF-8 string in unpack"); s += retlen; if (!checksum) - PUSHs(sv_2mortal(newSVuv((UV) val))); + mPUSHu(val); else if (checksum > bits_in_uv) cdouble += (NV) val; else @@ -1613,7 +1613,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c } else if (!checksum) while (len-- > 0) { const U8 ch = *(U8 *) s++; - PUSHs(sv_2mortal(newSVuv((UV) ch))); + mPUSHu(ch); } else if (checksum > bits_in_uv) while (len-- > 0) cdouble += (NV) *(U8 *) s++; @@ -1661,7 +1661,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c s += retlen; } if (!checksum) - PUSHs(sv_2mortal(newSVuv((UV) auv))); + mPUSHu(auv); else if (checksum > bits_in_uv) cdouble += (NV) auv; else @@ -1675,7 +1675,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, ashort, datumtype); DO_BO_UNPACK(ashort, s); if (!checksum) - PUSHs(sv_2mortal(newSViv((IV)ashort))); + mPUSHi(ashort); else if (checksum > bits_in_uv) cdouble += (NV)ashort; else @@ -1699,7 +1699,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c ai16 -= 65536; #endif if (!checksum) - PUSHs(sv_2mortal(newSViv((IV)ai16))); + mPUSHi(ai16); else if (checksum > bits_in_uv) cdouble += (NV)ai16; else @@ -1713,7 +1713,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, aushort, datumtype); DO_BO_UNPACK(aushort, s); if (!checksum) - PUSHs(sv_2mortal(newSVuv((UV) aushort))); + mPUSHu(aushort); else if (checksum > bits_in_uv) cdouble += (NV)aushort; else @@ -1742,7 +1742,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c au16 = vtohs(au16); #endif if (!checksum) - PUSHs(sv_2mortal(newSVuv((UV)au16))); + mPUSHu(au16); else if (checksum > bits_in_uv) cdouble += (NV) au16; else @@ -1767,7 +1767,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c ai16 = (I16) vtohs((U16) ai16); # endif /* HAS_VTOHS */ if (!checksum) - PUSHs(sv_2mortal(newSViv((IV)ai16))); + mPUSHi(ai16); else if (checksum > bits_in_uv) cdouble += (NV) ai16; else @@ -1782,7 +1782,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, aint, datumtype); DO_BO_UNPACK(aint, i); if (!checksum) - PUSHs(sv_2mortal(newSViv((IV)aint))); + mPUSHi(aint); else if (checksum > bits_in_uv) cdouble += (NV)aint; else @@ -1796,7 +1796,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, auint, datumtype); DO_BO_UNPACK(auint, i); if (!checksum) - PUSHs(sv_2mortal(newSVuv((UV)auint))); + mPUSHu(auint); else if (checksum > bits_in_uv) cdouble += (NV)auint; else @@ -1817,7 +1817,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c Perl_croak(aTHX_ "'j' not supported on this platform"); #endif if (!checksum) - PUSHs(sv_2mortal(newSViv(aiv))); + mPUSHi(aiv); else if (checksum > bits_in_uv) cdouble += (NV)aiv; else @@ -1838,7 +1838,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c Perl_croak(aTHX_ "'J' not supported on this platform"); #endif if (!checksum) - PUSHs(sv_2mortal(newSVuv(auv))); + mPUSHu(auv); else if (checksum > bits_in_uv) cdouble += (NV)auv; else @@ -1852,7 +1852,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, along, datumtype); DO_BO_UNPACK(along, l); if (!checksum) - PUSHs(sv_2mortal(newSViv((IV)along))); + mPUSHi(along); else if (checksum > bits_in_uv) cdouble += (NV)along; else @@ -1874,7 +1874,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c if (ai32 > 2147483647) ai32 -= 4294967296; #endif if (!checksum) - PUSHs(sv_2mortal(newSViv((IV)ai32))); + mPUSHi(ai32); else if (checksum > bits_in_uv) cdouble += (NV)ai32; else @@ -1888,7 +1888,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, aulong, datumtype); DO_BO_UNPACK(aulong, l); if (!checksum) - PUSHs(sv_2mortal(newSVuv((UV)aulong))); + mPUSHu(aulong); else if (checksum > bits_in_uv) cdouble += (NV)aulong; else @@ -1917,7 +1917,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c au32 = vtohl(au32); #endif if (!checksum) - PUSHs(sv_2mortal(newSVuv((UV)au32))); + mPUSHu(au32); else if (checksum > bits_in_uv) cdouble += (NV)au32; else @@ -1942,7 +1942,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c ai32 = (I32)vtohl((U32)ai32); # endif if (!checksum) - PUSHs(sv_2mortal(newSViv((IV)ai32))); + mPUSHi(ai32); else if (checksum > bits_in_uv) cdouble += (NV)ai32; else @@ -1956,7 +1956,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, aptr, datumtype); DO_BO_UNPACK_PC(aptr); /* newSVpv generates undef if aptr is NULL */ - PUSHs(sv_2mortal(newSVpv(aptr, 0))); + mPUSHs(newSVpv(aptr, 0)); } break; case 'w': @@ -1971,7 +1971,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c /* UTF8_IS_XXXXX not right here - using constant 0x80 */ if (ch < 0x80) { bytes = 0; - PUSHs(sv_2mortal(newSVuv(auv))); + mPUSHu(auv); len--; auv = 0; continue; @@ -1992,7 +1992,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c while (*t == '0') t++; sv_chop(sv, t); - PUSHs(sv_2mortal(sv)); + mPUSHs(sv); len--; auv = 0; } @@ -2020,8 +2020,8 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, aquad, datumtype); DO_BO_UNPACK(aquad, 64); if (!checksum) - PUSHs(sv_2mortal(aquad >= IV_MIN && aquad <= IV_MAX ? - newSViv((IV)aquad) : newSVnv((NV)aquad))); + mPUSHs(aquad >= IV_MIN && aquad <= IV_MAX ? + newSViv((IV)aquad) : newSVnv((NV)aquad)); else if (checksum > bits_in_uv) cdouble += (NV)aquad; else @@ -2034,8 +2034,8 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, auquad, datumtype); DO_BO_UNPACK(auquad, 64); if (!checksum) - PUSHs(sv_2mortal(auquad <= UV_MAX ? - newSVuv((UV)auquad):newSVnv((NV)auquad))); + mPUSHs(auquad <= UV_MAX ? + newSVuv((UV)auquad) : newSVnv((NV)auquad)); else if (checksum > bits_in_uv) cdouble += (NV)auquad; else @@ -2050,7 +2050,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, afloat, datumtype); DO_BO_UNPACK_N(afloat, float); if (!checksum) - PUSHs(sv_2mortal(newSVnv((NV)afloat))); + mPUSHn(afloat); else cdouble += afloat; } @@ -2061,7 +2061,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, adouble, datumtype); DO_BO_UNPACK_N(adouble, double); if (!checksum) - PUSHs(sv_2mortal(newSVnv((NV)adouble))); + mPUSHn(adouble); else cdouble += adouble; } @@ -2072,7 +2072,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, anv, datumtype); DO_BO_UNPACK_N(anv, NV); if (!checksum) - PUSHs(sv_2mortal(newSVnv(anv))); + mPUSHn(anv); else cdouble += anv; } @@ -2084,7 +2084,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c SHIFT_VAR(utf8, s, strend, aldouble, datumtype); DO_BO_UNPACK_N(aldouble, long double); if (!checksum) - PUSHs(sv_2mortal(newSVnv((NV)aldouble))); + mPUSHn(aldouble); else cdouble += aldouble; } @@ -2187,7 +2187,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c } sv = newSVuv(cuv); } - XPUSHs(sv_2mortal(sv)); + mXPUSHs(sv); checksum = 0; } diff --git a/pp_sys.c b/pp_sys.c index f7c37dd..3ee3384 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -342,7 +342,7 @@ PP(pp_backtick) SvREFCNT_dec(sv); break; } - XPUSHs(sv_2mortal(sv)); + mXPUSHs(sv); if (SvLEN(sv) - SvCUR(sv) > 20) { SvPV_shrink_to_cur(sv); } @@ -888,7 +888,7 @@ PP(pp_untie) if (gv && isGV(gv) && (cv = GvCV(gv))) { PUSHMARK(SP); XPUSHs(SvTIED_obj((SV*)gv, mg)); - XPUSHs(sv_2mortal(newSViv(SvREFCNT(obj)-1))); + mXPUSHi(SvREFCNT(obj) - 1); PUTBACK; ENTER; call_sv((SV *)cv, G_VOID); @@ -953,9 +953,9 @@ PP(pp_dbmopen) PUSHs(sv); PUSHs(left); if (SvIV(right)) - PUSHs(sv_2mortal(newSVuv(O_RDWR|O_CREAT))); + mPUSHu(O_RDWR|O_CREAT); else - PUSHs(sv_2mortal(newSVuv(O_RDWR))); + mPUSHu(O_RDWR); PUSHs(right); PUTBACK; call_sv((SV*)GvCV(gv), G_SCALAR); @@ -966,7 +966,7 @@ PP(pp_dbmopen) PUSHMARK(SP); PUSHs(sv); PUSHs(left); - PUSHs(sv_2mortal(newSVuv(O_RDONLY))); + mPUSHu(O_RDONLY); PUSHs(right); PUTBACK; call_sv((SV*)GvCV(gv), G_SCALAR); @@ -1137,7 +1137,7 @@ PP(pp_sselect) if (GIMME == G_ARRAY && tbuf) { value = (NV)(timebuf.tv_sec) + (NV)(timebuf.tv_usec) / 1000000.0; - PUSHs(sv_2mortal(newSVnv(value))); + mPUSHn(value); } RETURN; #else @@ -1174,7 +1174,7 @@ PP(pp_select) XPUSHTARG; } else { - XPUSHs(sv_2mortal(newRV((SV*)egv))); + mXPUSHs(newRV((SV*)egv)); } } @@ -2100,11 +2100,11 @@ PP(pp_sysseek) PUSHMARK(SP); XPUSHs(SvTIED_obj((SV*)io, mg)); #if LSEEKSIZE > IVSIZE - XPUSHs(sv_2mortal(newSVnv((NV) offset))); + mXPUSHn((NV) offset); #else - XPUSHs(sv_2mortal(newSViv(offset))); + mXPUSHi(offset); #endif - XPUSHs(sv_2mortal(newSViv(whence))); + mXPUSHi(whence); PUTBACK; ENTER; call_method("SEEK", G_SCALAR); @@ -2128,7 +2128,7 @@ PP(pp_sysseek) newSViv(sought) #endif : newSVpvn(zero_but_true, ZBTLEN); - PUSHs(sv_2mortal(sv)); + mPUSHs(sv); } } RETURN; @@ -2873,50 +2873,50 @@ PP(pp_stat) if (max) { EXTEND(SP, max); EXTEND_MORTAL(max); - PUSHs(sv_2mortal(newSViv(PL_statcache.st_dev))); - PUSHs(sv_2mortal(newSViv(PL_statcache.st_ino))); - PUSHs(sv_2mortal(newSVuv(PL_statcache.st_mode))); - PUSHs(sv_2mortal(newSVuv(PL_statcache.st_nlink))); + mPUSHi(PL_statcache.st_dev); + mPUSHi(PL_statcache.st_ino); + mPUSHu(PL_statcache.st_mode); + mPUSHu(PL_statcache.st_nlink); #if Uid_t_size > IVSIZE - PUSHs(sv_2mortal(newSVnv(PL_statcache.st_uid))); + mPUSHn(PL_statcache.st_uid); #else # if Uid_t_sign <= 0 - PUSHs(sv_2mortal(newSViv(PL_statcache.st_uid))); + mPUSHi(PL_statcache.st_uid); # else - PUSHs(sv_2mortal(newSVuv(PL_statcache.st_uid))); + mPUSHu(PL_statcache.st_uid); # endif #endif #if Gid_t_size > IVSIZE - PUSHs(sv_2mortal(newSVnv(PL_statcache.st_gid))); + mPUSHn(PL_statcache.st_gid); #else # if Gid_t_sign <= 0 - PUSHs(sv_2mortal(newSViv(PL_statcache.st_gid))); + mPUSHi(PL_statcache.st_gid); # else - PUSHs(sv_2mortal(newSVuv(PL_statcache.st_gid))); + mPUSHu(PL_statcache.st_gid); # endif #endif #ifdef USE_STAT_RDEV - PUSHs(sv_2mortal(newSViv(PL_statcache.st_rdev))); + mPUSHi(PL_statcache.st_rdev); #else PUSHs(newSVpvs_flags("", SVs_TEMP)); #endif #if Off_t_size > IVSIZE - PUSHs(sv_2mortal(newSVnv((NV)PL_statcache.st_size))); + mPUSHn(PL_statcache.st_size); #else - PUSHs(sv_2mortal(newSViv(PL_statcache.st_size))); + mPUSHi(PL_statcache.st_size); #endif #ifdef BIG_TIME - PUSHs(sv_2mortal(newSVnv(PL_statcache.st_atime))); - PUSHs(sv_2mortal(newSVnv(PL_statcache.st_mtime))); - PUSHs(sv_2mortal(newSVnv(PL_statcache.st_ctime))); + mPUSHn(PL_statcache.st_atime); + mPUSHn(PL_statcache.st_mtime); + mPUSHn(PL_statcache.st_ctime); #else - PUSHs(sv_2mortal(newSViv((IV)PL_statcache.st_atime))); - PUSHs(sv_2mortal(newSViv((IV)PL_statcache.st_mtime))); - PUSHs(sv_2mortal(newSViv((IV)PL_statcache.st_ctime))); + mPUSHi(PL_statcache.st_atime); + mPUSHi(PL_statcache.st_mtime); + mPUSHi(PL_statcache.st_ctime); #endif #ifdef USE_STAT_BLOCKS - PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blksize))); - PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blocks))); + mPUSHu(PL_statcache.st_blksize); + mPUSHu(PL_statcache.st_blocks); #else PUSHs(newSVpvs_flags("", SVs_TEMP)); PUSHs(newSVpvs_flags("", SVs_TEMP)); @@ -3812,7 +3812,7 @@ PP(pp_readdir) if (!(IoFLAGS(io) & IOf_UNTAINT)) SvTAINTED_on(sv); #endif - XPUSHs(sv_2mortal(sv)); + mXPUSHs(sv); } while (gimme == G_ARRAY); if (!dp && gimme != G_ARRAY) @@ -4367,22 +4367,22 @@ PP(pp_tms) /* is returned. */ #endif - PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick))); + mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick); if (GIMME == G_ARRAY) { - PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick))); - PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick))); - PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick))); + mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick); + mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick); + mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick); } RETURN; #else # ifdef PERL_MICRO dSP; - PUSHs(sv_2mortal(newSVnv((NV)0.0))); + mPUSHn(0.0); EXTEND(SP, 4); if (GIMME == G_ARRAY) { - PUSHs(sv_2mortal(newSVnv((NV)0.0))); - PUSHs(sv_2mortal(newSVnv((NV)0.0))); - PUSHs(sv_2mortal(newSVnv((NV)0.0))); + mPUSHn(0.0); + mPUSHn(0.0); + mPUSHn(0.0); } RETURN; # else @@ -4475,20 +4475,20 @@ PP(pp_gmtime) tmbuf->tm_min, tmbuf->tm_sec, tmbuf->tm_year + 1900); - PUSHs(sv_2mortal(tsv)); + mPUSHs(tsv); } else if (tmbuf) { EXTEND(SP, 9); EXTEND_MORTAL(9); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_sec))); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_min))); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_hour))); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_mday))); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_mon))); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_year))); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_wday))); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_yday))); - PUSHs(sv_2mortal(newSViv(tmbuf->tm_isdst))); + mPUSHi(tmbuf->tm_sec); + mPUSHi(tmbuf->tm_min); + mPUSHi(tmbuf->tm_hour); + mPUSHi(tmbuf->tm_mday); + mPUSHi(tmbuf->tm_mon); + mPUSHi(tmbuf->tm_year); + mPUSHi(tmbuf->tm_wday); + mPUSHi(tmbuf->tm_yday); + mPUSHi(tmbuf->tm_isdst); } RETURN; } @@ -4690,14 +4690,14 @@ PP(pp_ghostent) } if (hent) { - PUSHs(sv_2mortal(newSVpv((char*)hent->h_name, 0))); + mPUSHs(newSVpv((char*)hent->h_name, 0)); PUSHs(space_join_names_mortal(hent->h_aliases)); - PUSHs(sv_2mortal(newSViv((IV)hent->h_addrtype))); + mPUSHi(hent->h_addrtype); len = hent->h_length; - PUSHs(sv_2mortal(newSViv((IV)len))); + mPUSHi(len); #ifdef h_addr for (elem = hent->h_addr_list; elem && *elem; elem++) { - XPUSHs(newSVpvn_flags(*elem, len, SVs_TEMP)); + mXPUSHp(*elem, len); } #else if (hent->h_addr) @@ -4773,10 +4773,10 @@ PP(pp_gnetent) } if (nent) { - PUSHs(sv_2mortal(newSVpv(nent->n_name, 0))); + mPUSHs(newSVpv(nent->n_name, 0)); PUSHs(space_join_names_mortal(nent->n_aliases)); - PUSHs(sv_2mortal(newSViv((IV)nent->n_addrtype))); - PUSHs(sv_2mortal(newSViv((IV)nent->n_net))); + mPUSHi(nent->n_addrtype); + mPUSHi(nent->n_net); } RETURN; @@ -4834,9 +4834,9 @@ PP(pp_gprotoent) } if (pent) { - PUSHs(sv_2mortal(newSVpv(pent->p_name, 0))); + mPUSHs(newSVpv(pent->p_name, 0)); PUSHs(space_join_names_mortal(pent->p_aliases)); - PUSHs(sv_2mortal(newSViv((IV)pent->p_proto))); + mPUSHi(pent->p_proto); } RETURN; @@ -4904,14 +4904,14 @@ PP(pp_gservent) } if (sent) { - PUSHs(sv_2mortal(newSVpv(sent->s_name, 0))); + mPUSHs(newSVpv(sent->s_name, 0)); PUSHs(space_join_names_mortal(sent->s_aliases)); #ifdef HAS_NTOHS - PUSHs(sv_2mortal(newSViv((IV)PerlSock_ntohs(sent->s_port)))); + mPUSHi(PerlSock_ntohs(sent->s_port)); #else - PUSHs(sv_2mortal(newSViv((IV)(sent->s_port)))); + mPUSHi(sent->s_port); #endif - PUSHs(sv_2mortal(newSVpv(sent->s_proto, 0))); + mPUSHs(newSVpv(sent->s_proto, 0)); } RETURN; @@ -5127,9 +5127,10 @@ PP(pp_gpwent) } if (pwent) { - PUSHs(sv_2mortal(newSVpv(pwent->pw_name, 0))); + mPUSHs(newSVpv(pwent->pw_name, 0)); - PUSHs(sv = sv_2mortal(newSViv(0))); + sv = newSViv(0); + mPUSHs(sv); /* If we have getspnam(), we try to dig up the shadow * password. If we are underprivileged, the shadow * interface will set the errno to EACCES or similar, @@ -5173,15 +5174,15 @@ PP(pp_gpwent) # endif # if Uid_t_sign <= 0 - PUSHs(sv_2mortal(newSViv((IV)pwent->pw_uid))); + mPUSHi(pwent->pw_uid); # else - PUSHs(sv_2mortal(newSVuv((UV)pwent->pw_uid))); + mPUSHu(pwent->pw_uid); # endif # if Uid_t_sign <= 0 - PUSHs(sv_2mortal(newSViv((IV)pwent->pw_gid))); + mPUSHi(pwent->pw_gid); # else - PUSHs(sv_2mortal(newSVuv((UV)pwent->pw_gid))); + mPUSHu(pwent->pw_gid); # endif /* pw_change, pw_quota, and pw_age are mutually exclusive-- * because of the poor interface of the Perl getpw*(), @@ -5189,13 +5190,13 @@ PP(pp_gpwent) * A better interface would have been to return a hash, * but we are accursed by our history, alas. --jhi. */ # ifdef PWCHANGE - PUSHs(sv_2mortal(newSViv((IV)pwent->pw_change))); + mPUSHi(pwent->pw_change); # else # ifdef PWQUOTA - PUSHs(sv_2mortal(newSViv((IV)pwent->pw_quota))); + mPUSHi(pwent->pw_quota); # else # ifdef PWAGE - PUSHs(sv_2mortal(newSVpv(pwent->pw_age, 0))); + mPUSHs(newSVpv(pwent->pw_age, 0)); # else /* I think that you can never get this compiled, but just in case. */ PUSHs(sv_mortalcopy(&PL_sv_no)); @@ -5206,10 +5207,10 @@ PP(pp_gpwent) /* pw_class and pw_comment are mutually exclusive--. * see the above note for pw_change, pw_quota, and pw_age. */ # ifdef PWCLASS - PUSHs(sv_2mortal(newSVpv(pwent->pw_class, 0))); + mPUSHs(newSVpv(pwent->pw_class, 0)); # else # ifdef PWCOMMENT - PUSHs(sv_2mortal(newSVpv(pwent->pw_comment, 0))); + mPUSHs(newSVpv(pwent->pw_comment, 0)); # else /* I think that you can never get this compiled, but just in case. */ PUSHs(sv_mortalcopy(&PL_sv_no)); @@ -5226,7 +5227,7 @@ PP(pp_gpwent) SvTAINTED_on(sv); # endif - PUSHs(sv_2mortal(newSVpv(pwent->pw_dir, 0))); + mPUSHs(newSVpv(pwent->pw_dir, 0)); PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0))); # ifndef INCOMPLETE_TAINTS @@ -5235,7 +5236,7 @@ PP(pp_gpwent) # endif # ifdef PWEXPIRE - PUSHs(sv_2mortal(newSViv((IV)pwent->pw_expire))); + mPUSHi(pwent->pw_expire); # endif } RETURN; @@ -5303,15 +5304,15 @@ PP(pp_ggrent) } if (grent) { - PUSHs(sv_2mortal(newSVpv(grent->gr_name, 0))); + mPUSHs(newSVpv(grent->gr_name, 0)); #ifdef GRPASSWD - PUSHs(sv_2mortal(newSVpv(grent->gr_passwd, 0))); + mPUSHs(newSVpv(grent->gr_passwd, 0)); #else PUSHs(sv_mortalcopy(&PL_sv_no)); #endif - PUSHs(sv_2mortal(newSViv((IV)grent->gr_gid))); + mPUSHi(grent->gr_gid); #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API)) /* In UNICOS/mk (_CRAYMPP) the multithreading diff --git a/sv.c b/sv.c index e348643..b514753 100644 --- a/sv.c +++ b/sv.c @@ -10912,7 +10912,7 @@ do_mark_cloneable_stash(pTHX_ SV *sv) ENTER; SAVETMPS; PUSHMARK(SP); - XPUSHs(sv_2mortal(newSVhek(hvname))); + mXPUSHs(newSVhek(hvname)); PUTBACK; call_sv((SV*)GvCV(cloner), G_SCALAR); SPAGAIN; @@ -11667,7 +11667,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, ENTER; SAVETMPS; PUSHMARK(SP); - XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash)))); + mXPUSHs(newSVhek(HvNAME_HEK(stash))); PUTBACK; call_sv((SV*)GvCV(cloner), G_DISCARD); FREETMPS; @@ -11783,8 +11783,9 @@ Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding, XPUSHs(encoding); XPUSHs(dsv); XPUSHs(ssv); - XPUSHs(offsv = sv_2mortal(newSViv(*offset))); - XPUSHs(newSVpvn_flags(tstr, tlen, SVs_TEMP)); + offsv = newSViv(*offset); + mXPUSHs(offsv); + mXPUSHp(tstr, tlen); PUTBACK; call_method("cat_decode", G_SCALAR); SPAGAIN; diff --git a/universal.c b/universal.c index 50a76d6..7d1bd55 100644 --- a/universal.c +++ b/universal.c @@ -158,7 +158,7 @@ Perl_sv_does(pTHX_ SV *sv, const char *name) PUSHMARK(SP); XPUSHs(sv); - XPUSHs(sv_2mortal(newSVpv(name, 0))); + mXPUSHs(newSVpv(name, 0)); PUTBACK; methodname = newSVpvs_flags("isa", SVs_TEMP); @@ -487,7 +487,7 @@ XS(XS_version_new) if ( strcmp(classname,"version") != 0 ) /* inherited new() */ sv_bless(rv, gv_stashpv(classname, GV_ADD)); - PUSHs(sv_2mortal(rv)); + mPUSHs(rv); PUTBACK; return; } @@ -510,7 +510,7 @@ XS(XS_version_stringify) else Perl_croak(aTHX_ "lobj is not of type version"); - PUSHs(sv_2mortal(vstringify(lobj))); + mPUSHs(vstringify(lobj)); PUTBACK; return; @@ -534,7 +534,7 @@ XS(XS_version_numify) else Perl_croak(aTHX_ "lobj is not of type version"); - PUSHs(sv_2mortal(vnumify(lobj))); + mPUSHs(vnumify(lobj)); PUTBACK; return; @@ -558,7 +558,7 @@ XS(XS_version_normal) else Perl_croak(aTHX_ "lobj is not of type version"); - PUSHs(sv_2mortal(vnormal(lobj))); + mPUSHs(vnormal(lobj)); PUTBACK; return; @@ -603,7 +603,7 @@ XS(XS_version_vcmp) rs = newSViv(vcmp(lobj,rvs)); } - PUSHs(sv_2mortal(rs)); + mPUSHs(rs); } PUTBACK; @@ -622,7 +622,7 @@ XS(XS_version_boolean) if (sv_derived_from(ST(0), "version")) { SV * const lobj = SvRV(ST(0)); SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) ); - PUSHs(sv_2mortal(rs)); + mPUSHs(rs); PUTBACK; return; } @@ -685,7 +685,7 @@ XS(XS_version_qv) } else { - PUSHs(sv_2mortal(new_version(ver))); + mPUSHs(new_version(ver)); } PUTBACK; @@ -1418,8 +1418,8 @@ XS(XS_Tie_Hash_NamedCapture_flags) if (items != 0) Perl_croak(aTHX_ "Usage: Tie::Hash::NamedCapture::flags()"); - XPUSHs(sv_2mortal(newSVuv(RXapif_ONE))); - XPUSHs(sv_2mortal(newSVuv(RXapif_ALL))); + mXPUSHu(RXapif_ONE); + mXPUSHu(RXapif_ALL); PUTBACK; return; } diff --git a/utf8.c b/utf8.c index e22fe98..440ee76 100644 --- a/utf8.c +++ b/utf8.c @@ -1587,11 +1587,11 @@ Perl_swash_init(pTHX_ const char* pkg, const char* name, SV *listsv, I32 minbits SPAGAIN; PUSHMARK(SP); EXTEND(SP,5); - PUSHs(newSVpvn_flags(pkg, pkg_len, SVs_TEMP)); - PUSHs(newSVpvn_flags(name, name_len, SVs_TEMP)); + mPUSHp(pkg, pkg_len); + mPUSHp(name, name_len); PUSHs(listsv); - PUSHs(sv_2mortal(newSViv(minbits))); - PUSHs(sv_2mortal(newSViv(none))); + mPUSHi(minbits); + mPUSHi(none); PUTBACK; errsv_save = newSVsv(ERRSV); if (call_method("SWASHNEW", G_SCALAR)) diff --git a/util.c b/util.c index 93f9646..980db3c 100644 --- a/util.c +++ b/util.c @@ -1216,7 +1216,7 @@ Perl_write_to_stderr(pTHX_ const char* message, int msglen) PUSHMARK(SP); EXTEND(SP,2); PUSHs(SvTIED_obj((SV*)io, mg)); - PUSHs(newSVpvn_flags(message, msglen, SVs_TEMP)); + mPUSHp(message, msglen); PUTBACK; call_method("PRINT", G_SCALAR);