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