This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / scope.c
CommitLineData
a0d0e21e 1/* scope.c
79072805 2 *
e6906430 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
ae53e38e 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 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/*
12 * "For the fashion of Minas Tirith was such that it was built on seven
13 * levels..."
79072805
LW
14 */
15
40d34c0d
SB
16/* This file contains functions to manipulate several of Perl's stacks;
17 * in particular it contains code to push various types of things onto
18 * the savestack, then to pop them off and perform the correct restorative
19 * action for each one. This corresponds to the cleanup Perl does at
20 * each scope exit.
21 */
22
79072805 23#include "EXTERN.h"
864dbfa3 24#define PERL_IN_SCOPE_C
79072805
LW
25#include "perl.h"
26
14dd3ad8 27#if defined(PERL_FLEXIBLE_EXCEPTIONS)
312caa8e 28void *
146174a9
CB
29Perl_default_protect(pTHX_ volatile JMPENV *pcur_env, int *excpt,
30 protect_body_t body, ...)
312caa8e 31{
c5be433b
GS
32 void *ret;
33 va_list args;
34 va_start(args, body);
146174a9 35 ret = vdefault_protect(pcur_env, excpt, body, &args);
c5be433b
GS
36 va_end(args);
37 return ret;
38}
39
40void *
146174a9
CB
41Perl_vdefault_protect(pTHX_ volatile JMPENV *pcur_env, int *excpt,
42 protect_body_t body, va_list *args)
c5be433b 43{
312caa8e
CS
44 int ex;
45 void *ret;
46
312caa8e
CS
47 JMPENV_PUSH(ex);
48 if (ex)
49 ret = NULL;
c5be433b
GS
50 else
51 ret = CALL_FPTR(body)(aTHX_ *args);
a6c40364 52 *excpt = ex;
312caa8e
CS
53 JMPENV_POP;
54 return ret;
55}
14dd3ad8 56#endif
312caa8e 57
a0d0e21e 58SV**
864dbfa3 59Perl_stack_grow(pTHX_ SV **sp, SV **p, int n)
a0d0e21e 60{
3280af22 61 PL_stack_sp = sp;
2ce36478 62#ifndef STRESS_REALLOC
3280af22 63 av_extend(PL_curstack, (p - PL_stack_base) + (n) + 128);
2ce36478 64#else
6b88bc9c 65 av_extend(PL_curstack, (p - PL_stack_base) + (n) + 1);
2ce36478 66#endif
3280af22 67 return PL_stack_sp;
a0d0e21e
LW
68}
69
2ce36478
SM
70#ifndef STRESS_REALLOC
71#define GROW(old) ((old) * 3 / 2)
72#else
73#define GROW(old) ((old) + 1)
74#endif
75
e336de0d 76PERL_SI *
864dbfa3 77Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
e336de0d
GS
78{
79 PERL_SI *si;
cd7a8267 80 Newx(si, 1, PERL_SI);
e336de0d
GS
81 si->si_stack = newAV();
82 AvREAL_off(si->si_stack);
83 av_extend(si->si_stack, stitems > 0 ? stitems-1 : 0);
3280af22 84 AvALLOC(si->si_stack)[0] = &PL_sv_undef;
e336de0d
GS
85 AvFILLp(si->si_stack) = 0;
86 si->si_prev = 0;
87 si->si_next = 0;
88 si->si_cxmax = cxitems - 1;
89 si->si_cxix = -1;
e788e7d3 90 si->si_type = PERLSI_UNDEF;
cd7a8267 91 Newx(si->si_cxstack, cxitems, PERL_CONTEXT);
9965345d
JH
92 /* Without any kind of initialising PUSHSUBST()
93 * in pp_subst() will read uninitialised heap. */
6f6cc653 94 PoisonNew(si->si_cxstack, cxitems, PERL_CONTEXT);
e336de0d
GS
95 return si;
96}
97
79072805 98I32
864dbfa3 99Perl_cxinc(pTHX)
79072805 100{
8c18bf38 101 const IV old_max = cxstack_max;
2ce36478 102 cxstack_max = GROW(cxstack_max);
c09156bb 103 Renew(cxstack, cxstack_max + 1, PERL_CONTEXT); /* XXX should fix CXINC macro */
9965345d
JH
104 /* Without any kind of initialising deep enough recursion
105 * will end up reading uninitialised PERL_CONTEXTs. */
6f6cc653 106 PoisonNew(cxstack + old_max + 1, cxstack_max - old_max, PERL_CONTEXT);
79072805
LW
107 return cxstack_ix + 1;
108}
109
110void
864dbfa3 111Perl_push_return(pTHX_ OP *retop)
79072805 112{
3280af22
NIS
113 if (PL_retstack_ix == PL_retstack_max) {
114 PL_retstack_max = GROW(PL_retstack_max);
115 Renew(PL_retstack, PL_retstack_max, OP*);
79072805 116 }
3280af22 117 PL_retstack[PL_retstack_ix++] = retop;
79072805
LW
118}
119
120OP *
864dbfa3 121Perl_pop_return(pTHX)
79072805 122{
3280af22
NIS
123 if (PL_retstack_ix > 0)
124 return PL_retstack[--PL_retstack_ix];
79072805
LW
125 else
126 return Nullop;
127}
128
129void
864dbfa3 130Perl_push_scope(pTHX)
79072805 131{
3280af22
NIS
132 if (PL_scopestack_ix == PL_scopestack_max) {
133 PL_scopestack_max = GROW(PL_scopestack_max);
134 Renew(PL_scopestack, PL_scopestack_max, I32);
79072805 135 }
3280af22 136 PL_scopestack[PL_scopestack_ix++] = PL_savestack_ix;
79072805
LW
137
138}
139
140void
864dbfa3 141Perl_pop_scope(pTHX)
79072805 142{
7120cae1 143 const I32 oldsave = PL_scopestack[--PL_scopestack_ix];
8990e307 144 LEAVE_SCOPE(oldsave);
79072805
LW
145}
146
147void
864dbfa3 148Perl_markstack_grow(pTHX)
a0d0e21e 149{
7120cae1
AL
150 const I32 oldmax = PL_markstack_max - PL_markstack;
151 const I32 newmax = GROW(oldmax);
a0d0e21e 152
3280af22
NIS
153 Renew(PL_markstack, newmax, I32);
154 PL_markstack_ptr = PL_markstack + oldmax;
155 PL_markstack_max = PL_markstack + newmax;
a0d0e21e
LW
156}
157
158void
864dbfa3 159Perl_savestack_grow(pTHX)
79072805 160{
8aacddc1 161 PL_savestack_max = GROW(PL_savestack_max) + 4;
3280af22 162 Renew(PL_savestack, PL_savestack_max, ANY);
79072805
LW
163}
164
f3479639
JH
165void
166Perl_savestack_grow_cnt(pTHX_ I32 need)
167{
168 PL_savestack_max = PL_savestack_ix + need;
169 Renew(PL_savestack, PL_savestack_max, ANY);
170}
171
2ce36478
SM
172#undef GROW
173
79072805 174void
864dbfa3 175Perl_tmps_grow(pTHX_ I32 n)
677b06e3 176{
677b06e3
GS
177#ifndef STRESS_REALLOC
178 if (n < 128)
179 n = (PL_tmps_max < 512) ? 128 : 512;
180#endif
181 PL_tmps_max = PL_tmps_ix + n + 1;
182 Renew(PL_tmps_stack, PL_tmps_max, SV*);
183}
184
185
186void
864dbfa3 187Perl_free_tmps(pTHX)
79072805
LW
188{
189 /* XXX should tmps_floor live in cxstack? */
7120cae1 190 const I32 myfloor = PL_tmps_floor;
3280af22 191 while (PL_tmps_ix > myfloor) { /* clean up after last statement */
62cc1c5f 192 SV* const sv = PL_tmps_stack[PL_tmps_ix];
0e2d6244 193 PL_tmps_stack[PL_tmps_ix--] = NULL;
8aacddc1 194 if (sv && sv != &PL_sv_undef) {
463ee0b2 195 SvTEMP_off(sv);
8990e307 196 SvREFCNT_dec(sv); /* note, can modify tmps_ix!!! */
463ee0b2 197 }
79072805
LW
198 }
199}
200
76e3520e 201STATIC SV *
cea2e8a9 202S_save_scalar_at(pTHX_ SV **sptr)
79072805 203{
62cc1c5f 204 SV * const osv = *sptr;
133cdda0 205 register SV * const sv = *sptr = newSV(0);
79072805 206
a0d0e21e 207 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) {
a0d0e21e 208 if (SvGMAGICAL(osv)) {
7120cae1 209 const bool oldtainted = PL_tainted;
a0d0e21e 210 SvFLAGS(osv) |= (SvFLAGS(osv) &
d342bb89 211 (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
3280af22 212 PL_tainted = oldtainted;
a0d0e21e 213 }
74435569 214 mg_localize(osv, sv);
79072805
LW
215 }
216 return sv;
217}
218
7a4c00b4 219SV *
864dbfa3 220Perl_save_scalar(pTHX_ GV *gv)
7a4c00b4 221{
e776e865 222 SV ** const sptr = &GvSVn(gv);
74435569
NC
223 PL_localizing = 1;
224 SvGETMAGIC(*sptr);
225 PL_localizing = 0;
7a4c00b4 226 SSCHECK(3);
be2d5e07 227 SSPUSHPTR(SvREFCNT_inc_simple(gv));
4e4c362e 228 SSPUSHPTR(SvREFCNT_inc(*sptr));
7a4c00b4 229 SSPUSHINT(SAVEt_SV);
4e4c362e 230 return save_scalar_at(sptr);
7a4c00b4 231}
232
f4dd75d9 233/* Like save_sptr(), but also SvREFCNT_dec()s the new value. Can be used to
b9d12d37
GS
234 * restore a global SV to its prior contents, freeing new value. */
235void
864dbfa3 236Perl_save_generic_svref(pTHX_ SV **sptr)
b9d12d37 237{
b9d12d37
GS
238 SSCHECK(3);
239 SSPUSHPTR(sptr);
240 SSPUSHPTR(SvREFCNT_inc(*sptr));
241 SSPUSHINT(SAVEt_GENERIC_SVREF);
242}
243
f4dd75d9
GS
244/* Like save_pptr(), but also Safefree()s the new value if it is different
245 * from the old one. Can be used to restore a global char* to its prior
246 * contents, freeing new value. */
247void
248Perl_save_generic_pvref(pTHX_ char **str)
249{
f4dd75d9
GS
250 SSCHECK(3);
251 SSPUSHPTR(str);
252 SSPUSHPTR(*str);
253 SSPUSHINT(SAVEt_GENERIC_PVREF);
254}
255
05ec9bb3
NIS
256/* Like save_generic_pvref(), but uses PerlMemShared_free() rather than Safefree().
257 * Can be used to restore a shared global char* to its prior
258 * contents, freeing new value. */
259void
260Perl_save_shared_pvref(pTHX_ char **str)
261{
262 SSCHECK(3);
263 SSPUSHPTR(str);
264 SSPUSHPTR(*str);
265 SSPUSHINT(SAVEt_SHARED_PVREF);
266}
267
79072805 268void
864dbfa3 269Perl_save_gp(pTHX_ GV *gv, I32 empty)
79072805 270{
f0e060fc 271 SSGROW(3);
4633a7c4 272 SSPUSHPTR(SvREFCNT_inc(gv));
5f05dabc 273 SSPUSHPTR(GvGP(gv));
f0e060fc 274 SSPUSHINT(SAVEt_GP_NEW);
79072805 275
5f05dabc 276 if (empty) {
22400caf 277 GP *gp = Perl_newGP(aTHX_ gv);
146174a9 278
fae75791 279 if (GvCVu(gv))
3280af22 280 PL_sub_generation++; /* taking a method out of circulation */
146174a9
CB
281 if (GvIOp(gv) && (IoFLAGS(GvIOp(gv)) & IOf_ARGV)) {
282 gp->gp_io = newIO();
283 IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
284 }
22400caf 285 GvGP(gv) = gp;
5f05dabc 286 }
287 else {
44a8e56a 288 gp_ref(GvGP(gv));
5f05dabc 289 GvINTRO_on(gv);
290 }
79072805 291}
79072805 292
79072805 293AV *
864dbfa3 294Perl_save_ary(pTHX_ GV *gv)
79072805 295{
62cc1c5f 296 AV * const oav = GvAVn(gv);
67a38de0 297 AV *av;
fb73857a 298
67a38de0
NIS
299 if (!AvREAL(oav) && AvREIFY(oav))
300 av_reify(oav);
79072805
LW
301 SSCHECK(3);
302 SSPUSHPTR(gv);
67a38de0 303 SSPUSHPTR(oav);
79072805
LW
304 SSPUSHINT(SAVEt_AV);
305
0e2d6244 306 GvAV(gv) = NULL;
fb73857a 307 av = GvAVn(gv);
74435569
NC
308 if (SvMAGIC(oav))
309 mg_localize((SV*)oav, (SV*)av);
fb73857a 310 return av;
79072805
LW
311}
312
313HV *
864dbfa3 314Perl_save_hash(pTHX_ GV *gv)
79072805 315{
fb73857a 316 HV *ohv, *hv;
317
79072805
LW
318 SSCHECK(3);
319 SSPUSHPTR(gv);
fb73857a 320 SSPUSHPTR(ohv = GvHVn(gv));
79072805
LW
321 SSPUSHINT(SAVEt_HV);
322
0e2d6244 323 GvHV(gv) = NULL;
fb73857a 324 hv = GvHVn(gv);
74435569
NC
325 if (SvMAGIC(ohv))
326 mg_localize((SV*)ohv, (SV*)hv);
fb73857a 327 return hv;
79072805
LW
328}
329
330void
864dbfa3 331Perl_save_item(pTHX_ register SV *item)
79072805 332{
62cc1c5f 333 register SV * const sv = newSVsv(item);
79072805
LW
334
335 SSCHECK(3);
336 SSPUSHPTR(item); /* remember the pointer */
79072805
LW
337 SSPUSHPTR(sv); /* remember the value */
338 SSPUSHINT(SAVEt_ITEM);
339}
340
341void
864dbfa3 342Perl_save_int(pTHX_ int *intp)
79072805
LW
343{
344 SSCHECK(3);
345 SSPUSHINT(*intp);
346 SSPUSHPTR(intp);
347 SSPUSHINT(SAVEt_INT);
348}
349
350void
4f4e7967
JH
351Perl_save_bool(pTHX_ bool *boolp)
352{
353 SSCHECK(3);
354 SSPUSHBOOL(*boolp);
355 SSPUSHPTR(boolp);
356 SSPUSHINT(SAVEt_BOOL);
357}
358
359void
244f8405
NC
360Perl_save_I8(pTHX_ I8 *bytep)
361{
362 SSCHECK(3);
363 SSPUSHINT(*bytep);
364 SSPUSHPTR(bytep);
365 SSPUSHINT(SAVEt_I8);
366}
367
368void
864dbfa3 369Perl_save_I32(pTHX_ I32 *intp)
79072805
LW
370{
371 SSCHECK(3);
372 SSPUSHINT(*intp);
373 SSPUSHPTR(intp);
374 SSPUSHINT(SAVEt_I32);
375}
376
85e6fe83
LW
377/* Cannot use save_sptr() to store a char* since the SV** cast will
378 * force word-alignment and we'll miss the pointer.
379 */
380void
864dbfa3 381Perl_save_pptr(pTHX_ char **pptr)
85e6fe83
LW
382{
383 SSCHECK(3);
384 SSPUSHPTR(*pptr);
385 SSPUSHPTR(pptr);
386 SSPUSHINT(SAVEt_PPTR);
387}
388
79072805 389void
146174a9
CB
390Perl_save_vptr(pTHX_ void *ptr)
391{
146174a9
CB
392 SSCHECK(3);
393 SSPUSHPTR(*(char**)ptr);
394 SSPUSHPTR(ptr);
395 SSPUSHINT(SAVEt_VPTR);
396}
397
398void
864dbfa3 399Perl_save_sptr(pTHX_ SV **sptr)
79072805
LW
400{
401 SSCHECK(3);
402 SSPUSHPTR(*sptr);
403 SSPUSHPTR(sptr);
404 SSPUSHINT(SAVEt_SPTR);
405}
406
c3564e5c
GS
407void
408Perl_save_padsv(pTHX_ PADOFFSET off)
409{
c3564e5c 410 SSCHECK(4);
d7afa7f5 411 ASSERT_CURPAD_ACTIVE("save_padsv");
c3564e5c 412 SSPUSHPTR(PL_curpad[off]);
d7afa7f5 413 SSPUSHPTR(PL_comppad);
c3564e5c
GS
414 SSPUSHLONG((long)off);
415 SSPUSHINT(SAVEt_PADSV);
416}
417
54b9620d 418SV **
864dbfa3 419Perl_save_threadsv(pTHX_ PADOFFSET i)
54b9620d 420{
4d1ff10f 421#ifdef USE_5005THREADS
940cb80d 422 SV **svp = &THREADSV(i); /* XXX Change to save by offset */
146174a9
CB
423 DEBUG_S(PerlIO_printf(Perl_debug_log, "save_threadsv %"UVuf": %p %p:%s\n",
424 (UV)i, svp, *svp, SvPEEK(*svp)));
54b9620d
MB
425 save_svref(svp);
426 return svp;
427#else
cea2e8a9 428 Perl_croak(aTHX_ "panic: save_threadsv called in non-threaded perl");
4f1e9d25 429 PERL_UNUSED_ARG(i);
24c2fff4 430 NORETURN_FUNCTION_END;
4d1ff10f 431#endif /* USE_5005THREADS */
54b9620d
MB
432}
433
79072805 434void
864dbfa3 435Perl_save_hptr(pTHX_ HV **hptr)
79072805
LW
436{
437 SSCHECK(3);
85e6fe83 438 SSPUSHPTR(*hptr);
79072805
LW
439 SSPUSHPTR(hptr);
440 SSPUSHINT(SAVEt_HPTR);
441}
442
443void
864dbfa3 444Perl_save_aptr(pTHX_ AV **aptr)
79072805
LW
445{
446 SSCHECK(3);
85e6fe83 447 SSPUSHPTR(*aptr);
79072805
LW
448 SSPUSHPTR(aptr);
449 SSPUSHINT(SAVEt_APTR);
450}
451
452void
864dbfa3 453Perl_save_freesv(pTHX_ SV *sv)
8990e307
LW
454{
455 SSCHECK(2);
456 SSPUSHPTR(sv);
457 SSPUSHINT(SAVEt_FREESV);
458}
459
460void
26d9b02f
JH
461Perl_save_mortalizesv(pTHX_ SV *sv)
462{
463 SSCHECK(2);
464 SSPUSHPTR(sv);
465 SSPUSHINT(SAVEt_MORTALIZESV);
466}
467
468void
864dbfa3 469Perl_save_freeop(pTHX_ OP *o)
8990e307
LW
470{
471 SSCHECK(2);
11343788 472 SSPUSHPTR(o);
8990e307
LW
473 SSPUSHINT(SAVEt_FREEOP);
474}
475
476void
864dbfa3 477Perl_save_freepv(pTHX_ char *pv)
8990e307
LW
478{
479 SSCHECK(2);
480 SSPUSHPTR(pv);
481 SSPUSHINT(SAVEt_FREEPV);
482}
483
484void
864dbfa3 485Perl_save_clearsv(pTHX_ SV **svp)
8990e307 486{
d7afa7f5 487 ASSERT_CURPAD_ACTIVE("save_clearsv");
8990e307 488 SSCHECK(2);
3280af22 489 SSPUSHLONG((long)(svp-PL_curpad));
8990e307
LW
490 SSPUSHINT(SAVEt_CLEARSV);
491}
492
493void
864dbfa3 494Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen)
8990e307
LW
495{
496 SSCHECK(4);
497 SSPUSHINT(klen);
498 SSPUSHPTR(key);
be2d5e07 499 SSPUSHPTR(SvREFCNT_inc_simple(hv));
8990e307
LW
500 SSPUSHINT(SAVEt_DELETE);
501}
502
503void
244f8405
NC
504Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
505{
506 SSCHECK(3);
507 SSPUSHDPTR(f);
508 SSPUSHPTR(p);
509 SSPUSHINT(SAVEt_DESTRUCTOR);
510}
511
512void
146174a9
CB
513Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
514{
146174a9
CB
515 SSCHECK(3);
516 SSPUSHDXPTR(f);
517 SSPUSHPTR(p);
518 SSPUSHINT(SAVEt_DESTRUCTOR_X);
519}
520
521void
864dbfa3 522Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr)
4e4c362e 523{
bfc4de9f 524 SV *sv;
74435569 525 SvGETMAGIC(*sptr);
4e4c362e 526 SSCHECK(4);
be2d5e07 527 SSPUSHPTR(SvREFCNT_inc_simple(av));
4e4c362e
GS
528 SSPUSHINT(idx);
529 SSPUSHPTR(SvREFCNT_inc(*sptr));
530 SSPUSHINT(SAVEt_AELEM);
13057ebc
DM
531 /* if it gets reified later, the restore will have the wrong refcnt */
532 if (!AvREAL(av) && AvREIFY(av))
be2d5e07 533 SvREFCNT_inc_void(*sptr);
4e4c362e 534 save_scalar_at(sptr);
bfc4de9f
DM
535 sv = *sptr;
536 /* If we're localizing a tied array element, this new sv
537 * won't actually be stored in the array - so it won't get
538 * reaped when the localize ends. Ensure it gets reaped by
539 * mortifying it instead. DAPM */
540 if (SvTIED_mg(sv, PERL_MAGIC_tiedelem))
541 sv_2mortal(sv);
4e4c362e
GS
542}
543
544void
864dbfa3 545Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr)
4e4c362e 546{
bfc4de9f 547 SV *sv;
74435569 548 SvGETMAGIC(*sptr);
4e4c362e 549 SSCHECK(4);
be2d5e07
AL
550 SSPUSHPTR(SvREFCNT_inc_simple(hv));
551 SSPUSHPTR(SvREFCNT_inc_simple(key));
4e4c362e
GS
552 SSPUSHPTR(SvREFCNT_inc(*sptr));
553 SSPUSHINT(SAVEt_HELEM);
554 save_scalar_at(sptr);
bfc4de9f
DM
555 sv = *sptr;
556 /* If we're localizing a tied hash element, this new sv
557 * won't actually be stored in the hash - so it won't get
558 * reaped when the localize ends. Ensure it gets reaped by
559 * mortifying it instead. DAPM */
560 if (SvTIED_mg(sv, PERL_MAGIC_tiedelem))
561 sv_2mortal(sv);
4e4c362e
GS
562}
563
c01caf97
NC
564SV*
565Perl_save_svref(pTHX_ SV **sptr)
566{
567 SvGETMAGIC(*sptr);
568 SSCHECK(3);
569 SSPUSHPTR(sptr);
570 SSPUSHPTR(SvREFCNT_inc(*sptr));
571 SSPUSHINT(SAVEt_SVREF);
572 return save_scalar_at(sptr);
573}
574
4e4c362e 575void
864dbfa3 576Perl_save_op(pTHX)
462e5cf6 577{
462e5cf6 578 SSCHECK(2);
533c011a 579 SSPUSHPTR(PL_op);
462e5cf6
MB
580 SSPUSHINT(SAVEt_OP);
581}
582
455ece5e 583I32
864dbfa3 584Perl_save_alloc(pTHX_ I32 size, I32 pad)
455ece5e 585{
7120cae1 586 register const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
8aacddc1 587 - (char*)PL_savestack);
7120cae1 588 register const I32 elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
455ece5e 589
161d0ac1 590 SSGROW(elems + 2);
455ece5e
AD
591
592 PL_savestack_ix += elems;
593 SSPUSHINT(elems);
594 SSPUSHINT(SAVEt_ALLOC);
595 return start;
596}
597
462e5cf6 598void
864dbfa3 599Perl_leave_scope(pTHX_ I32 base)
79072805
LW
600{
601 register SV *sv;
602 register SV *value;
603 register GV *gv;
604 register AV *av;
605 register HV *hv;
606 register void* ptr;
f4dd75d9 607 register char* str;
161b7d16 608 I32 i;
79072805
LW
609
610 if (base < -1)
cea2e8a9 611 Perl_croak(aTHX_ "panic: corrupt saved stack index");
3280af22 612 while (PL_savestack_ix > base) {
f0e060fc
NC
613 const int type = SSPOPINT;
614 switch (type) {
79072805
LW
615 case SAVEt_ITEM: /* normal string */
616 value = (SV*)SSPOPPTR;
617 sv = (SV*)SSPOPPTR;
618 sv_replace(sv,value);
3280af22 619 PL_localizing = 2;
79072805 620 SvSETMAGIC(sv);
3280af22 621 PL_localizing = 0;
79072805 622 break;
8aacddc1 623 case SAVEt_SV: /* scalar reference */
79072805
LW
624 value = (SV*)SSPOPPTR;
625 gv = (GV*)SSPOPPTR;
7a4c00b4 626 ptr = &GvSV(gv);
13057ebc 627 av = (AV*)gv; /* what to refcnt_dec */
7a4c00b4 628 restore_sv:
79072805 629 sv = *(SV**)ptr;
146174a9 630 DEBUG_S(PerlIO_printf(Perl_debug_log,
54b9620d 631 "restore svref: %p %p:%s -> %p:%s\n",
8aacddc1 632 ptr, sv, SvPEEK(sv), value, SvPEEK(value)));
a0d0e21e 633 *(SV**)ptr = value;
65b7047c 634 SvREFCNT_dec(sv);
3280af22 635 PL_localizing = 2;
a0d0e21e 636 SvSETMAGIC(value);
3280af22 637 PL_localizing = 0;
4e4c362e 638 SvREFCNT_dec(value);
13057ebc
DM
639 if (av) /* actually an av, hv or gv */
640 SvREFCNT_dec(av);
8aacddc1 641 break;
c01caf97
NC
642 case SAVEt_GENERIC_PVREF: /* generic pv */
643 str = (char*)SSPOPPTR;
644 ptr = SSPOPPTR;
645 if (*(char**)ptr != str) {
646 Safefree(*(char**)ptr);
647 *(char**)ptr = str;
648 }
649 break;
650 case SAVEt_SHARED_PVREF: /* shared pv */
651 str = (char*)SSPOPPTR;
652 ptr = SSPOPPTR;
653 if (*(char**)ptr != str) {
654#ifdef NETWARE
655 PerlMem_free(*(char**)ptr);
656#else
657 PerlMemShared_free(*(char**)ptr);
658#endif
659 *(char**)ptr = str;
660 }
661 break;
662 case SAVEt_GENERIC_SVREF: /* generic sv */
663 value = (SV*)SSPOPPTR;
664 ptr = SSPOPPTR;
665 sv = *(SV**)ptr;
666 *(SV**)ptr = value;
667 SvREFCNT_dec(sv);
668 SvREFCNT_dec(value);
669 break;
8aacddc1 670 case SAVEt_AV: /* array reference */
79072805
LW
671 av = (AV*)SSPOPPTR;
672 gv = (GV*)SSPOPPTR;
fb73857a 673 if (GvAV(gv)) {
7120cae1 674 AV * const goner = GvAV(gv);
a8dc4fe8 675 SvMAGIC_set(av, SvMAGIC(goner));
32da55ab 676 SvFLAGS((SV*)av) |= SvMAGICAL(goner);
fb73857a 677 SvMAGICAL_off(goner);
a8dc4fe8 678 SvMAGIC_set(goner, NULL);
fb73857a 679 SvREFCNT_dec(goner);
680 }
8aacddc1 681 GvAV(gv) = av;
fb73857a 682 if (SvMAGICAL(av)) {
3280af22 683 PL_localizing = 2;
fb73857a 684 SvSETMAGIC((SV*)av);
3280af22 685 PL_localizing = 0;
fb73857a 686 }
8aacddc1
NIS
687 break;
688 case SAVEt_HV: /* hash reference */
79072805
LW
689 hv = (HV*)SSPOPPTR;
690 gv = (GV*)SSPOPPTR;
fb73857a 691 if (GvHV(gv)) {
7120cae1 692 HV * const goner = GvHV(gv);
a8dc4fe8 693 SvMAGIC_set(hv, SvMAGIC(goner));
fb73857a 694 SvFLAGS(hv) |= SvMAGICAL(goner);
695 SvMAGICAL_off(goner);
a8dc4fe8 696 SvMAGIC_set(goner, NULL);
fb73857a 697 SvREFCNT_dec(goner);
698 }
8aacddc1 699 GvHV(gv) = hv;
fb73857a 700 if (SvMAGICAL(hv)) {
3280af22 701 PL_localizing = 2;
fb73857a 702 SvSETMAGIC((SV*)hv);
3280af22 703 PL_localizing = 0;
fb73857a 704 }
8aacddc1 705 break;
79072805
LW
706 case SAVEt_INT: /* int reference */
707 ptr = SSPOPPTR;
708 *(int*)ptr = (int)SSPOPINT;
709 break;
4f4e7967
JH
710 case SAVEt_BOOL: /* bool reference */
711 ptr = SSPOPPTR;
712 *(bool*)ptr = (bool)SSPOPBOOL;
713 break;
79072805
LW
714 case SAVEt_I32: /* I32 reference */
715 ptr = SSPOPPTR;
716 *(I32*)ptr = (I32)SSPOPINT;
717 break;
718 case SAVEt_SPTR: /* SV* reference */
719 ptr = SSPOPPTR;
720 *(SV**)ptr = (SV*)SSPOPPTR;
721 break;
146174a9 722 case SAVEt_VPTR: /* random* reference */
85e6fe83
LW
723 case SAVEt_PPTR: /* char* reference */
724 ptr = SSPOPPTR;
725 *(char**)ptr = (char*)SSPOPPTR;
726 break;
79072805
LW
727 case SAVEt_HPTR: /* HV* reference */
728 ptr = SSPOPPTR;
729 *(HV**)ptr = (HV*)SSPOPPTR;
730 break;
731 case SAVEt_APTR: /* AV* reference */
732 ptr = SSPOPPTR;
733 *(AV**)ptr = (AV*)SSPOPPTR;
734 break;
f0e060fc
NC
735 case SAVEt_GP_OLD: /* scalar reference */
736 case SAVEt_GP_NEW: /* scalar reference */
79072805
LW
737 ptr = SSPOPPTR;
738 gv = (GV*)SSPOPPTR;
fdac8c4b 739 if (SvPVX_const(gv) && SvLEN(gv) > 0) {
a02c78fd 740 Safefree(SvPVX_mutable(gv));
8aacddc1 741 }
f0e060fc
NC
742 if (type == SAVEt_GP_NEW) {
743 SvPV_set(gv, NULL);
744 SvCUR_set(gv, 0);
745 SvLEN_set(gv, 0);
746 SvPOK_off(gv);
747 } else {
748 SvPV_set(gv, (char *)SSPOPPTR);
749 SvCUR_set(gv, (STRLEN)SSPOPIV);
750 SvLEN_set(gv, (STRLEN)SSPOPIV);
751 }
8aacddc1
NIS
752 gp_free(gv);
753 GvGP(gv) = (GP*)ptr;
fae75791 754 if (GvCVu(gv))
3280af22 755 PL_sub_generation++; /* putting a method back into circulation */
4633a7c4 756 SvREFCNT_dec(gv);
8aacddc1 757 break;
8990e307
LW
758 case SAVEt_FREESV:
759 ptr = SSPOPPTR;
760 SvREFCNT_dec((SV*)ptr);
761 break;
26d9b02f
JH
762 case SAVEt_MORTALIZESV:
763 ptr = SSPOPPTR;
764 sv_2mortal((SV*)ptr);
765 break;
8990e307
LW
766 case SAVEt_FREEOP:
767 ptr = SSPOPPTR;
d7afa7f5 768 ASSERT_CURPAD_LEGAL("SAVEt_FREEOP"); /* XXX DAPM tmp */
8990e307
LW
769 op_free((OP*)ptr);
770 break;
771 case SAVEt_FREEPV:
772 ptr = SSPOPPTR;
228fe6e6 773 Safefree(ptr);
8990e307
LW
774 break;
775 case SAVEt_CLEARSV:
3280af22 776 ptr = (void*)&PL_curpad[SSPOPLONG];
8990e307 777 sv = *(SV**)ptr;
9755d405
JH
778
779 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
d7afa7f5
JH
780 "Pad 0x%"UVxf"[0x%"UVxf"] clearsv: %ld sv=0x%"UVxf"<%"IVdf"> %s\n",
781 PTR2UV(PL_comppad), PTR2UV(PL_curpad),
782 (long)((SV **)ptr-PL_curpad), PTR2UV(sv), (IV)SvREFCNT(sv),
9755d405
JH
783 (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) ? "clear" : "abandon"
784 ));
785
bc44cdaf
GS
786 /* Can clear pad variable in place? */
787 if (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) {
8aacddc1
NIS
788 /*
789 * if a my variable that was made readonly is going out of
790 * scope, we want to remove the readonlyness so that it can
791 * go out of scope quietly
8aacddc1 792 */
a26e96df 793 if (SvPADMY(sv) && !SvFAKE(sv))
8aacddc1
NIS
794 SvREADONLY_off(sv);
795
6fc92669 796 if (SvTHINKFIRST(sv))
840a7b70 797 sv_force_normal_flags(sv, SV_IMMEDIATE_UNREF);
a0d0e21e
LW
798 if (SvMAGICAL(sv))
799 mg_free(sv);
8990e307
LW
800
801 switch (SvTYPE(sv)) {
802 case SVt_NULL:
803 break;
804 case SVt_PVAV:
44a8e56a 805 av_clear((AV*)sv);
f194bc06
NC
806 /* Need to detach $#array from @array that has just gone
807 out of scope. Otherwise the first $#array controls the
808 size of the array "newly" created the next time this
809 scope is entered.
810 */
811 if (AvARYLEN(sv)) {
812 MAGIC *mg = mg_find (AvARYLEN(sv), PERL_MAGIC_arylen);
813
814 if (mg) {
815 mg->mg_obj = 0;
816 }
817
818 SvREFCNT_dec(AvARYLEN(sv));
819 AvARYLEN(sv) = 0;
820 }
8990e307
LW
821 break;
822 case SVt_PVHV:
44a8e56a 823 hv_clear((HV*)sv);
8990e307
LW
824 break;
825 case SVt_PVCV:
cea2e8a9 826 Perl_croak(aTHX_ "panic: leave_scope pad code");
8990e307 827 default:
7460c263 828 SvOK_off(sv);
8990e307
LW
829 break;
830 }
831 }
832 else { /* Someone has a claim on this, so abandon it. */
7120cae1
AL
833 const U32 padflags
834 = SvFLAGS(sv) & (SVs_PADBUSY|SVs_PADMY|SVs_PADTMP);
8990e307
LW
835 switch (SvTYPE(sv)) { /* Console ourselves with a new value */
836 case SVt_PVAV: *(SV**)ptr = (SV*)newAV(); break;
837 case SVt_PVHV: *(SV**)ptr = (SV*)newHV(); break;
133cdda0 838 default: *(SV**)ptr = newSV(0); break;
8990e307 839 }
53868620 840 SvREFCNT_dec(sv); /* Cast current value to the winds. */
4aa0a1f7 841 SvFLAGS(*(SV**)ptr) |= padflags; /* preserve pad nature */
8990e307
LW
842 }
843 break;
844 case SAVEt_DELETE:
845 ptr = SSPOPPTR;
846 hv = (HV*)ptr;
847 ptr = SSPOPPTR;
5100483f 848 (void)hv_delete(hv, (char*)ptr, (I32)SSPOPINT, G_DISCARD);
4e4c362e 849 SvREFCNT_dec(hv);
8aacddc1 850 Safefree(ptr);
8990e307 851 break;
146174a9
CB
852 case SAVEt_DESTRUCTOR_X:
853 ptr = SSPOPPTR;
acfe0abc 854 (*SSPOPDXPTR)(aTHX_ ptr);
a0d0e21e
LW
855 break;
856 case SAVEt_REGCONTEXT:
455ece5e 857 case SAVEt_ALLOC:
161b7d16 858 i = SSPOPINT;
3280af22 859 PL_savestack_ix -= i; /* regexp must have croaked */
a0d0e21e 860 break;
55497cff 861 case SAVEt_STACK_POS: /* Position on Perl stack */
161b7d16 862 i = SSPOPINT;
3280af22 863 PL_stack_sp = PL_stack_base + i;
55497cff 864 break;
bf9e0bfe
NC
865 case SAVEt_STACK_CXPOS: /* blk_oldsp on context stack */
866 i = SSPOPINT;
867 cxstack[i].blk_oldsp = SSPOPINT;
868 break;
161b7d16
SM
869 case SAVEt_AELEM: /* array element */
870 value = (SV*)SSPOPPTR;
871 i = SSPOPINT;
872 av = (AV*)SSPOPPTR;
9039bfa6 873 ptr = av_fetch(av,i,1);
13057ebc
DM
874 if (!AvREAL(av) && AvREIFY(av)) /* undo reify guard */
875 SvREFCNT_dec(value);
4e4c362e
GS
876 if (ptr) {
877 sv = *(SV**)ptr;
3280af22 878 if (sv && sv != &PL_sv_undef) {
14befaf4 879 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied))
be2d5e07 880 SvREFCNT_inc_void_NN(sv);
4e4c362e
GS
881 goto restore_sv;
882 }
883 }
884 SvREFCNT_dec(av);
885 SvREFCNT_dec(value);
886 break;
161b7d16
SM
887 case SAVEt_HELEM: /* hash element */
888 value = (SV*)SSPOPPTR;
9002cb76 889 sv = (SV*)SSPOPPTR;
161b7d16
SM
890 hv = (HV*)SSPOPPTR;
891 ptr = hv_fetch_ent(hv, sv, 1, 0);
4e4c362e 892 if (ptr) {
7120cae1 893 const SV * const oval = HeVAL((HE*)ptr);
3280af22 894 if (oval && oval != &PL_sv_undef) {
4e4c362e 895 ptr = &HeVAL((HE*)ptr);
14befaf4 896 if (SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
be2d5e07 897 SvREFCNT_inc_void(*(SV**)ptr);
4e4c362e 898 SvREFCNT_dec(sv);
13057ebc 899 av = (AV*)hv; /* what to refcnt_dec */
4e4c362e
GS
900 goto restore_sv;
901 }
902 }
903 SvREFCNT_dec(hv);
904 SvREFCNT_dec(sv);
905 SvREFCNT_dec(value);
906 break;
462e5cf6 907 case SAVEt_OP:
533c011a 908 PL_op = (OP*)SSPOPPTR;
462e5cf6 909 break;
25eaa213 910 case SAVEt_HINTS:
045ac317
RGS
911 if ((PL_hints & HINT_LOCALIZE_HH) && GvHV(PL_hintgv)) {
912 SvREFCNT_dec((SV*)GvHV(PL_hintgv));
913 GvHV(PL_hintgv) = NULL;
914 }
3280af22 915 *(I32*)&PL_hints = (I32)SSPOPINT;
1f26b251
NC
916 if (PL_hints & HINT_LOCALIZE_HH) {
917 SvREFCNT_dec((SV*)GvHV(PL_hintgv));
918 GvHV(PL_hintgv) = (HV*)SSPOPPTR;
919 }
920
b3ac6de7 921 break;
cb50131a 922 case SAVEt_COMPPAD:
d7afa7f5 923 PL_comppad = (PAD*)SSPOPPTR;
c2ef0052 924 if (PL_comppad)
cb50131a
CB
925 PL_curpad = AvARRAY(PL_comppad);
926 else
0e2d6244 927 PL_curpad = NULL;
cb50131a 928 break;
c3564e5c
GS
929 case SAVEt_PADSV:
930 {
7120cae1 931 const PADOFFSET off = (PADOFFSET)SSPOPLONG;
c3564e5c
GS
932 ptr = SSPOPPTR;
933 if (ptr)
d7afa7f5 934 AvARRAY((PAD*)ptr)[off] = (SV*)SSPOPPTR;
c3564e5c
GS
935 }
936 break;
240fcc4a
JC
937 case SAVEt_SAVESWITCHSTACK:
938 {
939 dSP;
6d29369a
AL
940 AV* const t = (AV*)SSPOPPTR;
941 AV* const f = (AV*)SSPOPPTR;
240fcc4a
JC
942 SWITCHSTACK(t,f);
943 PL_curstackinfo->si_stack = f;
944 }
945 break;
c01caf97
NC
946 /* These are only saved in mathoms.c */
947 case SAVEt_SVREF: /* scalar reference */
948 value = (SV*)SSPOPPTR;
949 ptr = SSPOPPTR;
950 av = NULL; /* what to refcnt_dec */
951 goto restore_sv;
952 case SAVEt_LONG: /* long reference */
953 ptr = SSPOPPTR;
954 *(long*)ptr = (long)SSPOPLONG;
955 break;
956 case SAVEt_I16: /* I16 reference */
957 ptr = SSPOPPTR;
958 *(I16*)ptr = (I16)SSPOPINT;
959 break;
960 case SAVEt_I8: /* I8 reference */
961 ptr = SSPOPPTR;
962 *(I8*)ptr = (I8)SSPOPINT;
963 break;
964 case SAVEt_IV: /* IV reference */
965 ptr = SSPOPPTR;
966 *(IV*)ptr = (IV)SSPOPIV;
967 break;
968 case SAVEt_NSTAB:
969 gv = (GV*)SSPOPPTR;
970 (void)sv_clear((SV*)gv);
971 break;
972 case SAVEt_DESTRUCTOR:
973 ptr = SSPOPPTR;
974 (*SSPOPDPTR)(ptr);
975 break;
2cb86c03
NC
976 case SAVEt_COP_ARYBASE:
977 ptr = SSPOPPTR;
978 i = SSPOPINT;
979 CopARYBASE_set((COP *)ptr, i);
980 break;
4c49a5e0
NC
981 case SAVEt_RE_STATE:
982 {
983 const struct re_save_state *const state
984 = (struct re_save_state *)
985 (PL_savestack + PL_savestack_ix
986 - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
987 PL_savestack_ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
988
989 PL_reg_flags = state->re_state_reg_flags;
990 PL_bostr = state->re_state_bostr;
991 PL_reginput = state->re_state_reginput;
992 PL_regbol = state->re_state_regbol;
993 PL_regeol = state->re_state_regeol;
994 PL_regstartp = state->re_state_regstartp;
995 PL_regendp = state->re_state_regendp;
996 PL_reglastparen = state->re_state_reglastparen;
997 PL_reglastcloseparen = state->re_state_reglastcloseparen;
998 PL_regtill = state->re_state_regtill;
999 if (PL_reg_start_tmp != state->re_state_reg_start_tmp) {
1000 Safefree(PL_reg_start_tmp);
1001 PL_reg_start_tmp = state->re_state_reg_start_tmp;
1002 }
1003 PL_reg_start_tmpl = state->re_state_reg_start_tmpl;
1004 PL_reg_eval_set = state->re_state_reg_eval_set;
1005 PL_regnarrate = state->re_state_regnarrate;
1006 PL_regindent = state->re_state_regindent;
1007 PL_reg_call_cc = state->re_state_reg_call_cc;
1008 PL_reg_re = state->re_state_reg_re;
1009 PL_reg_ganch = state->re_state_reg_ganch;
1010 PL_reg_sv = state->re_state_reg_sv;
1011 PL_reg_match_utf8 = state->re_state_reg_match_utf8;
1012 PL_reg_magic = state->re_state_reg_magic;
1013 PL_reg_oldpos = state->re_state_reg_oldpos;
1014 PL_reg_oldcurpm = state->re_state_reg_oldcurpm;
1015 PL_reg_curpm = state->re_state_reg_curpm;
1016 PL_reg_oldsaved = state->re_state_reg_oldsaved;
1017 PL_reg_oldsavedlen = state->re_state_reg_oldsavedlen;
1018 PL_reg_maxiter = state->re_state_reg_maxiter;
1019 PL_reg_leftiter = state->re_state_reg_leftiter;
1020 if (PL_reg_poscache != state->re_state_reg_poscache) {
1021 Safefree(PL_reg_poscache);
1022 PL_reg_poscache = state->re_state_reg_poscache;
1023 }
1024 PL_reg_poscache_size = state->re_state_reg_poscache_size;
1025 PL_regsize = state->re_state_regsize;
1026 PL_reg_starttry = state->re_state_reg_starttry;
1027
1028 /* These variables have been eliminated from 5.10: */
1029 PL_regdata = state->re_state_regdata;
1030 PL_regprogram = state->re_state_regprogram;
1031 PL_regcc = state->re_state_regcc;
1032 PL_regprecomp = state->re_state_regprecomp;
1033 PL_regnpar = state->re_state_regnpar;
1034 }
1035 break;
79072805 1036 default:
cea2e8a9 1037 Perl_croak(aTHX_ "panic: leave_scope inconsistency");
79072805
LW
1038 }
1039 }
1040}
8990e307 1041
8990e307 1042void
864dbfa3 1043Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
8990e307 1044{
35ff7856 1045#ifdef DEBUGGING
22c35a8c 1046 PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), PL_block_type[CxTYPE(cx)]);
6b35e009 1047 if (CxTYPE(cx) != CXt_SUBST) {
760ac839 1048 PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
146174a9
CB
1049 PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%"UVxf"\n",
1050 PTR2UV(cx->blk_oldcop));
760ac839
LW
1051 PerlIO_printf(Perl_debug_log, "BLK_OLDMARKSP = %ld\n", (long)cx->blk_oldmarksp);
1052 PerlIO_printf(Perl_debug_log, "BLK_OLDSCOPESP = %ld\n", (long)cx->blk_oldscopesp);
1053 PerlIO_printf(Perl_debug_log, "BLK_OLDRETSP = %ld\n", (long)cx->blk_oldretsp);
146174a9
CB
1054 PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%"UVxf"\n",
1055 PTR2UV(cx->blk_oldpm));
760ac839 1056 PerlIO_printf(Perl_debug_log, "BLK_GIMME = %s\n", cx->blk_gimme ? "LIST" : "SCALAR");
8990e307 1057 }
6b35e009 1058 switch (CxTYPE(cx)) {
8990e307
LW
1059 case CXt_NULL:
1060 case CXt_BLOCK:
1061 break;
146174a9
CB
1062 case CXt_FORMAT:
1063 PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
1064 PTR2UV(cx->blk_sub.cv));
1065 PerlIO_printf(Perl_debug_log, "BLK_SUB.GV = 0x%"UVxf"\n",
1066 PTR2UV(cx->blk_sub.gv));
1067 PerlIO_printf(Perl_debug_log, "BLK_SUB.DFOUTGV = 0x%"UVxf"\n",
1068 PTR2UV(cx->blk_sub.dfoutgv));
1069 PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
1070 (int)cx->blk_sub.hasargs);
1071 break;
8990e307 1072 case CXt_SUB:
146174a9
CB
1073 PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
1074 PTR2UV(cx->blk_sub.cv));
760ac839 1075 PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
8990e307 1076 (long)cx->blk_sub.olddepth);
760ac839 1077 PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
8990e307 1078 (int)cx->blk_sub.hasargs);
146174a9
CB
1079 PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n",
1080 (int)cx->blk_sub.lval);
8990e307
LW
1081 break;
1082 case CXt_EVAL:
760ac839 1083 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
8990e307 1084 (long)cx->blk_eval.old_in_eval);
760ac839 1085 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
22c35a8c
GS
1086 PL_op_name[cx->blk_eval.old_op_type],
1087 PL_op_desc[cx->blk_eval.old_op_type]);
0f79a09d
GS
1088 if (cx->blk_eval.old_namesv)
1089 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
fdac8c4b 1090 SvPVX_const(cx->blk_eval.old_namesv));
146174a9
CB
1091 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%"UVxf"\n",
1092 PTR2UV(cx->blk_eval.old_eval_root));
8990e307
LW
1093 break;
1094
1095 case CXt_LOOP:
760ac839 1096 PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n",
8990e307 1097 cx->blk_loop.label);
760ac839 1098 PerlIO_printf(Perl_debug_log, "BLK_LOOP.RESETSP = %ld\n",
8990e307 1099 (long)cx->blk_loop.resetsp);
146174a9
CB
1100 PerlIO_printf(Perl_debug_log, "BLK_LOOP.REDO_OP = 0x%"UVxf"\n",
1101 PTR2UV(cx->blk_loop.redo_op));
1102 PerlIO_printf(Perl_debug_log, "BLK_LOOP.NEXT_OP = 0x%"UVxf"\n",
1103 PTR2UV(cx->blk_loop.next_op));
1104 PerlIO_printf(Perl_debug_log, "BLK_LOOP.LAST_OP = 0x%"UVxf"\n",
1105 PTR2UV(cx->blk_loop.last_op));
760ac839 1106 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
8990e307 1107 (long)cx->blk_loop.iterix);
146174a9
CB
1108 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%"UVxf"\n",
1109 PTR2UV(cx->blk_loop.iterary));
1110 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%"UVxf"\n",
1111 PTR2UV(CxITERVAR(cx)));
1112 if (CxITERVAR(cx))
1113 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERSAVE = 0x%"UVxf"\n",
1114 PTR2UV(cx->blk_loop.itersave));
1115 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERLVAL = 0x%"UVxf"\n",
1116 PTR2UV(cx->blk_loop.iterlval));
8990e307
LW
1117 break;
1118
1119 case CXt_SUBST:
760ac839 1120 PerlIO_printf(Perl_debug_log, "SB_ITERS = %ld\n",
8990e307 1121 (long)cx->sb_iters);
760ac839 1122 PerlIO_printf(Perl_debug_log, "SB_MAXITERS = %ld\n",
8990e307 1123 (long)cx->sb_maxiters);
35ef4773
GS
1124 PerlIO_printf(Perl_debug_log, "SB_RFLAGS = %ld\n",
1125 (long)cx->sb_rflags);
760ac839 1126 PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
8990e307 1127 (long)cx->sb_once);
760ac839 1128 PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
8990e307 1129 cx->sb_orig);
146174a9
CB
1130 PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%"UVxf"\n",
1131 PTR2UV(cx->sb_dstr));
1132 PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%"UVxf"\n",
1133 PTR2UV(cx->sb_targ));
1134 PerlIO_printf(Perl_debug_log, "SB_S = 0x%"UVxf"\n",
1135 PTR2UV(cx->sb_s));
1136 PerlIO_printf(Perl_debug_log, "SB_M = 0x%"UVxf"\n",
1137 PTR2UV(cx->sb_m));
1138 PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%"UVxf"\n",
1139 PTR2UV(cx->sb_strend));
1140 PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%"UVxf"\n",
1141 PTR2UV(cx->sb_rxres));
8990e307
LW
1142 break;
1143 }
5d1954da 1144#else
1e7ed80e 1145 PERL_UNUSED_CONTEXT;
5d1954da 1146 PERL_UNUSED_ARG(cx);
17c3b450 1147#endif /* DEBUGGING */
35ff7856 1148}
583439ab
NC
1149
1150/*
1151 * Local variables:
1152 * c-indentation-style: bsd
1153 * c-basic-offset: 4
1154 * indent-tabs-mode: t
1155 * End:
1156 *
d8294a4d
NC
1157 * ex: set ts=8 sts=4 sw=4 noet:
1158 */