From: Nicholas Clark Date: Sun, 18 Feb 2007 19:40:43 +0000 (+0000) Subject: Add a new API function newSV_type, to replace the idiom: X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b9f83d2f7c4cb24d96302c6fcaa5e60628fad1f8;p=p5sagit%2Fp5-mst-13.2.git Add a new API function newSV_type, to replace the idiom: sv = newSV(0); sv_upgrade(sv, type); p4raw-id: //depot/perl@30347 --- diff --git a/av.c b/av.c index c6677a9..39b4b7d 100644 --- a/av.c +++ b/av.c @@ -362,9 +362,7 @@ Creates a new AV. The reference count is set to 1. AV * Perl_newAV(pTHX) { - register AV * const av = (AV*)newSV(0); - - sv_upgrade((SV *)av, SVt_PVAV); + register AV * const av = (AV*)newSV_type(SVt_PVAV); /* sv_upgrade does AvREAL_only() */ AvALLOC(av) = 0; AvARRAY(av) = NULL; @@ -385,9 +383,7 @@ will have a reference count of 1. AV * Perl_av_make(pTHX_ register I32 size, register SV **strp) { - register AV * const av = (AV*)newSV(0); - - sv_upgrade((SV *) av,SVt_PVAV); + register AV * const av = (AV*)newSV_type(SVt_PVAV); /* sv_upgrade does AvREAL_only() */ if (size) { /* "defined" was returning undef for size==0 anyway. */ register SV** ary; diff --git a/embed.fnc b/embed.fnc index 7520258..c6a3e08 100644 --- a/embed.fnc +++ b/embed.fnc @@ -589,6 +589,7 @@ Afpda |SV* |newSVpvf |NN const char* pat|... Apa |SV* |vnewSVpvf |NN const char* pat|NULLOK va_list* args Apd |SV* |newSVrv |NN SV* rv|NULLOK const char* classname Apda |SV* |newSVsv |NULLOK SV* old +Apda |SV* |newSV_type |svtype type Apa |OP* |newUNOP |I32 type|I32 flags|NULLOK OP* first Apa |OP* |newWHENOP |NULLOK OP* cond|NN OP* block Apa |OP* |newWHILEOP |I32 flags|I32 debuggable|NULLOK LOOP* loop \ diff --git a/embed.h b/embed.h index 5318688..770c403 100644 --- a/embed.h +++ b/embed.h @@ -583,6 +583,7 @@ #define vnewSVpvf Perl_vnewSVpvf #define newSVrv Perl_newSVrv #define newSVsv Perl_newSVsv +#define newSV_type Perl_newSV_type #define newUNOP Perl_newUNOP #define newWHENOP Perl_newWHENOP #define newWHILEOP Perl_newWHILEOP @@ -2804,6 +2805,7 @@ #define vnewSVpvf(a,b) Perl_vnewSVpvf(aTHX_ a,b) #define newSVrv(a,b) Perl_newSVrv(aTHX_ a,b) #define newSVsv(a) Perl_newSVsv(aTHX_ a) +#define newSV_type(a) Perl_newSV_type(aTHX_ a) #define newUNOP(a,b,c) Perl_newUNOP(aTHX_ a,b,c) #define newWHENOP(a,b) Perl_newWHENOP(aTHX_ a,b) #define newWHILEOP(a,b,c,d,e,f,g,h) Perl_newWHILEOP(aTHX_ a,b,c,d,e,f,g,h) diff --git a/global.sym b/global.sym index 9ade2fa..6c8c8a0 100644 --- a/global.sym +++ b/global.sym @@ -335,6 +335,7 @@ Perl_newSVpvf Perl_vnewSVpvf Perl_newSVrv Perl_newSVsv +Perl_newSV_type Perl_newUNOP Perl_newWHENOP Perl_newWHILEOP diff --git a/gv.c b/gv.c index 475c225..3e428a7 100644 --- a/gv.c +++ b/gv.c @@ -1354,9 +1354,7 @@ Perl_newIO(pTHX) { dVAR; GV *iogv; - IO * const io = (IO*)newSV(0); - - sv_upgrade((SV *)io,SVt_PVIO); + IO * const io = (IO*)newSV_type(SVt_PVIO); /* This used to read SvREFCNT(io) = 1; It's not clear why the reference count needed an explicit reset. NWC */ diff --git a/hv.c b/hv.c index 903d0b8..98120fd 100644 --- a/hv.c +++ b/hv.c @@ -1397,9 +1397,7 @@ HV * Perl_newHV(pTHX) { register XPVHV* xhv; - HV * const hv = (HV*)newSV(0); - - sv_upgrade((SV *)hv, SVt_PVHV); + HV * const hv = (HV*)newSV_type(SVt_PVHV); xhv = (XPVHV*)SvANY(hv); assert(!SvOK(hv)); #ifndef NODEFAULT_SHAREKEYS @@ -2589,8 +2587,7 @@ S_refcounted_he_value(pTHX_ const struct refcounted_he *he) case HVrhek_PV: /* Create a string SV that directly points to the bytes in our structure. */ - value = newSV(0); - sv_upgrade(value, SVt_PV); + value = newSV_type(SVt_PV); SvPV_set(value, (char *) he->refcounted_he_data + 1); SvCUR_set(value, he->refcounted_he_val.refcounted_he_u_len); /* This stops anything trying to free it */ diff --git a/mathoms.c b/mathoms.c index 7d6f142..708645e 100644 --- a/mathoms.c +++ b/mathoms.c @@ -547,9 +547,7 @@ AV * Perl_av_fake(pTHX_ register I32 size, register SV **strp) { register SV** ary; - register AV * const av = (AV*)newSV(0); - - sv_upgrade((SV *)av, SVt_PVAV); + register AV * const av = (AV*)newSV_type(SVt_PVAV); Newx(ary,size+1,SV*); AvALLOC(av) = ary; Copy(strp,ary,size,SV*); diff --git a/op.c b/op.c index 0191844..ba25603 100644 --- a/op.c +++ b/op.c @@ -5634,8 +5634,7 @@ Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename) if (cv) /* must reuse cv if autoloaded */ cv_undef(cv); else { - cv = (CV*)newSV(0); - sv_upgrade((SV *)cv, SVt_PVCV); + cv = (CV*)newSV_type(SVt_PVCV); if (name) { GvCV(gv) = cv; GvCVGEN(gv) = 0; diff --git a/pad.c b/pad.c index 415b59e..f565ce2 100644 --- a/pad.c +++ b/pad.c @@ -347,12 +347,11 @@ Perl_pad_add_name(pTHX_ const char *name, HV* typestash, HV* ourstash, bool fake { dVAR; const PADOFFSET offset = pad_alloc(OP_PADSV, SVs_PADMY); - SV* const namesv = newSV(0); + SV* const namesv + = newSV_type((ourstash || typestash) ? SVt_PVMG : SVt_PVNV); ASSERT_CURPAD_ACTIVE("pad_add_name"); - - sv_upgrade(namesv, (ourstash || typestash) ? SVt_PVMG : SVt_PVNV); sv_setpv(namesv, name); if (typestash) { @@ -485,9 +484,8 @@ Perl_pad_add_anon(pTHX_ SV* sv, OPCODE op_type) { dVAR; PADOFFSET ix; - SV* const name = newSV(0); + SV* const name = newSV_type(SVt_PVNV); pad_peg("add_anon"); - sv_upgrade(name, SVt_PVNV); sv_setpvn(name, "&", 1); /* Are these two actually ever read? */ COP_SEQ_RANGE_HIGH_set(name, ~0); @@ -1457,8 +1455,7 @@ Perl_cv_clone(pTHX_ CV *proto) ENTER; SAVESPTR(PL_compcv); - cv = PL_compcv = (CV*)newSV(0); - sv_upgrade((SV *)cv, SvTYPE(proto)); + cv = PL_compcv = (CV*)newSV_type(SvTYPE(proto)); CvFLAGS(cv) = CvFLAGS(proto) & ~(CVf_CLONE|CVf_WEAKOUTSIDE); CvCLONED_on(cv); diff --git a/perl.c b/perl.c index 7a53b72..4dfea50 100644 --- a/perl.c +++ b/perl.c @@ -2133,8 +2133,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) } } - PL_main_cv = PL_compcv = (CV*)newSV(0); - sv_upgrade((SV *)PL_compcv, SVt_PVCV); + PL_main_cv = PL_compcv = (CV*)newSV_type(SVt_PVCV); CvUNIQUE_on(PL_compcv); CvPADLIST(PL_compcv) = pad_new(0); @@ -4645,11 +4644,9 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register dVAR; GV* tmpgv; - PL_toptarget = newSV(0); - sv_upgrade(PL_toptarget, SVt_PVFM); + PL_toptarget = newSV_type(SVt_PVFM); sv_setpvn(PL_toptarget, "", 0); - PL_bodytarget = newSV(0); - sv_upgrade(PL_bodytarget, SVt_PVFM); + PL_bodytarget = newSV_type(SVt_PVFM); sv_setpvn(PL_bodytarget, "", 0); PL_formtarget = PL_bodytarget; diff --git a/pp.c b/pp.c index 04fab02..0cc80e6 100644 --- a/pp.c +++ b/pp.c @@ -323,8 +323,7 @@ PP(pp_av2arylen) AV * const av = (AV*)TOPs; SV ** const sv = Perl_av_arylen_p(aTHX_ (AV*)av); if (!*sv) { - *sv = newSV(0); - sv_upgrade(*sv, SVt_PVMG); + *sv = newSV_type(SVt_PVMG); sv_magic(*sv, (SV*)av, PERL_MAGIC_arylen, NULL, 0); } SETs(*sv); diff --git a/pp_ctl.c b/pp_ctl.c index ca19ebd..3aecb2d 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -2658,9 +2658,8 @@ S_save_lines(pTHX_ AV *array, SV *sv) while (s && s < send) { const char *t; - SV * const tmpstr = newSV(0); + SV * const tmpstr = newSV_type(SVt_PVMG); - sv_upgrade(tmpstr, SVt_PVMG); t = strchr(s, '\n'); if (t) t++; @@ -2887,8 +2886,7 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq) PUSHMARK(SP); SAVESPTR(PL_compcv); - PL_compcv = (CV*)newSV(0); - sv_upgrade((SV *)PL_compcv, SVt_PVCV); + PL_compcv = (CV*)newSV_type(SVt_PVCV); CvEVAL_on(PL_compcv); assert(CxTYPE(&cxstack[cxstack_ix]) == CXt_EVAL); cxstack[cxstack_ix].blk_eval.cv = PL_compcv; diff --git a/pp_hot.c b/pp_hot.c index 5cd01be..aa225c3 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -1944,8 +1944,7 @@ PP(pp_iter) if (lv) SvREFCNT_dec(LvTARG(lv)); else { - lv = cx->blk_loop.iterlval = newSV(0); - sv_upgrade(lv, SVt_PVLV); + lv = cx->blk_loop.iterlval = newSV_type(SVt_PVLV); LvTYPE(lv) = 'y'; sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0); } diff --git a/proto.h b/proto.h index cd7bfe3..339ecca 100644 --- a/proto.h +++ b/proto.h @@ -1642,6 +1642,10 @@ PERL_CALLCONV SV* Perl_newSVsv(pTHX_ SV* old) __attribute__malloc__ __attribute__warn_unused_result__; +PERL_CALLCONV SV* Perl_newSV_type(pTHX_ svtype type) + __attribute__malloc__ + __attribute__warn_unused_result__; + PERL_CALLCONV OP* Perl_newUNOP(pTHX_ I32 type, I32 flags, OP* first) __attribute__malloc__ __attribute__warn_unused_result__; diff --git a/sv.c b/sv.c index 38d7da7..77627bd 100644 --- a/sv.c +++ b/sv.c @@ -7168,6 +7168,25 @@ Perl_newSVuv(pTHX_ UV u) } /* +=for apidoc newSV_type + +Creates a new SV, of the type specificied. The reference count for the new SV +is set to 1. + +=cut +*/ + +SV * +Perl_newSV_type(pTHX_ svtype type) +{ + register SV *sv; + + new_SV(sv); + sv_upgrade(sv, type); + return sv; +} + +/* =for apidoc newRV_noinc Creates an RV wrapper for an SV. The reference count for the original @@ -7180,10 +7199,7 @@ SV * Perl_newRV_noinc(pTHX_ SV *tmpRef) { dVAR; - register SV *sv; - - new_SV(sv); - sv_upgrade(sv, SVt_RV); + register SV *sv = newSV_type(SVt_RV); SvTEMP_off(tmpRef); SvRV_set(sv, tmpRef); SvROK_on(sv); diff --git a/toke.c b/toke.c index 26f706e..7719aa5 100644 --- a/toke.c +++ b/toke.c @@ -924,8 +924,7 @@ S_update_debugger_info(pTHX_ SV *orig_sv, const char *buf, STRLEN len) { AV *av = CopFILEAVx(PL_curcop); if (av) { - SV * const sv = newSV(0); - sv_upgrade(sv, SVt_PVMG); + SV * const sv = newSV_type(SVt_PVMG); if (orig_sv) sv_setsv(sv, orig_sv); else @@ -12385,8 +12384,7 @@ Perl_start_subparse(pTHX_ I32 is_format, U32 flags) save_item(PL_subname); SAVESPTR(PL_compcv); - PL_compcv = (CV*)newSV(0); - sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV); + PL_compcv = (CV*)newSV_type(is_format ? SVt_PVFM : SVt_PVCV); CvFLAGS(PL_compcv) |= flags; PL_subline = CopLINE(PL_curcop);