58
58
Perl_gv_add_by_type (pTHX_ GV * gv , svtype type )
59
59
{
60
60
SV * * where ;
61
+ static char saw [20 ] = {0 };
61
62
62
63
if (
63
64
!gv
@@ -94,8 +95,39 @@ Perl_gv_add_by_type(pTHX_ GV *gv, svtype type)
94
95
95
96
if (!* where )
96
97
{
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
+
99
131
if ( type == SVt_PVAV
100
132
&& memEQs (GvNAME (gv ), GvNAMELEN (gv ), "ISA" ))
101
133
{
@@ -578,7 +610,7 @@ S_gv_init_svtype(pTHX_ GV *gv, const svtype sv_type)
578
610
case SVt_PVGV :
579
611
break ;
580
612
default :
581
- if (GvSVn (gv )) {
613
+ if (GvSVnt (gv , sv_type )) {
582
614
/* Work round what appears to be a bug in Sun C++ 5.8 2005/10/13
583
615
If we just cast GvSVn(gv) to void, it ignores evaluating it for
584
616
its side effect */
@@ -2331,24 +2363,24 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len,
2331
2363
storeparen :
2332
2364
/* Flag the capture variables with a NULL mg_ptr
2333
2365
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 );
2335
2367
break ;
2336
2368
2337
2369
case ':' : /* $: */
2338
- sv_setpv (GvSVn (gv ),PL_chopset );
2370
+ sv_setpv (GvSVnt (gv , SVt_PVMG ),PL_chopset );
2339
2371
goto magicalize ;
2340
2372
2341
2373
case '?' : /* $? */
2342
2374
#ifdef COMPLEX_STATUS
2343
- SvUPGRADE (GvSVn (gv ), SVt_PVLV );
2375
+ SvUPGRADE (GvSVnt (gv , SVt_PVLV ), SVt_PVLV );
2344
2376
#endif
2345
2377
goto magicalize ;
2346
2378
2347
2379
case '!' : /* $! */
2348
2380
GvMULTI_on (gv );
2349
2381
/* If %! has been used, automatically load Errno.pm. */
2350
2382
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 );
2352
2384
2353
2385
/* magicalization must be done before require_tie_mod_s is called */
2354
2386
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,
2359
2391
case '+' : /* $+, %+, @+ */
2360
2392
GvMULTI_on (gv ); /* no used once warnings here */
2361
2393
{ /* $- $+ */
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 == '+' )
2364
2397
SvREADONLY_on (GvSVn (gv ));
2365
2398
}
2366
2399
{ /* %- %+ */
@@ -2389,7 +2422,7 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len,
2389
2422
goto magicalize ;
2390
2423
case '\023' : /* $^S */
2391
2424
ro_magicalize :
2392
- SvREADONLY_on (GvSVn (gv ));
2425
+ SvREADONLY_on (GvSVnt (gv , SVt_PVMG ));
2393
2426
/* FALLTHROUGH */
2394
2427
case '0' : /* $0 */
2395
2428
case '^' : /* $^ */
@@ -2418,14 +2451,14 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len,
2418
2451
case '\024' : /* $^T */
2419
2452
case '\027' : /* $^W */
2420
2453
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 );
2422
2455
break ;
2423
2456
2424
2457
case '\014' : /* $^L */
2425
- sv_setpvs (GvSVn (gv ),"\f" );
2458
+ sv_setpvs (GvSVnt (gv , SVt_PV ),"\f" );
2426
2459
break ;
2427
2460
case ';' : /* $; */
2428
- sv_setpvs (GvSVn (gv ),"\034" );
2461
+ sv_setpvs (GvSVnt (gv , SVt_PV ),"\034" );
2429
2462
break ;
2430
2463
case ']' : /* $] */
2431
2464
{
0 commit comments