Skip to content

Commit a98b094

Browse files
committed
experiment failed 48 copies of struct bodies_by_type_STAT
1 parent c593dad commit a98b094

File tree

7 files changed

+411
-41
lines changed

7 files changed

+411
-41
lines changed

gv.c

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ GV *
5858
Perl_gv_add_by_type(pTHX_ GV *gv, svtype type)
5959
{
6060
SV **where;
61+
static char saw [20] = {0};
6162

6263
if (
6364
!gv
@@ -94,8 +95,39 @@ Perl_gv_add_by_type(pTHX_ GV *gv, svtype type)
9495

9596
if (!*where)
9697
{
97-
__debugbreak();
98-
*where = Perl_newSV_typeX(pTHX_ type);
98+
if(type == SVt_PVHV) {
99+
*where = newSV_type(SVt_PVHV);
100+
}
101+
else if(type == SVt_PVAV) {
102+
*where = newSV_type(SVt_PVAV);
103+
}
104+
else if(type == SVt_PVMG) {
105+
*where = newSV_type(SVt_PVMG);
106+
}
107+
else if(type == SVt_PVIO) {
108+
*where = newSV_type(SVt_PVIO);
109+
}
110+
else if(type == SVt_PV) {
111+
*where = newSV_type(SVt_PV);
112+
}
113+
else if (type == SVt_PVGV) {
114+
*where = newSV_type(SVt_PVGV);
115+
}
116+
else if(type == SVt_NULL) {
117+
*where = newSV_type(SVt_NULL);
118+
}
119+
// else if(type == ) {
120+
// *where = newSV_type();
121+
// }
122+
else {
123+
if(!saw[type]) {
124+
__debugbreak();
125+
saw[type] = 1;
126+
}
127+
*where = Perl_newSV_typeX(aTHX_ type);
128+
}
129+
130+
99131
if ( type == SVt_PVAV
100132
&& memEQs(GvNAME(gv), GvNAMELEN(gv), "ISA"))
101133
{
@@ -578,7 +610,7 @@ S_gv_init_svtype(pTHX_ GV *gv, const svtype sv_type)
578610
case SVt_PVGV:
579611
break;
580612
default:
581-
if(GvSVn(gv)) {
613+
if(GvSVnt(gv,sv_type)) {
582614
/* Work round what appears to be a bug in Sun C++ 5.8 2005/10/13
583615
If we just cast GvSVn(gv) to void, it ignores evaluating it for
584616
its side effect */
@@ -2331,24 +2363,24 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len,
23312363
storeparen:
23322364
/* Flag the capture variables with a NULL mg_ptr
23332365
Use mg_len for the array index to lookup. */
2334-
sv_magic(GvSVn(gv), MUTABLE_SV(gv), PERL_MAGIC_sv, NULL, paren);
2366+
sv_magic(GvSVnt(gv, SVt_PVMG), MUTABLE_SV(gv), PERL_MAGIC_sv, NULL, paren);
23352367
break;
23362368

23372369
case ':': /* $: */
2338-
sv_setpv(GvSVn(gv),PL_chopset);
2370+
sv_setpv(GvSVnt(gv, SVt_PVMG),PL_chopset);
23392371
goto magicalize;
23402372

23412373
case '?': /* $? */
23422374
#ifdef COMPLEX_STATUS
2343-
SvUPGRADE(GvSVn(gv), SVt_PVLV);
2375+
SvUPGRADE(GvSVnt(gv, SVt_PVLV), SVt_PVLV);
23442376
#endif
23452377
goto magicalize;
23462378

23472379
case '!': /* $! */
23482380
GvMULTI_on(gv);
23492381
/* If %! has been used, automatically load Errno.pm. */
23502382

2351-
sv_magic(GvSVn(gv), MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
2383+
sv_magic(GvSVnt(gv,SVt_PVMG), MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
23522384

23532385
/* magicalization must be done before require_tie_mod_s is called */
23542386
if (sv_type == SVt_PVHV || sv_type == SVt_PVGV)
@@ -2359,8 +2391,9 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len,
23592391
case '+': /* $+, %+, @+ */
23602392
GvMULTI_on(gv); /* no used once warnings here */
23612393
{ /* $- $+ */
2362-
sv_magic(GvSVn(gv), MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
2363-
if (*name == '+')
2394+
SV* svplusminus = GvSVnt(gv, SVt_PVMG);
2395+
sv_magic(svplusminus, MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
2396+
if (*name == '+')
23642397
SvREADONLY_on(GvSVn(gv));
23652398
}
23662399
{ /* %- %+ */
@@ -2389,7 +2422,7 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len,
23892422
goto magicalize;
23902423
case '\023': /* $^S */
23912424
ro_magicalize:
2392-
SvREADONLY_on(GvSVn(gv));
2425+
SvREADONLY_on(GvSVnt(gv,SVt_PVMG));
23932426
/* FALLTHROUGH */
23942427
case '0': /* $0 */
23952428
case '^': /* $^ */
@@ -2418,14 +2451,14 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len,
24182451
case '\024': /* $^T */
24192452
case '\027': /* $^W */
24202453
magicalize:
2421-
sv_magic(GvSVn(gv), MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
2454+
sv_magic(GvSVnt(gv,SVt_PVMG), MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
24222455
break;
24232456

24242457
case '\014': /* $^L */
2425-
sv_setpvs(GvSVn(gv),"\f");
2458+
sv_setpvs(GvSVnt(gv, SVt_PV),"\f");
24262459
break;
24272460
case ';': /* $; */
2428-
sv_setpvs(GvSVn(gv),"\034");
2461+
sv_setpvs(GvSVnt(gv, SVt_PV),"\034");
24292462
break;
24302463
case ']': /* $] */
24312464
{

gv.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,17 @@ L<perl5100delta>.
101101
=for apidoc Am|SV*|GvSVn|GV* gv
102102
Like C<L</GvSV>>, but creates an empty scalar if none already exists.
103103
104+
=for apidoc Am|SV*|GvSVnt|GV* gv|svtype sv_type
105+
Like C<L</GvSVn>>, but creates an empty scalar whose type is already upgraded
106+
to the requested type if none already exists. Note, if there is an existing
107+
scalar already stored in the GV, its type is NOT upgraded, so you still must
108+
do an C<SvUPGRADE> unless you are absolutly the scalar slot in the GV was
109+
empty before, or if you allocated or created the GV immediatly before.
110+
Note, all the I<sv_set**v()> functions do all necessary C<SvUPGRADE> type
111+
logic checks for you. This macro exists to skip a 2nd pass through the
112+
I<SV *> allocator subsystem. That 2nd pass skipped is the slow path of
113+
C<SvUPGRADE> and swapping SV body types in the type upgrade.
114+
104115
=for apidoc Am|AV*|GvAV|GV* gv
105116
106117
Return the AV from the GV.
@@ -121,8 +132,12 @@ Return the CV from the GV.
121132
#define GvSVn(gv) (*(GvGP(gv)->gp_sv ? \
122133
&(GvGP(gv)->gp_sv) : \
123134
&(GvGP(gv_SVadd(gv))->gp_sv)))
135+
#define GvSVnt(_gv,_sv_type) (*(GvGP(_gv)->gp_sv ? \
136+
&(GvGP(_gv)->gp_sv) : \
137+
&(GvGP(gv_SVadd_type(_gv,_sv_type))->gp_sv)))
124138
#else
125139
#define GvSVn(gv) GvSV(gv)
140+
#define GvSVnt(_gv,_sv_type) (((void)SvUPGRADE(GvSV(_gv),_sv_type)),GvSV(_gv))
126141
#endif
127142

128143
#define GvREFCNT(gv) (GvGP(gv)->gp_refcnt)
@@ -347,6 +362,7 @@ Make sure there is a slot of the given type (AV, HV, IO, SV) in the GV C<gv>.
347362
#define gv_HVadd(gv) gv_add_by_type((gv), SVt_PVHV)
348363
#define gv_IOadd(gv) gv_add_by_type((gv), SVt_PVIO)
349364
#define gv_SVadd(gv) gv_add_by_type((gv), SVt_NULL)
365+
#define gv_SVadd_type(_gv,_sv_type) gv_add_by_type((_gv), (_sv_type))
350366

351367
/*
352368
* ex: set ts=8 sts=4 sw=4 et:

pad.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2220,8 +2220,17 @@ S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned)
22202220
assert(!CvUNIQUE(proto));
22212221

22222222
if (!cv) {
2223-
__debugbreak();
2224-
cv = MUTABLE_CV(Perl_newSV_typeX(pTHX_ SvTYPE(proto)));
2223+
if(SvTYPE(proto) != SVt_PVCV && SvTYPE(proto) != SVt_PVFM )
2224+
__debugbreak();
2225+
if (SvTYPE(proto) == SVt_PVCV) {
2226+
cv = MUTABLE_CV(newSV_type(SVt_PVCV));
2227+
}
2228+
else if(SvTYPE(proto) == SVt_PVFM) {
2229+
cv = MUTABLE_CV(newSV_type(SVt_PVFM));
2230+
}
2231+
else {
2232+
__debugbreak();
2233+
}
22252234
}
22262235
CvFLAGS(cv) = CvFLAGS(proto) & ~(CVf_CLONE|CVf_WEAKOUTSIDE|CVf_CVGV_RC
22272236
|CVf_SLABBED);

pp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5983,8 +5983,8 @@ PP(pp_emptyavhv)
59835983
OP * const op = PL_op;
59845984
SV * rv;
59855985
SV * const sv = MUTABLE_SV( (op->op_private & OPpEMPTYAVHV_IS_HV)
5986-
? Perl_newSV_type(SVt_PVHV)
5987-
: Perl_newSV_type(SVt_PVAV) );
5986+
? newSV_type(SVt_PVHV)
5987+
: newSV_type(SVt_PVAV) );
59885988

59895989
/* Is it an assignment, just a stack push, or both?*/
59905990
if (op->op_private & OPpTARGET_MY) {

sv.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929

3030
#include "EXTERN.h"
3131
#define PERL_IN_SV_C
32+
//#if defined(DEBUGGING)
33+
# define WANT_SV_BODY_DETAILS
34+
//#endif
3235
#include "perl.h"
3336
#include "regcomp.h"
3437
#ifdef __VMS
@@ -5441,14 +5444,14 @@ Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags)
54415444
svtype new_type;
54425445
SV * temp;
54435446
if(islv) {
5444-
temp = Perl_newSV_type(SVt_NULL);
5447+
temp = newSV_type(SVt_NULL);
54455448
new_type = SVt_NULL;
54465449
} else if (SvMAGIC(sv) || SvSTASH(sv)) {
5447-
temp = Perl_newSV_type(SVt_PVMG);
5450+
temp = newSV_type(SVt_PVMG);
54485451
new_type = SVt_PVMG;
54495452
}
54505453
else {
5451-
temp = Perl_newSV_type(SVt_PV);
5454+
temp = newSV_type(SVt_PV);
54525455
new_type = SVt_PV;
54535456
}
54545457
regexp *old_rx_body;

0 commit comments

Comments
 (0)