This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Andrew Fresh is now a perl author
[perl5.git] / scope.c
CommitLineData
a0d0e21e 1/* scope.c
79072805 2 *
1129b882
NC
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e
LW
9 */
10
11/*
4ac71550
TC
12 * For the fashion of Minas Tirith was such that it was built on seven
13 * levels...
14 *
15 * [p.751 of _The Lord of the Rings_, V/i: "Minas Tirith"]
79072805
LW
16 */
17
ddfa107c 18/* This file contains functions to manipulate several of Perl's stacks;
166f8a29
DM
19 * in particular it contains code to push various types of things onto
20 * the savestack, then to pop them off and perform the correct restorative
21 * action for each one. This corresponds to the cleanup Perl does at
22 * each scope exit.
23 */
24
79072805 25#include "EXTERN.h"
864dbfa3 26#define PERL_IN_SCOPE_C
79072805
LW
27#include "perl.h"
28
a0d0e21e 29SV**
fc16c392 30Perl_stack_grow(pTHX_ SV **sp, SV **p, SSize_t n)
a0d0e21e 31{
97aff369 32 dVAR;
7918f24d
NC
33
34 PERL_ARGS_ASSERT_STACK_GROW;
35
3280af22 36 PL_stack_sp = sp;
2ce36478 37#ifndef STRESS_REALLOC
3280af22 38 av_extend(PL_curstack, (p - PL_stack_base) + (n) + 128);
2ce36478 39#else
6b88bc9c 40 av_extend(PL_curstack, (p - PL_stack_base) + (n) + 1);
2ce36478 41#endif
3280af22 42 return PL_stack_sp;
a0d0e21e
LW
43}
44
2ce36478
SM
45#ifndef STRESS_REALLOC
46#define GROW(old) ((old) * 3 / 2)
47#else
48#define GROW(old) ((old) + 1)
49#endif
50
e336de0d 51PERL_SI *
864dbfa3 52Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
e336de0d 53{
97aff369 54 dVAR;
e336de0d 55 PERL_SI *si;
a02a5408 56 Newx(si, 1, PERL_SI);
e336de0d
GS
57 si->si_stack = newAV();
58 AvREAL_off(si->si_stack);
59 av_extend(si->si_stack, stitems > 0 ? stitems-1 : 0);
3280af22 60 AvALLOC(si->si_stack)[0] = &PL_sv_undef;
e336de0d
GS
61 AvFILLp(si->si_stack) = 0;
62 si->si_prev = 0;
63 si->si_next = 0;
64 si->si_cxmax = cxitems - 1;
65 si->si_cxix = -1;
e788e7d3 66 si->si_type = PERLSI_UNDEF;
a02a5408 67 Newx(si->si_cxstack, cxitems, PERL_CONTEXT);
9965345d
JH
68 /* Without any kind of initialising PUSHSUBST()
69 * in pp_subst() will read uninitialised heap. */
7e337ee0 70 PoisonNew(si->si_cxstack, cxitems, PERL_CONTEXT);
e336de0d
GS
71 return si;
72}
73
79072805 74I32
864dbfa3 75Perl_cxinc(pTHX)
79072805 76{
97aff369 77 dVAR;
a3b680e6 78 const IV old_max = cxstack_max;
2ce36478 79 cxstack_max = GROW(cxstack_max);
401a9b14 80 Renew(cxstack, cxstack_max + 1, PERL_CONTEXT);
9965345d
JH
81 /* Without any kind of initialising deep enough recursion
82 * will end up reading uninitialised PERL_CONTEXTs. */
109bf713 83 PoisonNew(cxstack + old_max + 1, cxstack_max - old_max, PERL_CONTEXT);
79072805
LW
84 return cxstack_ix + 1;
85}
86
79072805 87void
864dbfa3 88Perl_push_scope(pTHX)
79072805 89{
97aff369 90 dVAR;
5d9574c1 91 if (UNLIKELY(PL_scopestack_ix == PL_scopestack_max)) {
3280af22
NIS
92 PL_scopestack_max = GROW(PL_scopestack_max);
93 Renew(PL_scopestack, PL_scopestack_max, I32);
d343c3ef
GG
94#ifdef DEBUGGING
95 Renew(PL_scopestack_name, PL_scopestack_max, const char*);
520bb150 96#endif
79072805 97 }
d343c3ef
GG
98#ifdef DEBUGGING
99 PL_scopestack_name[PL_scopestack_ix] = "unknown";
100#endif
3280af22 101 PL_scopestack[PL_scopestack_ix++] = PL_savestack_ix;
79072805
LW
102
103}
104
105void
864dbfa3 106Perl_pop_scope(pTHX)
79072805 107{
97aff369 108 dVAR;
35a4481c 109 const I32 oldsave = PL_scopestack[--PL_scopestack_ix];
8990e307 110 LEAVE_SCOPE(oldsave);
79072805
LW
111}
112
ba5248fc 113I32 *
864dbfa3 114Perl_markstack_grow(pTHX)
a0d0e21e 115{
97aff369 116 dVAR;
35a4481c
AL
117 const I32 oldmax = PL_markstack_max - PL_markstack;
118 const I32 newmax = GROW(oldmax);
a0d0e21e 119
3280af22 120 Renew(PL_markstack, newmax, I32);
3280af22 121 PL_markstack_max = PL_markstack + newmax;
ba5248fc
DD
122 PL_markstack_ptr = PL_markstack + oldmax;
123 return PL_markstack_ptr;
a0d0e21e
LW
124}
125
126void
864dbfa3 127Perl_savestack_grow(pTHX)
79072805 128{
97aff369 129 dVAR;
8aacddc1 130 PL_savestack_max = GROW(PL_savestack_max) + 4;
3280af22 131 Renew(PL_savestack, PL_savestack_max, ANY);
79072805
LW
132}
133
4b3c1a47
AE
134void
135Perl_savestack_grow_cnt(pTHX_ I32 need)
136{
97aff369 137 dVAR;
4b3c1a47
AE
138 PL_savestack_max = PL_savestack_ix + need;
139 Renew(PL_savestack, PL_savestack_max, ANY);
140}
141
2ce36478
SM
142#undef GROW
143
79072805 144void
e8eb279c 145Perl_tmps_grow(pTHX_ SSize_t n)
677b06e3 146{
97aff369 147 dVAR;
677b06e3
GS
148#ifndef STRESS_REALLOC
149 if (n < 128)
150 n = (PL_tmps_max < 512) ? 128 : 512;
151#endif
152 PL_tmps_max = PL_tmps_ix + n + 1;
153 Renew(PL_tmps_stack, PL_tmps_max, SV*);
154}
155
156
157void
864dbfa3 158Perl_free_tmps(pTHX)
79072805 159{
97aff369 160 dVAR;
79072805 161 /* XXX should tmps_floor live in cxstack? */
e8eb279c 162 const SSize_t myfloor = PL_tmps_floor;
3280af22 163 while (PL_tmps_ix > myfloor) { /* clean up after last statement */
22ade07d 164 SV* const sv = PL_tmps_stack[PL_tmps_ix--];
72581b5b
VP
165#ifdef PERL_POISON
166 PoisonWith(PL_tmps_stack + PL_tmps_ix + 1, 1, SV *, 0xAB);
22ade07d 167#endif
5d9574c1 168 if (LIKELY(sv && sv != &PL_sv_undef)) {
463ee0b2 169 SvTEMP_off(sv);
4a9a56a7 170 SvREFCNT_dec_NN(sv); /* note, can modify tmps_ix!!! */
463ee0b2 171 }
79072805
LW
172 }
173}
174
76e3520e 175STATIC SV *
af7df257 176S_save_scalar_at(pTHX_ SV **sptr, const U32 flags)
79072805 177{
97aff369 178 dVAR;
75d34a09 179 SV * osv;
eb578fdb 180 SV *sv;
79072805 181
7918f24d
NC
182 PERL_ARGS_ASSERT_SAVE_SCALAR_AT;
183
75d34a09
VP
184 osv = *sptr;
185 sv = (flags & SAVEf_KEEPOLDELEM) ? osv : (*sptr = newSV(0));
186
f1f99dc1 187 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv)) {
a0d0e21e 188 if (SvGMAGICAL(osv)) {
a0d0e21e 189 SvFLAGS(osv) |= (SvFLAGS(osv) &
c268c2a6 190 (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
a0d0e21e 191 }
75d34a09 192 if (!(flags & SAVEf_KEEPOLDELEM))
2dcac756 193 mg_localize(osv, sv, cBOOL(flags & SAVEf_SETMAGIC));
79072805 194 }
75d34a09 195
79072805
LW
196 return sv;
197}
198
dfcd3de5
NC
199void
200Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type)
e22024d3
NC
201{
202 dVAR;
a3444cc5
DM
203 dSS_ADD;
204 SS_ADD_PTR(ptr1);
205 SS_ADD_PTR(ptr2);
206 SS_ADD_UV(type);
207 SS_ADD_END(3);
e22024d3
NC
208}
209
7a4c00b4 210SV *
864dbfa3 211Perl_save_scalar(pTHX_ GV *gv)
7a4c00b4 212{
97aff369 213 dVAR;
fb4fc1fa 214 SV ** const sptr = &GvSVn(gv);
7918f24d
NC
215
216 PERL_ARGS_ASSERT_SAVE_SCALAR;
217
5d9574c1 218 if (UNLIKELY(SvGMAGICAL(*sptr))) {
b492a59e
DM
219 PL_localizing = 1;
220 (void)mg_get(*sptr);
221 PL_localizing = 0;
222 }
e22024d3 223 save_pushptrptr(SvREFCNT_inc_simple(gv), SvREFCNT_inc(*sptr), SAVEt_SV);
af7df257 224 return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
7a4c00b4 225}
226
f4dd75d9 227/* Like save_sptr(), but also SvREFCNT_dec()s the new value. Can be used to
b9d12d37
GS
228 * restore a global SV to its prior contents, freeing new value. */
229void
864dbfa3 230Perl_save_generic_svref(pTHX_ SV **sptr)
b9d12d37 231{
97aff369 232 dVAR;
7918f24d
NC
233
234 PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF;
235
e22024d3 236 save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_GENERIC_SVREF);
b9d12d37
GS
237}
238
f4dd75d9
GS
239/* Like save_pptr(), but also Safefree()s the new value if it is different
240 * from the old one. Can be used to restore a global char* to its prior
241 * contents, freeing new value. */
242void
243Perl_save_generic_pvref(pTHX_ char **str)
244{
97aff369 245 dVAR;
7918f24d
NC
246
247 PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF;
248
e22024d3 249 save_pushptrptr(*str, str, SAVEt_GENERIC_PVREF);
f4dd75d9
GS
250}
251
05ec9bb3
NIS
252/* Like save_generic_pvref(), but uses PerlMemShared_free() rather than Safefree().
253 * Can be used to restore a shared global char* to its prior
254 * contents, freeing new value. */
255void
256Perl_save_shared_pvref(pTHX_ char **str)
257{
97aff369 258 dVAR;
7918f24d
NC
259
260 PERL_ARGS_ASSERT_SAVE_SHARED_PVREF;
261
e22024d3 262 save_pushptrptr(str, *str, SAVEt_SHARED_PVREF);
05ec9bb3
NIS
263}
264
14f338dc
DM
265/* set the SvFLAGS specified by mask to the values in val */
266
267void
268Perl_save_set_svflags(pTHX_ SV* sv, U32 mask, U32 val)
269{
97aff369 270 dVAR;
a3444cc5 271 dSS_ADD;
7918f24d
NC
272
273 PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS;
274
a3444cc5
DM
275 SS_ADD_PTR(sv);
276 SS_ADD_INT(mask);
277 SS_ADD_INT(val);
278 SS_ADD_UV(SAVEt_SET_SVFLAGS);
279 SS_ADD_END(4);
14f338dc
DM
280}
281
79072805 282void
864dbfa3 283Perl_save_gp(pTHX_ GV *gv, I32 empty)
79072805 284{
97aff369 285 dVAR;
7918f24d
NC
286
287 PERL_ARGS_ASSERT_SAVE_GP;
288
10507e11 289 save_pushptrptr(SvREFCNT_inc(gv), GvGP(gv), SAVEt_GP);
79072805 290
5f05dabc 291 if (empty) {
12816592 292 GP *gp = Perl_newGP(aTHX_ gv);
959f7ad7 293 HV * const stash = GvSTASH(gv);
3d460042
FC
294 bool isa_changed = 0;
295
296 if (stash && HvENAME(stash)) {
297 if (GvNAMELEN(gv) == 3 && strnEQ(GvNAME(gv), "ISA", 3))
298 isa_changed = TRUE;
299 else if (GvCVu(gv))
300 /* taking a method out of circulation ("local")*/
301 mro_method_changed_in(stash);
302 }
146174a9
CB
303 if (GvIOp(gv) && (IoFLAGS(GvIOp(gv)) & IOf_ARGV)) {
304 gp->gp_io = newIO();
305 IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
306 }
c43ae56f 307 GvGP_set(gv,gp);
3d460042 308 if (isa_changed) mro_isa_changed_in(stash);
5f05dabc 309 }
310 else {
44a8e56a 311 gp_ref(GvGP(gv));
5f05dabc 312 GvINTRO_on(gv);
313 }
79072805 314}
79072805 315
79072805 316AV *
864dbfa3 317Perl_save_ary(pTHX_ GV *gv)
79072805 318{
97aff369 319 dVAR;
901017d6 320 AV * const oav = GvAVn(gv);
67a38de0 321 AV *av;
fb73857a 322
7918f24d
NC
323 PERL_ARGS_ASSERT_SAVE_ARY;
324
5d9574c1 325 if (UNLIKELY(!AvREAL(oav) && AvREIFY(oav)))
67a38de0 326 av_reify(oav);
01433346 327 save_pushptrptr(SvREFCNT_inc_simple_NN(gv), oav, SAVEt_AV);
79072805 328
4608196e 329 GvAV(gv) = NULL;
fb73857a 330 av = GvAVn(gv);
5d9574c1 331 if (UNLIKELY(SvMAGIC(oav)))
9711599e 332 mg_localize(MUTABLE_SV(oav), MUTABLE_SV(av), TRUE);
fb73857a 333 return av;
79072805
LW
334}
335
336HV *
864dbfa3 337Perl_save_hash(pTHX_ GV *gv)
79072805 338{
97aff369 339 dVAR;
fb73857a 340 HV *ohv, *hv;
341
7918f24d
NC
342 PERL_ARGS_ASSERT_SAVE_HASH;
343
01433346
FC
344 save_pushptrptr(
345 SvREFCNT_inc_simple_NN(gv), (ohv = GvHVn(gv)), SAVEt_HV
346 );
79072805 347
4608196e 348 GvHV(gv) = NULL;
fb73857a 349 hv = GvHVn(gv);
5d9574c1 350 if (UNLIKELY(SvMAGIC(ohv)))
9711599e 351 mg_localize(MUTABLE_SV(ohv), MUTABLE_SV(hv), TRUE);
fb73857a 352 return hv;
79072805
LW
353}
354
355void
5aaab254 356Perl_save_item(pTHX_ SV *item)
79072805 357{
97aff369 358 dVAR;
eb578fdb 359 SV * const sv = newSVsv(item);
79072805 360
7918f24d
NC
361 PERL_ARGS_ASSERT_SAVE_ITEM;
362
e22024d3
NC
363 save_pushptrptr(item, /* remember the pointer */
364 sv, /* remember the value */
365 SAVEt_ITEM);
79072805
LW
366}
367
368void
1409bc06 369Perl_save_bool(pTHX_ bool *boolp)
79072805 370{
97aff369 371 dVAR;
a3444cc5 372 dSS_ADD;
7918f24d 373
1409bc06 374 PERL_ARGS_ASSERT_SAVE_BOOL;
7918f24d 375
a3444cc5
DM
376 SS_ADD_PTR(boolp);
377 SS_ADD_UV(SAVEt_BOOL | (*boolp << 8));
378 SS_ADD_END(2);
1409bc06
NC
379}
380
7623d426
NC
381void
382Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type)
1409bc06
NC
383{
384 dVAR;
a3444cc5
DM
385 dSS_ADD;
386
387 SS_ADD_INT(i);
388 SS_ADD_PTR(ptr);
389 SS_ADD_UV(type);
390 SS_ADD_END(3);
79072805
LW
391}
392
393void
1409bc06 394Perl_save_int(pTHX_ int *intp)
9febdf04 395{
97aff369 396 dVAR;
d172696c 397 const int i = *intp;
9b139d09 398 UV type = ((UV)((UV)i << SAVE_TIGHT_SHIFT) | SAVEt_INT_SMALL);
d172696c
DM
399 int size = 2;
400 dSS_ADD;
7918f24d 401
1409bc06 402 PERL_ARGS_ASSERT_SAVE_INT;
7918f24d 403
5d9574c1 404 if (UNLIKELY((int)(type >> SAVE_TIGHT_SHIFT) != i)) {
d172696c
DM
405 SS_ADD_INT(i);
406 type = SAVEt_INT;
407 size++;
408 }
409 SS_ADD_PTR(intp);
410 SS_ADD_UV(type);
411 SS_ADD_END(size);
9febdf04
RH
412}
413
414void
58188858
RGS
415Perl_save_I8(pTHX_ I8 *bytep)
416{
417 dVAR;
a3444cc5 418 dSS_ADD;
7918f24d
NC
419
420 PERL_ARGS_ASSERT_SAVE_I8;
421
a3444cc5
DM
422 SS_ADD_PTR(bytep);
423 SS_ADD_UV(SAVEt_I8 | ((UV)*bytep << 8));
424 SS_ADD_END(2);
58188858
RGS
425}
426
427void
87a84751
JH
428Perl_save_I16(pTHX_ I16 *intp)
429{
430 dVAR;
a3444cc5 431 dSS_ADD;
7918f24d
NC
432
433 PERL_ARGS_ASSERT_SAVE_I16;
434
a3444cc5
DM
435 SS_ADD_PTR(intp);
436 SS_ADD_UV(SAVEt_I16 | ((UV)*intp << 8));
437 SS_ADD_END(2);
87a84751
JH
438}
439
440void
864dbfa3 441Perl_save_I32(pTHX_ I32 *intp)
79072805 442{
97aff369 443 dVAR;
d172696c 444 const I32 i = *intp;
9b139d09 445 UV type = ((I32)((U32)i << SAVE_TIGHT_SHIFT) | SAVEt_I32_SMALL);
d172696c
DM
446 int size = 2;
447 dSS_ADD;
7918f24d
NC
448
449 PERL_ARGS_ASSERT_SAVE_I32;
450
5d9574c1 451 if (UNLIKELY((I32)(type >> SAVE_TIGHT_SHIFT) != i)) {
d172696c
DM
452 SS_ADD_INT(i);
453 type = SAVEt_I32;
454 size++;
455 }
456 SS_ADD_PTR(intp);
457 SS_ADD_UV(type);
458 SS_ADD_END(size);
79072805
LW
459}
460
e8eb279c
FC
461void
462Perl_save_strlen(pTHX_ STRLEN *ptr)
463{
464 dVAR;
465 dSS_ADD;
466
467 PERL_ARGS_ASSERT_SAVE_STRLEN;
468
469 SS_ADD_IV(*ptr);
470 SS_ADD_PTR(ptr);
471 SS_ADD_UV(SAVEt_STRLEN);
472 SS_ADD_END(3);
473}
474
85e6fe83
LW
475/* Cannot use save_sptr() to store a char* since the SV** cast will
476 * force word-alignment and we'll miss the pointer.
477 */
478void
864dbfa3 479Perl_save_pptr(pTHX_ char **pptr)
85e6fe83 480{
97aff369 481 dVAR;
7918f24d
NC
482
483 PERL_ARGS_ASSERT_SAVE_PPTR;
484
e22024d3 485 save_pushptrptr(*pptr, pptr, SAVEt_PPTR);
85e6fe83
LW
486}
487
79072805 488void
146174a9
CB
489Perl_save_vptr(pTHX_ void *ptr)
490{
97aff369 491 dVAR;
7918f24d
NC
492
493 PERL_ARGS_ASSERT_SAVE_VPTR;
494
e22024d3 495 save_pushptrptr(*(char**)ptr, ptr, SAVEt_VPTR);
146174a9
CB
496}
497
498void
864dbfa3 499Perl_save_sptr(pTHX_ SV **sptr)
79072805 500{
97aff369 501 dVAR;
7918f24d
NC
502
503 PERL_ARGS_ASSERT_SAVE_SPTR;
504
e22024d3 505 save_pushptrptr(*sptr, sptr, SAVEt_SPTR);
79072805
LW
506}
507
c3564e5c 508void
09edbca0 509Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off)
c3564e5c 510{
97aff369 511 dVAR;
a3444cc5
DM
512 dSS_ADD;
513
f3548bdc 514 ASSERT_CURPAD_ACTIVE("save_padsv");
a3444cc5
DM
515 SS_ADD_PTR(SvREFCNT_inc_simple_NN(PL_curpad[off]));
516 SS_ADD_PTR(PL_comppad);
03dba561 517 SS_ADD_UV((UV)off);
a3444cc5
DM
518 SS_ADD_UV(SAVEt_PADSV_AND_MORTALIZE);
519 SS_ADD_END(4);
c3564e5c
GS
520}
521
79072805 522void
864dbfa3 523Perl_save_hptr(pTHX_ HV **hptr)
79072805 524{
97aff369 525 dVAR;
7918f24d
NC
526
527 PERL_ARGS_ASSERT_SAVE_HPTR;
528
e22024d3 529 save_pushptrptr(*hptr, hptr, SAVEt_HPTR);
79072805
LW
530}
531
532void
864dbfa3 533Perl_save_aptr(pTHX_ AV **aptr)
79072805 534{
97aff369 535 dVAR;
7918f24d
NC
536
537 PERL_ARGS_ASSERT_SAVE_APTR;
538
e22024d3 539 save_pushptrptr(*aptr, aptr, SAVEt_APTR);
79072805
LW
540}
541
542void
2fd8beea 543Perl_save_pushptr(pTHX_ void *const ptr, const int type)
8990e307 544{
97aff369 545 dVAR;
a3444cc5
DM
546 dSS_ADD;
547 SS_ADD_PTR(ptr);
548 SS_ADD_UV(type);
549 SS_ADD_END(2);
8990e307
LW
550}
551
552void
864dbfa3 553Perl_save_clearsv(pTHX_ SV **svp)
8990e307 554{
97aff369 555 dVAR;
cdcdfc56
NC
556 const UV offset = svp - PL_curpad;
557 const UV offset_shifted = offset << SAVE_TIGHT_SHIFT;
7918f24d
NC
558
559 PERL_ARGS_ASSERT_SAVE_CLEARSV;
560
f3548bdc 561 ASSERT_CURPAD_ACTIVE("save_clearsv");
623e28c6 562 SvPADSTALE_off(*svp); /* mark lexical as active */
5d9574c1 563 if (UNLIKELY((offset_shifted >> SAVE_TIGHT_SHIFT) != offset)) {
cdcdfc56
NC
564 Perl_croak(aTHX_ "panic: pad offset %"UVuf" out of range (%p-%p)",
565 offset, svp, PL_curpad);
a3444cc5 566 }
cdcdfc56 567
a3444cc5
DM
568 {
569 dSS_ADD;
570 SS_ADD_UV(offset_shifted | SAVEt_CLEARSV);
571 SS_ADD_END(1);
572 }
8990e307
LW
573}
574
575void
864dbfa3 576Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen)
8990e307 577{
97aff369 578 dVAR;
7918f24d
NC
579
580 PERL_ARGS_ASSERT_SAVE_DELETE;
581
85a721ca 582 save_pushptri32ptr(key, klen, SvREFCNT_inc_simple(hv), SAVEt_DELETE);
8990e307
LW
583}
584
585void
af097752
VP
586Perl_save_hdelete(pTHX_ HV *hv, SV *keysv)
587{
588 STRLEN len;
589 I32 klen;
590 const char *key;
591
592 PERL_ARGS_ASSERT_SAVE_HDELETE;
593
594 key = SvPV_const(keysv, len);
595 klen = SvUTF8(keysv) ? -(I32)len : (I32)len;
596 SvREFCNT_inc_simple_void_NN(hv);
597 save_pushptri32ptr(savepvn(key, len), klen, hv, SAVEt_DELETE);
598}
599
600void
c70927a6 601Perl_save_adelete(pTHX_ AV *av, SSize_t key)
c68ec7a9
VP
602{
603 dVAR;
c70927a6 604 dSS_ADD;
c68ec7a9
VP
605
606 PERL_ARGS_ASSERT_SAVE_ADELETE;
607
608 SvREFCNT_inc_void(av);
c70927a6
FC
609 SS_ADD_UV(key);
610 SS_ADD_PTR(av);
611 SS_ADD_IV(SAVEt_ADELETE);
612 SS_ADD_END(3);
c68ec7a9
VP
613}
614
615void
12ab1f58
JH
616Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
617{
618 dVAR;
a3444cc5 619 dSS_ADD;
7918f24d
NC
620
621 PERL_ARGS_ASSERT_SAVE_DESTRUCTOR;
622
a3444cc5
DM
623 SS_ADD_DPTR(f);
624 SS_ADD_PTR(p);
625 SS_ADD_UV(SAVEt_DESTRUCTOR);
626 SS_ADD_END(3);
12ab1f58
JH
627}
628
629void
146174a9
CB
630Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
631{
97aff369 632 dVAR;
a3444cc5
DM
633 dSS_ADD;
634
635 SS_ADD_DXPTR(f);
636 SS_ADD_PTR(p);
637 SS_ADD_UV(SAVEt_DESTRUCTOR_X);
638 SS_ADD_END(3);
146174a9
CB
639}
640
641void
da8315f8
NC
642Perl_save_hints(pTHX)
643{
644 dVAR;
20439bc7 645 COPHH *save_cophh = cophh_copy(CopHINTHASH_get(&PL_compiling));
da8315f8 646 if (PL_hints & HINT_LOCALIZE_HH) {
52c7aca6
FC
647 HV *oldhh = GvHV(PL_hintgv);
648 save_pushptri32ptr(oldhh, PL_hints, save_cophh, SAVEt_HINTS);
649 GvHV(PL_hintgv) = NULL; /* in case copying dies */
650 GvHV(PL_hintgv) = hv_copy_hints_hv(oldhh);
be84297e 651 } else {
20439bc7 652 save_pushi32ptr(PL_hints, save_cophh, SAVEt_HINTS);
da8315f8 653 }
be84297e
NC
654}
655
656static void
657S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2,
658 const int type)
659{
a3444cc5
DM
660 dSS_ADD;
661 SS_ADD_PTR(ptr1);
662 SS_ADD_INT(i);
663 SS_ADD_PTR(ptr2);
664 SS_ADD_UV(type);
665 SS_ADD_END(4);
da8315f8
NC
666}
667
668void
c70927a6
FC
669Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr,
670 const U32 flags)
4e4c362e 671{
c70927a6 672 dVAR; dSS_ADD;
bfc4de9f 673 SV *sv;
7918f24d 674
91d1c79f 675 PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS;
7918f24d 676
0cbee0a4 677 SvGETMAGIC(*sptr);
c70927a6
FC
678 SS_ADD_PTR(SvREFCNT_inc_simple(av));
679 SS_ADD_IV(idx);
680 SS_ADD_PTR(SvREFCNT_inc(*sptr));
681 SS_ADD_UV(SAVEt_AELEM);
682 SS_ADD_END(4);
1cdc9186
FC
683 /* The array needs to hold a reference count on its new element, so it
684 must be AvREAL. */
5d9574c1 685 if (UNLIKELY(!AvREAL(av) && AvREIFY(av)))
1cdc9186 686 av_reify(av);
91d1c79f 687 save_scalar_at(sptr, flags); /* XXX - FIXME - see #60360 */
75d34a09
VP
688 if (flags & SAVEf_KEEPOLDELEM)
689 return;
bfc4de9f
DM
690 sv = *sptr;
691 /* If we're localizing a tied array element, this new sv
692 * won't actually be stored in the array - so it won't get
693 * reaped when the localize ends. Ensure it gets reaped by
694 * mortifying it instead. DAPM */
5d9574c1 695 if (UNLIKELY(SvTIED_mg((const SV *)av, PERL_MAGIC_tied)))
bfc4de9f 696 sv_2mortal(sv);
4e4c362e
GS
697}
698
699void
af7df257 700Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags)
4e4c362e 701{
97aff369 702 dVAR;
bfc4de9f 703 SV *sv;
7918f24d 704
af7df257 705 PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS;
7918f24d 706
0cbee0a4 707 SvGETMAGIC(*sptr);
a3444cc5
DM
708 {
709 dSS_ADD;
710 SS_ADD_PTR(SvREFCNT_inc_simple(hv));
711 SS_ADD_PTR(newSVsv(key));
712 SS_ADD_PTR(SvREFCNT_inc(*sptr));
713 SS_ADD_UV(SAVEt_HELEM);
714 SS_ADD_END(4);
715 }
af7df257 716 save_scalar_at(sptr, flags);
75d34a09
VP
717 if (flags & SAVEf_KEEPOLDELEM)
718 return;
bfc4de9f
DM
719 sv = *sptr;
720 /* If we're localizing a tied hash element, this new sv
721 * won't actually be stored in the hash - so it won't get
722 * reaped when the localize ends. Ensure it gets reaped by
723 * mortifying it instead. DAPM */
5d9574c1 724 if (UNLIKELY(SvTIED_mg((const SV *)hv, PERL_MAGIC_tied)))
bfc4de9f 725 sv_2mortal(sv);
4e4c362e
GS
726}
727
2053acbf
NC
728SV*
729Perl_save_svref(pTHX_ SV **sptr)
730{
731 dVAR;
7918f24d
NC
732
733 PERL_ARGS_ASSERT_SAVE_SVREF;
734
2053acbf 735 SvGETMAGIC(*sptr);
e22024d3 736 save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_SVREF);
af7df257 737 return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
2053acbf
NC
738}
739
455ece5e 740I32
864dbfa3 741Perl_save_alloc(pTHX_ I32 size, I32 pad)
455ece5e 742{
97aff369 743 dVAR;
eb578fdb
KW
744 const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
745 - (char*)PL_savestack);
1be36ce0
NC
746 const UV elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
747 const UV elems_shifted = elems << SAVE_TIGHT_SHIFT;
455ece5e 748
5d9574c1 749 if (UNLIKELY((elems_shifted >> SAVE_TIGHT_SHIFT) != elems))
93a641ae
DM
750 Perl_croak(aTHX_
751 "panic: save_alloc elems %"UVuf" out of range (%"IVdf"-%"IVdf")",
752 elems, (IV)size, (IV)pad);
1be36ce0
NC
753
754 SSGROW(elems + 1);
455ece5e
AD
755
756 PL_savestack_ix += elems;
1be36ce0 757 SSPUSHUV(SAVEt_ALLOC | elems_shifted);
455ece5e
AD
758 return start;
759}
760
03dba561
DM
761
762
763#define ARG0_SV MUTABLE_SV(arg0.any_ptr)
764#define ARG0_AV MUTABLE_AV(arg0.any_ptr)
765#define ARG0_HV MUTABLE_HV(arg0.any_ptr)
766#define ARG0_PTR arg0.any_ptr
767#define ARG0_PV (char*)(arg0.any_ptr)
768#define ARG0_PVP (char**)(arg0.any_ptr)
769#define ARG0_I32 (arg0.any_i32)
770
771#define ARG1_SV MUTABLE_SV(arg1.any_ptr)
772#define ARG1_AV MUTABLE_AV(arg1.any_ptr)
773#define ARG1_GV MUTABLE_GV(arg1.any_ptr)
774#define ARG1_SVP (SV**)(arg1.any_ptr)
775#define ARG1_PVP (char**)(arg1.any_ptr)
776#define ARG1_PTR arg1.any_ptr
777#define ARG1_PV (char*)(arg1.any_ptr)
778#define ARG1_I32 (arg1.any_i32)
779
780#define ARG2_SV MUTABLE_SV(arg2.any_ptr)
781#define ARG2_AV MUTABLE_AV(arg2.any_ptr)
782#define ARG2_HV MUTABLE_HV(arg2.any_ptr)
783#define ARG2_GV MUTABLE_GV(arg2.any_ptr)
784#define ARG2_PV (char*)(arg2.any_ptr)
785
462e5cf6 786void
864dbfa3 787Perl_leave_scope(pTHX_ I32 base)
79072805 788{
97aff369 789 dVAR;
03dba561 790
302c0c93 791 /* Localise the effects of the TAINT_NOT inside the loop. */
284167a5 792 bool was = TAINT_get;
79072805 793
03dba561
DM
794 ANY arg0, arg1, arg2;
795
796 /* these initialisations are logically unnecessary, but they shut up
797 * spurious 'may be used uninitialized' compiler warnings */
798 arg0.any_ptr = NULL;
799 arg1.any_ptr = NULL;
800 arg2.any_ptr = NULL;
801
5d9574c1 802 if (UNLIKELY(base < -1))
5637ef5b 803 Perl_croak(aTHX_ "panic: corrupt saved stack index %ld", (long) base);
1c98cc53
DM
804 DEBUG_l(Perl_deb(aTHX_ "savestack: releasing items %ld -> %ld\n",
805 (long)PL_savestack_ix, (long)base));
3280af22 806 while (PL_savestack_ix > base) {
03dba561
DM
807 UV uv;
808 U8 type;
809
810 SV *refsv;
811 SV **svp;
812
c6ae7647
NC
813 TAINT_NOT;
814
03dba561
DM
815 {
816 I32 ix = PL_savestack_ix - 1;
817 ANY *p = &PL_savestack[ix];
818 uv = p->any_uv;
819 type = (U8)uv & SAVE_MASK;
820 if (type > SAVEt_ARG0_MAX) {
821 ANY *p0 = p;
822 arg0 = *--p;
823 if (type > SAVEt_ARG1_MAX) {
824 arg1 = *--p;
825 if (type > SAVEt_ARG2_MAX) {
826 arg2 = *--p;
827 }
828 }
829 ix -= (p0 - p);
830 }
831 PL_savestack_ix = ix;
832 }
833
c6bf6a65 834 switch (type) {
79072805 835 case SAVEt_ITEM: /* normal string */
03dba561 836 sv_replace(ARG1_SV, ARG0_SV);
5d9574c1 837 if (UNLIKELY(SvSMAGICAL(ARG1_SV))) {
b492a59e
DM
838 PL_localizing = 2;
839 mg_set(ARG1_SV);
840 PL_localizing = 0;
841 }
79072805 842 break;
03dba561
DM
843
844 /* This would be a mathom, but Perl_save_svref() calls a static
845 function, S_save_scalar_at(), so has to stay in this file. */
846 case SAVEt_SVREF: /* scalar reference */
847 svp = ARG1_SVP;
848 refsv = NULL; /* what to refcnt_dec */
849 goto restore_sv;
850
8aacddc1 851 case SAVEt_SV: /* scalar reference */
03dba561
DM
852 svp = &GvSV(ARG1_GV);
853 refsv = ARG1_SV; /* what to refcnt_dec */
2053acbf 854 restore_sv:
03dba561
DM
855 {
856 SV * const sv = *svp;
857 *svp = ARG0_SV;
2053acbf 858 SvREFCNT_dec(sv);
5d9574c1 859 if (UNLIKELY(SvSMAGICAL(ARG0_SV))) {
b492a59e
DM
860 PL_localizing = 2;
861 mg_set(ARG0_SV);
862 PL_localizing = 0;
863 }
4a9a56a7 864 SvREFCNT_dec_NN(ARG0_SV);
03dba561 865 SvREFCNT_dec(refsv);
2053acbf 866 break;
03dba561 867 }
8aacddc1 868 case SAVEt_GENERIC_PVREF: /* generic pv */
03dba561
DM
869 if (*ARG0_PVP != ARG1_PV) {
870 Safefree(*ARG0_PVP);
871 *ARG0_PVP = ARG1_PV;
f4dd75d9
GS
872 }
873 break;
05ec9bb3 874 case SAVEt_SHARED_PVREF: /* shared pv */
03dba561 875 if (*ARG1_PVP != ARG0_PV) {
5e54c26f 876#ifdef NETWARE
03dba561 877 PerlMem_free(*ARG1_PVP);
5e54c26f 878#else
03dba561 879 PerlMemShared_free(*ARG1_PVP);
5e54c26f 880#endif
03dba561 881 *ARG1_PVP = ARG0_PV;
05ec9bb3
NIS
882 }
883 break;
f83b46a0 884 case SAVEt_GVSV: /* scalar slot in GV */
03dba561 885 svp = &GvSV(ARG1_GV);
f83b46a0 886 goto restore_svp;
8aacddc1 887 case SAVEt_GENERIC_SVREF: /* generic sv */
03dba561 888 svp = ARG1_SVP;
f83b46a0 889 restore_svp:
03dba561
DM
890 {
891 SV * const sv = *svp;
892 *svp = ARG0_SV;
f4dd75d9 893 SvREFCNT_dec(sv);
03dba561 894 SvREFCNT_dec(ARG0_SV);
b9d12d37 895 break;
03dba561 896 }
db9306af 897 case SAVEt_GVSLOT: /* any slot in GV */
03dba561
DM
898 {
899 HV *const hv = GvSTASH(ARG2_GV);
900 svp = ARG1_SVP;
db9306af 901 if (hv && HvENAME(hv) && (
03dba561
DM
902 (ARG0_SV && SvTYPE(ARG0_SV) == SVt_PVCV)
903 || (*svp && SvTYPE(*svp) == SVt_PVCV)
db9306af
FC
904 ))
905 {
03dba561
DM
906 if ((char *)svp < (char *)GvGP(ARG2_GV)
907 || (char *)svp > (char *)GvGP(ARG2_GV) + sizeof(struct gp)
908 || GvREFCNT(ARG2_GV) > 1)
db9306af
FC
909 PL_sub_generation++;
910 else mro_method_changed_in(hv);
911 }
912 goto restore_svp;
03dba561 913 }
8aacddc1 914 case SAVEt_AV: /* array reference */
03dba561
DM
915 SvREFCNT_dec(GvAV(ARG1_GV));
916 GvAV(ARG1_GV) = ARG0_AV;
5d9574c1 917 if (UNLIKELY(SvSMAGICAL(ARG0_SV))) {
b492a59e
DM
918 PL_localizing = 2;
919 mg_set(ARG0_SV);
920 PL_localizing = 0;
921 }
4a9a56a7 922 SvREFCNT_dec_NN(ARG1_GV);
8aacddc1
NIS
923 break;
924 case SAVEt_HV: /* hash reference */
03dba561
DM
925 SvREFCNT_dec(GvHV(ARG1_GV));
926 GvHV(ARG1_GV) = ARG0_HV;
5d9574c1 927 if (UNLIKELY(SvSMAGICAL(ARG0_SV))) {
b492a59e
DM
928 PL_localizing = 2;
929 mg_set(ARG0_SV);
930 PL_localizing = 0;
931 }
4a9a56a7 932 SvREFCNT_dec_NN(ARG1_GV);
8aacddc1 933 break;
994d373a 934 case SAVEt_INT_SMALL:
03dba561 935 *(int*)ARG0_PTR = (int)(uv >> SAVE_TIGHT_SHIFT);
994d373a 936 break;
79072805 937 case SAVEt_INT: /* int reference */
03dba561 938 *(int*)ARG0_PTR = (int)ARG1_I32;
79072805 939 break;
e8eb279c
FC
940 case SAVEt_STRLEN: /* STRLEN/size_t ref */
941 *(STRLEN*)ARG0_PTR = (STRLEN)arg1.any_iv;
942 break;
9febdf04 943 case SAVEt_BOOL: /* bool reference */
03dba561 944 *(bool*)ARG0_PTR = cBOOL(uv >> 8);
9a9b5ec9
DM
945#ifdef NO_TAINT_SUPPORT
946 PERL_UNUSED_VAR(was);
947#else
5d9574c1 948 if (UNLIKELY(ARG0_PTR == &(TAINT_get))) {
b6f93e7a
KW
949 /* If we don't update <was>, to reflect what was saved on the
950 * stack for PL_tainted, then we will overwrite this attempt to
951 * restore it when we exit this routine. Note that this won't
952 * work if this value was saved in a wider-than necessary type,
953 * such as I32 */
03dba561 954 was = *(bool*)ARG0_PTR;
b6f93e7a 955 }
284167a5 956#endif
9febdf04 957 break;
89abef21 958 case SAVEt_I32_SMALL:
03dba561 959 *(I32*)ARG0_PTR = (I32)(uv >> SAVE_TIGHT_SHIFT);
89abef21 960 break;
79072805 961 case SAVEt_I32: /* I32 reference */
3235b7a3 962#ifdef PERL_DEBUG_READONLY_OPS
03dba561 963 if (*(I32*)ARG0_PTR != ARG1_I32)
3235b7a3 964#endif
03dba561 965 *(I32*)ARG0_PTR = ARG1_I32;
79072805
LW
966 break;
967 case SAVEt_SPTR: /* SV* reference */
03dba561 968 *(SV**)(ARG0_PTR)= ARG1_SV;
79072805 969 break;
146174a9 970 case SAVEt_VPTR: /* random* reference */
85e6fe83 971 case SAVEt_PPTR: /* char* reference */
03dba561 972 *ARG0_PVP = ARG1_PV;
85e6fe83 973 break;
79072805 974 case SAVEt_HPTR: /* HV* reference */
03dba561 975 *(HV**)ARG0_PTR = MUTABLE_HV(ARG1_PTR);
79072805
LW
976 break;
977 case SAVEt_APTR: /* AV* reference */
03dba561 978 *(AV**)ARG0_PTR = ARG1_AV;
79072805 979 break;
fb73857a 980 case SAVEt_GP: /* scalar reference */
03dba561
DM
981 {
982 HV *hv;
983 /* possibly taking a method out of circulation */
984 const bool had_method = !!GvCVu(ARG1_GV);
985 gp_free(ARG1_GV);
986 GvGP_set(ARG1_GV, (GP*)ARG0_PTR);
987 if ((hv=GvSTASH(ARG1_GV)) && HvENAME_get(hv)) {
988 if ( GvNAMELEN(ARG1_GV) == 3
989 && strnEQ(GvNAME(ARG1_GV), "ISA", 3)
990 )
991 mro_isa_changed_in(hv);
992 else if (had_method || GvCVu(ARG1_GV))
993 /* putting a method back into circulation ("local")*/
994 gv_method_changed(ARG1_GV);
3d460042 995 }
4a9a56a7 996 SvREFCNT_dec_NN(ARG1_GV);
8aacddc1 997 break;
03dba561 998 }
8990e307 999 case SAVEt_FREESV:
03dba561 1000 SvREFCNT_dec(ARG0_SV);
8990e307 1001 break;
3987a177 1002 case SAVEt_FREECOPHH:
03dba561 1003 cophh_free((COPHH *)ARG0_PTR);
3987a177 1004 break;
26d9b02f 1005 case SAVEt_MORTALIZESV:
03dba561 1006 sv_2mortal(ARG0_SV);
26d9b02f 1007 break;
8990e307 1008 case SAVEt_FREEOP:
5e5ba94b 1009 ASSERT_CURPAD_LEGAL("SAVEt_FREEOP");
03dba561 1010 op_free((OP*)ARG0_PTR);
8990e307
LW
1011 break;
1012 case SAVEt_FREEPV:
03dba561 1013 Safefree(ARG0_PTR);
8990e307 1014 break;
4e09461c
DM
1015
1016 {
1017 SV **svp;
03dba561
DM
1018 I32 i;
1019 SV *sv;
1020
4e09461c
DM
1021 case SAVEt_CLEARPADRANGE:
1022 i = (I32)((uv >> SAVE_TIGHT_SHIFT) & OPpPADRANGE_COUNTMASK);
1023 svp = &PL_curpad[uv >>
1024 (OPpPADRANGE_COUNTSHIFT + SAVE_TIGHT_SHIFT)] + i - 1;
1025 goto clearsv;
8990e307 1026 case SAVEt_CLEARSV:
4e09461c
DM
1027 svp = &PL_curpad[uv >> SAVE_TIGHT_SHIFT];
1028 i = 1;
1029 clearsv:
1030 for (; i; i--, svp--) {
528ad060
DM
1031 sv = *svp;
1032
1033 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
1034 "Pad 0x%"UVxf"[0x%"UVxf"] clearsv: %ld sv=0x%"UVxf"<%"IVdf"> %s\n",
1035 PTR2UV(PL_comppad), PTR2UV(PL_curpad),
1036 (long)(svp-PL_curpad), PTR2UV(sv), (IV)SvREFCNT(sv),
1037 (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) ? "clear" : "abandon"
1038 ));
1039
d263c017
DM
1040 assert(SvPADMY(sv));
1041
528ad060 1042 /* Can clear pad variable in place? */
9af15990 1043 if (SvREFCNT(sv) == 1 && !SvOBJECT(sv)) {
a07f0bef 1044
a07f0bef
DM
1045 /* these flags are the union of all the relevant flags
1046 * in the individual conditions within */
1047 if (UNLIKELY(SvFLAGS(sv) & (
1048 SVf_READONLY /* for SvREADONLY_off() */
1049 | (SVs_GMG|SVs_SMG|SVs_RMG) /* SvMAGICAL() */
7532eaae 1050 | SVf_OOK
a07f0bef
DM
1051 | SVf_THINKFIRST)))
1052 {
7500fc82
DM
1053 /* if a my variable that was made readonly is
1054 * going out of scope, we want to remove the
1055 * readonlyness so that it can go out of scope
1056 * quietly
1057 */
d263c017 1058 if (SvREADONLY(sv) && !SvFAKE(sv))
7500fc82
DM
1059 SvREADONLY_off(sv);
1060
7532eaae
DM
1061 if (SvOOK(sv)) { /* OOK or HvAUX */
1062 if (SvTYPE(sv) == SVt_PVHV)
1063 Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
1064 else
1065 sv_backoff(sv);
1066 }
1067
7500fc82 1068 if (SvMAGICAL(sv)) {
7532eaae
DM
1069 /* note that backrefs (either in HvAUX or magic)
1070 * must be removed before other magic */
7500fc82
DM
1071 sv_unmagic(sv, PERL_MAGIC_backref);
1072 if (SvTYPE(sv) != SVt_PVCV)
1073 mg_free(sv);
1074 }
1075 if (SvTHINKFIRST(sv))
1076 sv_force_normal_flags(sv, SV_IMMEDIATE_UNREF
1077 |SV_COW_DROP_PV);
528ad060 1078
a07f0bef 1079 }
528ad060
DM
1080 switch (SvTYPE(sv)) {
1081 case SVt_NULL:
1082 break;
1083 case SVt_PVAV:
1084 av_clear(MUTABLE_AV(sv));
1085 break;
1086 case SVt_PVHV:
1087 hv_clear(MUTABLE_HV(sv));
1088 break;
1089 case SVt_PVCV:
1090 {
1091 HEK * const hek = CvNAME_HEK((CV *)sv);
1092 assert(hek);
1093 share_hek_hek(hek);
1094 cv_undef((CV *)sv);
1095 CvNAME_HEK_set(sv, hek);
1096 break;
1097 }
1098 default:
c79d0076
NC
1099 /* This looks odd, but these two macros are for use in
1100 expressions and finish with a trailing comma, so
1101 adding a ; after them would be wrong. */
1102 assert_not_ROK(sv)
1103 assert_not_glob(sv)
5c85b638 1104 SvFLAGS(sv) &=~ (SVf_OK|SVf_IVisUV|SVf_UTF8);
528ad060
DM
1105 break;
1106 }
1107 SvPADSTALE_on(sv); /* mark as no longer live */
1108 }
1109 else { /* Someone has a claim on this, so abandon it. */
1110 assert( SvFLAGS(sv) & SVs_PADMY);
1111 assert(!(SvFLAGS(sv) & SVs_PADTMP));
1112 switch (SvTYPE(sv)) { /* Console ourselves with a new value */
1113 case SVt_PVAV: *svp = MUTABLE_SV(newAV()); break;
1114 case SVt_PVHV: *svp = MUTABLE_SV(newHV()); break;
1115 case SVt_PVCV:
1116 {
1117 /* Create a stub */
1118 *svp = newSV_type(SVt_PVCV);
1119
1120 /* Share name */
1121 assert(CvNAMED(sv));
1122 CvNAME_HEK_set(*svp,
1123 share_hek_hek(CvNAME_HEK((CV *)sv)));
1124 break;
1125 }
1126 default: *svp = newSV(0); break;
1127 }
4a9a56a7 1128 SvREFCNT_dec_NN(sv); /* Cast current value to the winds. */
528ad060
DM
1129 /* preserve pad nature, but also mark as not live
1130 * for any closure capturing */
1131 SvFLAGS(*svp) |= (SVs_PADMY|SVs_PADSTALE);
1132 }
4e09461c 1133 }
8990e307 1134 break;
4e09461c 1135 }
8990e307 1136 case SAVEt_DELETE:
03dba561
DM
1137 (void)hv_delete(ARG0_HV, ARG2_PV, ARG1_I32, G_DISCARD);
1138 SvREFCNT_dec(ARG0_HV);
1139 Safefree(arg2.any_ptr);
8990e307 1140 break;
c68ec7a9 1141 case SAVEt_ADELETE:
c70927a6 1142 (void)av_delete(ARG0_AV, arg1.any_iv, G_DISCARD);
03dba561 1143 SvREFCNT_dec(ARG0_AV);
c68ec7a9 1144 break;
146174a9 1145 case SAVEt_DESTRUCTOR_X:
03dba561 1146 (*arg1.any_dxptr)(aTHX_ ARG0_PTR);
a0d0e21e
LW
1147 break;
1148 case SAVEt_REGCONTEXT:
e0fa7e2b 1149 /* regexp must have croaked */
455ece5e 1150 case SAVEt_ALLOC:
1be36ce0 1151 PL_savestack_ix -= uv >> SAVE_TIGHT_SHIFT;
a0d0e21e 1152 break;
55497cff 1153 case SAVEt_STACK_POS: /* Position on Perl stack */
03dba561 1154 PL_stack_sp = PL_stack_base + arg0.any_i32;
55497cff 1155 break;
161b7d16 1156 case SAVEt_AELEM: /* array element */
c70927a6 1157 svp = av_fetch(ARG2_AV, arg1.any_iv, 1);
5d9574c1 1158 if (UNLIKELY(!AvREAL(ARG2_AV) && AvREIFY(ARG2_AV))) /* undo reify guard */
03dba561 1159 SvREFCNT_dec(ARG0_SV);
5d9574c1 1160 if (LIKELY(svp)) {
03dba561 1161 SV * const sv = *svp;
5d9574c1
DM
1162 if (LIKELY(sv && sv != &PL_sv_undef)) {
1163 if (UNLIKELY(SvTIED_mg((const SV *)ARG2_AV, PERL_MAGIC_tied)))
b37c2d43 1164 SvREFCNT_inc_void_NN(sv);
03dba561 1165 refsv = ARG2_SV;
4e4c362e
GS
1166 goto restore_sv;
1167 }
1168 }
03dba561
DM
1169 SvREFCNT_dec(ARG2_AV);
1170 SvREFCNT_dec(ARG0_SV);
4e4c362e 1171 break;
161b7d16 1172 case SAVEt_HELEM: /* hash element */
03dba561
DM
1173 {
1174 HE * const he = hv_fetch_ent(ARG2_HV, ARG1_SV, 1, 0);
1175 SvREFCNT_dec(ARG1_SV);
5d9574c1 1176 if (LIKELY(he)) {
03dba561 1177 const SV * const oval = HeVAL(he);
5d9574c1 1178 if (LIKELY(oval && oval != &PL_sv_undef)) {
03dba561 1179 svp = &HeVAL(he);
5d9574c1 1180 if (UNLIKELY(SvTIED_mg((const SV *)ARG2_HV, PERL_MAGIC_tied)))
03dba561
DM
1181 SvREFCNT_inc_void(*svp);
1182 refsv = ARG2_SV; /* what to refcnt_dec */
4e4c362e
GS
1183 goto restore_sv;
1184 }
1185 }
03dba561
DM
1186 SvREFCNT_dec(ARG2_HV);
1187 SvREFCNT_dec(ARG0_SV);
4e4c362e 1188 break;
03dba561 1189 }
462e5cf6 1190 case SAVEt_OP:
03dba561 1191 PL_op = (OP*)ARG0_PTR;
462e5cf6 1192 break;
25eaa213 1193 case SAVEt_HINTS:
3607ca02
FC
1194 if ((PL_hints & HINT_LOCALIZE_HH)) {
1195 while (GvHV(PL_hintgv)) {
2653c1e3 1196 HV *hv = GvHV(PL_hintgv);
045ac317 1197 GvHV(PL_hintgv) = NULL;
2653c1e3 1198 SvREFCNT_dec(MUTABLE_SV(hv));
3607ca02 1199 }
045ac317 1200 }
20439bc7 1201 cophh_free(CopHINTHASH_get(&PL_compiling));
03dba561
DM
1202 CopHINTHASH_set(&PL_compiling, (COPHH*)ARG0_PTR);
1203 *(I32*)&PL_hints = ARG1_I32;
dfa41748 1204 if (PL_hints & HINT_LOCALIZE_HH) {
ad64d0ec 1205 SvREFCNT_dec(MUTABLE_SV(GvHV(PL_hintgv)));
85fbaab2 1206 GvHV(PL_hintgv) = MUTABLE_HV(SSPOPPTR);
2653c1e3
DM
1207 }
1208 if (!GvHV(PL_hintgv)) {
a3fb8386
FC
1209 /* Need to add a new one manually, else rv2hv can
1210 add one via GvHVn and it won't have the magic set. */
5b9c0671
NC
1211 HV *const hv = newHV();
1212 hv_magic(hv, NULL, PERL_MAGIC_hints);
1213 GvHV(PL_hintgv) = hv;
dfa41748 1214 }
5b9c0671 1215 assert(GvHV(PL_hintgv));
b3ac6de7 1216 break;
cb50131a 1217 case SAVEt_COMPPAD:
03dba561 1218 PL_comppad = (PAD*)ARG0_PTR;
5d9574c1 1219 if (LIKELY(PL_comppad))
cb50131a
CB
1220 PL_curpad = AvARRAY(PL_comppad);
1221 else
4608196e 1222 PL_curpad = NULL;
cb50131a 1223 break;
09edbca0 1224 case SAVEt_PADSV_AND_MORTALIZE:
c3564e5c 1225 {
09edbca0 1226 SV **svp;
03dba561
DM
1227 assert (ARG1_PTR);
1228 svp = AvARRAY((PAD*)ARG1_PTR) + (PADOFFSET)arg0.any_uv;
09edbca0
NC
1229 /* This mortalizing used to be done by POPLOOP() via itersave.
1230 But as we have all the information here, we can do it here,
1231 save even having to have itersave in the struct. */
1232 sv_2mortal(*svp);
03dba561 1233 *svp = ARG2_SV;
c3564e5c
GS
1234 }
1235 break;
8b7059b1
DM
1236 case SAVEt_SAVESWITCHSTACK:
1237 {
1238 dSP;
03dba561
DM
1239 SWITCHSTACK(ARG0_AV, ARG1_AV);
1240 PL_curstackinfo->si_stack = ARG1_AV;
8b7059b1
DM
1241 }
1242 break;
14f338dc 1243 case SAVEt_SET_SVFLAGS:
03dba561
DM
1244 SvFLAGS(ARG2_SV) &= ~((U32)ARG1_I32);
1245 SvFLAGS(ARG2_SV) |= (U32)ARG0_I32;
14f338dc 1246 break;
95e06916 1247
95e06916
NC
1248 /* These are only saved in mathoms.c */
1249 case SAVEt_NSTAB:
03dba561 1250 (void)sv_clear(ARG0_SV);
95e06916 1251 break;
2053acbf 1252 case SAVEt_LONG: /* long reference */
03dba561 1253 *(long*)ARG0_PTR = arg1.any_long;
2053acbf 1254 break;
95e06916 1255 case SAVEt_IV: /* IV reference */
03dba561 1256 *(IV*)ARG0_PTR = arg1.any_iv;
95e06916
NC
1257 break;
1258
2053acbf 1259 case SAVEt_I16: /* I16 reference */
03dba561 1260 *(I16*)ARG0_PTR = (I16)(uv >> 8);
2053acbf
NC
1261 break;
1262 case SAVEt_I8: /* I8 reference */
03dba561 1263 *(I8*)ARG0_PTR = (I8)(uv >> 8);
2053acbf 1264 break;
2053acbf 1265 case SAVEt_DESTRUCTOR:
03dba561 1266 (*arg1.any_dptr)(ARG0_PTR);
2053acbf 1267 break;
68da3b2f 1268 case SAVEt_COMPILE_WARNINGS:
68da3b2f
NC
1269 if (!specialWARN(PL_compiling.cop_warnings))
1270 PerlMemShared_free(PL_compiling.cop_warnings);
72dc9ed5 1271
03dba561 1272 PL_compiling.cop_warnings = (STRLEN*)ARG0_PTR;
72dc9ed5 1273 break;
7c197c94 1274 case SAVEt_PARSER:
03dba561 1275 parser_free((yy_parser *) ARG0_PTR);
7c197c94 1276 break;
20d5dc23
FC
1277 case SAVEt_READONLY_OFF:
1278 SvREADONLY_off(ARG0_SV);
1279 break;
79072805 1280 default:
5637ef5b 1281 Perl_croak(aTHX_ "panic: leave_scope inconsistency %u", type);
79072805
LW
1282 }
1283 }
302c0c93 1284
284167a5 1285 TAINT_set(was);
79072805 1286}
8990e307 1287
8990e307 1288void
864dbfa3 1289Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
8990e307 1290{
97aff369 1291 dVAR;
7918f24d
NC
1292
1293 PERL_ARGS_ASSERT_CX_DUMP;
1294
35ff7856 1295#ifdef DEBUGGING
22c35a8c 1296 PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), PL_block_type[CxTYPE(cx)]);
6b35e009 1297 if (CxTYPE(cx) != CXt_SUBST) {
e8d9e9d0 1298 const char *gimme_text;
760ac839 1299 PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
146174a9
CB
1300 PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%"UVxf"\n",
1301 PTR2UV(cx->blk_oldcop));
760ac839
LW
1302 PerlIO_printf(Perl_debug_log, "BLK_OLDMARKSP = %ld\n", (long)cx->blk_oldmarksp);
1303 PerlIO_printf(Perl_debug_log, "BLK_OLDSCOPESP = %ld\n", (long)cx->blk_oldscopesp);
146174a9
CB
1304 PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%"UVxf"\n",
1305 PTR2UV(cx->blk_oldpm));
e8d9e9d0
VP
1306 switch (cx->blk_gimme) {
1307 case G_VOID:
1308 gimme_text = "VOID";
1309 break;
1310 case G_SCALAR:
1311 gimme_text = "SCALAR";
1312 break;
1313 case G_ARRAY:
1314 gimme_text = "LIST";
1315 break;
1316 default:
1317 gimme_text = "UNKNOWN";
1318 break;
1319 }
1320 PerlIO_printf(Perl_debug_log, "BLK_GIMME = %s\n", gimme_text);
8990e307 1321 }
6b35e009 1322 switch (CxTYPE(cx)) {
8990e307
LW
1323 case CXt_NULL:
1324 case CXt_BLOCK:
1325 break;
146174a9 1326 case CXt_FORMAT:
f9c764c5
NC
1327 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.CV = 0x%"UVxf"\n",
1328 PTR2UV(cx->blk_format.cv));
1329 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.GV = 0x%"UVxf"\n",
1330 PTR2UV(cx->blk_format.gv));
1331 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.DFOUTGV = 0x%"UVxf"\n",
1332 PTR2UV(cx->blk_format.dfoutgv));
1333 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.HASARGS = %d\n",
bafb2adc 1334 (int)CxHASARGS(cx));
f9c764c5
NC
1335 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.RETOP = 0x%"UVxf"\n",
1336 PTR2UV(cx->blk_format.retop));
146174a9 1337 break;
8990e307 1338 case CXt_SUB:
146174a9
CB
1339 PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
1340 PTR2UV(cx->blk_sub.cv));
760ac839 1341 PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
8990e307 1342 (long)cx->blk_sub.olddepth);
760ac839 1343 PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
bafb2adc
NC
1344 (int)CxHASARGS(cx));
1345 PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n", (int)CxLVAL(cx));
f39bc417
DM
1346 PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%"UVxf"\n",
1347 PTR2UV(cx->blk_sub.retop));
8990e307
LW
1348 break;
1349 case CXt_EVAL:
760ac839 1350 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
85a64632 1351 (long)CxOLD_IN_EVAL(cx));
760ac839 1352 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
85a64632
NC
1353 PL_op_name[CxOLD_OP_TYPE(cx)],
1354 PL_op_desc[CxOLD_OP_TYPE(cx)]);
0f79a09d
GS
1355 if (cx->blk_eval.old_namesv)
1356 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
aa07b2f6 1357 SvPVX_const(cx->blk_eval.old_namesv));
146174a9
CB
1358 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%"UVxf"\n",
1359 PTR2UV(cx->blk_eval.old_eval_root));
f39bc417
DM
1360 PerlIO_printf(Perl_debug_log, "BLK_EVAL.RETOP = 0x%"UVxf"\n",
1361 PTR2UV(cx->blk_eval.retop));
8990e307
LW
1362 break;
1363
c6fdafd0 1364 case CXt_LOOP_LAZYIV:
d01136d6 1365 case CXt_LOOP_LAZYSV:
3b719c58
NC
1366 case CXt_LOOP_FOR:
1367 case CXt_LOOP_PLAIN:
0cbdab38 1368 PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n", CxLABEL(cx));
760ac839 1369 PerlIO_printf(Perl_debug_log, "BLK_LOOP.RESETSP = %ld\n",
8990e307 1370 (long)cx->blk_loop.resetsp);
022eaa24
NC
1371 PerlIO_printf(Perl_debug_log, "BLK_LOOP.MY_OP = 0x%"UVxf"\n",
1372 PTR2UV(cx->blk_loop.my_op));
d01136d6 1373 /* XXX: not accurate for LAZYSV/IV */
146174a9 1374 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%"UVxf"\n",
d01136d6
BS
1375 PTR2UV(cx->blk_loop.state_u.ary.ary));
1376 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
1377 (long)cx->blk_loop.state_u.ary.ix);
146174a9
CB
1378 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%"UVxf"\n",
1379 PTR2UV(CxITERVAR(cx)));
8990e307
LW
1380 break;
1381
1382 case CXt_SUBST:
760ac839 1383 PerlIO_printf(Perl_debug_log, "SB_ITERS = %ld\n",
8990e307 1384 (long)cx->sb_iters);
760ac839 1385 PerlIO_printf(Perl_debug_log, "SB_MAXITERS = %ld\n",
8990e307 1386 (long)cx->sb_maxiters);
35ef4773
GS
1387 PerlIO_printf(Perl_debug_log, "SB_RFLAGS = %ld\n",
1388 (long)cx->sb_rflags);
760ac839 1389 PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
c5bed6a7 1390 (long)CxONCE(cx));
760ac839 1391 PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
8990e307 1392 cx->sb_orig);
146174a9
CB
1393 PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%"UVxf"\n",
1394 PTR2UV(cx->sb_dstr));
1395 PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%"UVxf"\n",
1396 PTR2UV(cx->sb_targ));
1397 PerlIO_printf(Perl_debug_log, "SB_S = 0x%"UVxf"\n",
1398 PTR2UV(cx->sb_s));
1399 PerlIO_printf(Perl_debug_log, "SB_M = 0x%"UVxf"\n",
1400 PTR2UV(cx->sb_m));
1401 PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%"UVxf"\n",
1402 PTR2UV(cx->sb_strend));
1403 PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%"UVxf"\n",
1404 PTR2UV(cx->sb_rxres));
8990e307
LW
1405 break;
1406 }
65e66c80 1407#else
96a5add6 1408 PERL_UNUSED_CONTEXT;
65e66c80 1409 PERL_UNUSED_ARG(cx);
17c3b450 1410#endif /* DEBUGGING */
35ff7856 1411}
241d1a3b
NC
1412
1413/*
1414 * Local variables:
1415 * c-indentation-style: bsd
1416 * c-basic-offset: 4
14d04a33 1417 * indent-tabs-mode: nil
241d1a3b
NC
1418 * End:
1419 *
14d04a33 1420 * ex: set ts=8 sts=4 sw=4 et:
37442d52 1421 */