Changes to allow compiler with gcc-2.8.1 in C++ mode,
[p5sagit/p5-mst-13.2.git] / scope.c
CommitLineData
a0d0e21e 1/* scope.c
79072805 2 *
9607fc9c 3 * Copyright (c) 1991-1997, Larry Wall
79072805 4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
a0d0e21e 8 */
9
10/*
11 * "For the fashion of Minas Tirith was such that it was built on seven
12 * levels..."
79072805 13 */
14
15#include "EXTERN.h"
16#include "perl.h"
17
a0d0e21e 18SV**
8ac85365 19stack_grow(SV **sp, SV **p, int n)
a0d0e21e 20{
11343788 21 dTHR;
a60c0954 22#if defined(DEBUGGING) && !defined(USE_THREADS)
23 static int growing = 0;
24 if (growing++)
25 abort();
26#endif
a0d0e21e 27 stack_sp = sp;
2ce36478 28#ifndef STRESS_REALLOC
1f96a9ed 29 av_extend(curstack, (p - stack_base) + (n) + 128);
2ce36478 30#else
31 av_extend(curstack, (p - stack_base) + (n) + 1);
32#endif
a60c0954 33#if defined(DEBUGGING) && !defined(USE_THREADS)
34 growing--;
35#endif
a0d0e21e 36 return stack_sp;
37}
38
2ce36478 39#ifndef STRESS_REALLOC
40#define GROW(old) ((old) * 3 / 2)
41#else
42#define GROW(old) ((old) + 1)
43#endif
44
e336de0d 45PERL_SI *
46new_stackinfo(I32 stitems, I32 cxitems)
47{
48 PERL_SI *si;
49 PERL_CONTEXT *cxt;
50 New(56, si, 1, PERL_SI);
51 si->si_stack = newAV();
52 AvREAL_off(si->si_stack);
53 av_extend(si->si_stack, stitems > 0 ? stitems-1 : 0);
54 AvALLOC(si->si_stack)[0] = &sv_undef;
55 AvFILLp(si->si_stack) = 0;
56 si->si_prev = 0;
57 si->si_next = 0;
58 si->si_cxmax = cxitems - 1;
59 si->si_cxix = -1;
60 si->si_type = SI_UNDEF;
61 New(56, si->si_cxstack, cxitems, PERL_CONTEXT);
62 return si;
63}
64
79072805 65I32
8ac85365 66cxinc(void)
79072805 67{
11343788 68 dTHR;
2ce36478 69 cxstack_max = GROW(cxstack_max);
c09156bb 70 Renew(cxstack, cxstack_max + 1, PERL_CONTEXT); /* XXX should fix CXINC macro */
79072805 71 return cxstack_ix + 1;
72}
73
74void
8ac85365 75push_return(OP *retop)
79072805 76{
11343788 77 dTHR;
79072805 78 if (retstack_ix == retstack_max) {
2ce36478 79 retstack_max = GROW(retstack_max);
79072805 80 Renew(retstack, retstack_max, OP*);
81 }
82 retstack[retstack_ix++] = retop;
83}
84
85OP *
8ac85365 86pop_return(void)
79072805 87{
11343788 88 dTHR;
79072805 89 if (retstack_ix > 0)
90 return retstack[--retstack_ix];
91 else
92 return Nullop;
93}
94
95void
8ac85365 96push_scope(void)
79072805 97{
11343788 98 dTHR;
79072805 99 if (scopestack_ix == scopestack_max) {
2ce36478 100 scopestack_max = GROW(scopestack_max);
79072805 101 Renew(scopestack, scopestack_max, I32);
102 }
103 scopestack[scopestack_ix++] = savestack_ix;
104
105}
106
107void
8ac85365 108pop_scope(void)
79072805 109{
11343788 110 dTHR;
79072805 111 I32 oldsave = scopestack[--scopestack_ix];
8990e307 112 LEAVE_SCOPE(oldsave);
79072805 113}
114
115void
8ac85365 116markstack_grow(void)
a0d0e21e 117{
11343788 118 dTHR;
a0d0e21e 119 I32 oldmax = markstack_max - markstack;
2ce36478 120 I32 newmax = GROW(oldmax);
a0d0e21e 121
122 Renew(markstack, newmax, I32);
123 markstack_ptr = markstack + oldmax;
124 markstack_max = markstack + newmax;
125}
126
127void
8ac85365 128savestack_grow(void)
79072805 129{
11343788 130 dTHR;
2ce36478 131 savestack_max = GROW(savestack_max) + 4;
79072805 132 Renew(savestack, savestack_max, ANY);
133}
134
2ce36478 135#undef GROW
136
79072805 137void
8ac85365 138free_tmps(void)
79072805 139{
11343788 140 dTHR;
79072805 141 /* XXX should tmps_floor live in cxstack? */
142 I32 myfloor = tmps_floor;
143 while (tmps_ix > myfloor) { /* clean up after last statement */
144 SV* sv = tmps_stack[tmps_ix];
145 tmps_stack[tmps_ix--] = Nullsv;
463ee0b2 146 if (sv) {
147#ifdef DEBUGGING
148 SvTEMP_off(sv);
149#endif
8990e307 150 SvREFCNT_dec(sv); /* note, can modify tmps_ix!!! */
463ee0b2 151 }
79072805 152 }
153}
154
7a4c00b4 155static SV *
8ac85365 156save_scalar_at(SV **sptr)
79072805 157{
11343788 158 dTHR;
79072805 159 register SV *sv;
7a4c00b4 160 SV *osv = *sptr;
79072805 161
7a4c00b4 162 sv = *sptr = NEWSV(0,0);
a0d0e21e 163 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) {
79072805 164 sv_upgrade(sv, SvTYPE(osv));
a0d0e21e 165 if (SvGMAGICAL(osv)) {
748a9306 166 MAGIC* mg;
167 bool oldtainted = tainted;
a0d0e21e 168 mg_get(osv);
748a9306 169 if (tainting && tainted && (mg = mg_find(osv, 't'))) {
170 SAVESPTR(mg->mg_obj);
171 mg->mg_obj = osv;
172 }
a0d0e21e 173 SvFLAGS(osv) |= (SvFLAGS(osv) &
174 (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
748a9306 175 tainted = oldtainted;
a0d0e21e 176 }
79072805 177 SvMAGIC(sv) = SvMAGIC(osv);
a0d0e21e 178 SvFLAGS(sv) |= SvMAGICAL(osv);
748a9306 179 localizing = 1;
79072805 180 SvSETMAGIC(sv);
748a9306 181 localizing = 0;
79072805 182 }
183 return sv;
184}
185
7a4c00b4 186SV *
8ac85365 187save_scalar(GV *gv)
7a4c00b4 188{
11343788 189 dTHR;
4e4c362e 190 SV **sptr = &GvSV(gv);
7a4c00b4 191 SSCHECK(3);
4e4c362e 192 SSPUSHPTR(SvREFCNT_inc(gv));
193 SSPUSHPTR(SvREFCNT_inc(*sptr));
7a4c00b4 194 SSPUSHINT(SAVEt_SV);
4e4c362e 195 return save_scalar_at(sptr);
7a4c00b4 196}
197
198SV*
8ac85365 199save_svref(SV **sptr)
7a4c00b4 200{
11343788 201 dTHR;
7a4c00b4 202 SSCHECK(3);
203 SSPUSHPTR(sptr);
4e4c362e 204 SSPUSHPTR(SvREFCNT_inc(*sptr));
7a4c00b4 205 SSPUSHINT(SAVEt_SVREF);
206 return save_scalar_at(sptr);
207}
208
79072805 209void
8ac85365 210save_gp(GV *gv, I32 empty)
79072805 211{
e858de61 212 dTHR;
fb73857a 213 SSCHECK(6);
214 SSPUSHIV((IV)SvLEN(gv));
215 SvLEN(gv) = 0; /* forget that anything was allocated here */
216 SSPUSHIV((IV)SvCUR(gv));
217 SSPUSHPTR(SvPVX(gv));
218 SvPOK_off(gv);
4633a7c4 219 SSPUSHPTR(SvREFCNT_inc(gv));
5f05dabc 220 SSPUSHPTR(GvGP(gv));
79072805 221 SSPUSHINT(SAVEt_GP);
222
5f05dabc 223 if (empty) {
224 register GP *gp;
225 Newz(602, gp, 1, GP);
44a8e56a 226 GvGP(gv) = gp_ref(gp);
5f05dabc 227 GvSV(gv) = NEWSV(72,0);
228 GvLINE(gv) = curcop->cop_line;
229 GvEGV(gv) = gv;
230 }
231 else {
44a8e56a 232 gp_ref(GvGP(gv));
5f05dabc 233 GvINTRO_on(gv);
234 }
79072805 235}
79072805 236
79072805 237AV *
8ac85365 238save_ary(GV *gv)
79072805 239{
11343788 240 dTHR;
67a38de0 241 AV *oav = GvAVn(gv);
242 AV *av;
fb73857a 243
67a38de0 244 if (!AvREAL(oav) && AvREIFY(oav))
245 av_reify(oav);
79072805 246 SSCHECK(3);
247 SSPUSHPTR(gv);
67a38de0 248 SSPUSHPTR(oav);
79072805 249 SSPUSHINT(SAVEt_AV);
250
251 GvAV(gv) = Null(AV*);
fb73857a 252 av = GvAVn(gv);
253 if (SvMAGIC(oav)) {
254 SvMAGIC(av) = SvMAGIC(oav);
255 SvFLAGS(av) |= SvMAGICAL(oav);
256 SvMAGICAL_off(oav);
257 SvMAGIC(oav) = 0;
258 localizing = 1;
259 SvSETMAGIC((SV*)av);
260 localizing = 0;
261 }
262 return av;
79072805 263}
264
265HV *
8ac85365 266save_hash(GV *gv)
79072805 267{
11343788 268 dTHR;
fb73857a 269 HV *ohv, *hv;
270
79072805 271 SSCHECK(3);
272 SSPUSHPTR(gv);
fb73857a 273 SSPUSHPTR(ohv = GvHVn(gv));
79072805 274 SSPUSHINT(SAVEt_HV);
275
276 GvHV(gv) = Null(HV*);
fb73857a 277 hv = GvHVn(gv);
278 if (SvMAGIC(ohv)) {
279 SvMAGIC(hv) = SvMAGIC(ohv);
280 SvFLAGS(hv) |= SvMAGICAL(ohv);
281 SvMAGICAL_off(ohv);
282 SvMAGIC(ohv) = 0;
283 localizing = 1;
284 SvSETMAGIC((SV*)hv);
285 localizing = 0;
286 }
287 return hv;
79072805 288}
289
290void
8ac85365 291save_item(register SV *item)
79072805 292{
11343788 293 dTHR;
f46d017c 294 register SV *sv = NEWSV(0,0);
79072805 295
f46d017c 296 sv_setsv(sv,item);
79072805 297 SSCHECK(3);
298 SSPUSHPTR(item); /* remember the pointer */
79072805 299 SSPUSHPTR(sv); /* remember the value */
300 SSPUSHINT(SAVEt_ITEM);
301}
302
303void
8ac85365 304save_int(int *intp)
79072805 305{
11343788 306 dTHR;
79072805 307 SSCHECK(3);
308 SSPUSHINT(*intp);
309 SSPUSHPTR(intp);
310 SSPUSHINT(SAVEt_INT);
311}
312
313void
8ac85365 314save_long(long int *longp)
85e6fe83 315{
11343788 316 dTHR;
85e6fe83 317 SSCHECK(3);
318 SSPUSHLONG(*longp);
319 SSPUSHPTR(longp);
320 SSPUSHINT(SAVEt_LONG);
321}
322
323void
8ac85365 324save_I32(I32 *intp)
79072805 325{
11343788 326 dTHR;
79072805 327 SSCHECK(3);
328 SSPUSHINT(*intp);
329 SSPUSHPTR(intp);
330 SSPUSHINT(SAVEt_I32);
331}
332
a0d0e21e 333void
8ac85365 334save_I16(I16 *intp)
55497cff 335{
e858de61 336 dTHR;
55497cff 337 SSCHECK(3);
338 SSPUSHINT(*intp);
339 SSPUSHPTR(intp);
340 SSPUSHINT(SAVEt_I16);
341}
342
343void
8ac85365 344save_iv(IV *ivp)
a0d0e21e 345{
11343788 346 dTHR;
a0d0e21e 347 SSCHECK(3);
4aa0a1f7 348 SSPUSHIV(*ivp);
a0d0e21e 349 SSPUSHPTR(ivp);
350 SSPUSHINT(SAVEt_IV);
351}
352
85e6fe83 353/* Cannot use save_sptr() to store a char* since the SV** cast will
354 * force word-alignment and we'll miss the pointer.
355 */
356void
8ac85365 357save_pptr(char **pptr)
85e6fe83 358{
11343788 359 dTHR;
85e6fe83 360 SSCHECK(3);
361 SSPUSHPTR(*pptr);
362 SSPUSHPTR(pptr);
363 SSPUSHINT(SAVEt_PPTR);
364}
365
79072805 366void
8ac85365 367save_sptr(SV **sptr)
79072805 368{
11343788 369 dTHR;
79072805 370 SSCHECK(3);
371 SSPUSHPTR(*sptr);
372 SSPUSHPTR(sptr);
373 SSPUSHINT(SAVEt_SPTR);
374}
375
54b9620d 376SV **
377save_threadsv(PADOFFSET i)
378{
379#ifdef USE_THREADS
380 dTHR;
940cb80d 381 SV **svp = &THREADSV(i); /* XXX Change to save by offset */
54b9620d 382 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "save_threadsv %u: %p %p:%s\n",
383 i, svp, *svp, SvPEEK(*svp)));
384 save_svref(svp);
385 return svp;
386#else
387 croak("panic: save_threadsv called in non-threaded perl");
388 return 0;
389#endif /* USE_THREADS */
390}
391
79072805 392void
8ac85365 393save_nogv(GV *gv)
79072805 394{
11343788 395 dTHR;
79072805 396 SSCHECK(2);
397 SSPUSHPTR(gv);
398 SSPUSHINT(SAVEt_NSTAB);
399}
400
401void
8ac85365 402save_hptr(HV **hptr)
79072805 403{
11343788 404 dTHR;
79072805 405 SSCHECK(3);
85e6fe83 406 SSPUSHPTR(*hptr);
79072805 407 SSPUSHPTR(hptr);
408 SSPUSHINT(SAVEt_HPTR);
409}
410
411void
8ac85365 412save_aptr(AV **aptr)
79072805 413{
11343788 414 dTHR;
79072805 415 SSCHECK(3);
85e6fe83 416 SSPUSHPTR(*aptr);
79072805 417 SSPUSHPTR(aptr);
418 SSPUSHINT(SAVEt_APTR);
419}
420
421void
8ac85365 422save_freesv(SV *sv)
8990e307 423{
11343788 424 dTHR;
8990e307 425 SSCHECK(2);
426 SSPUSHPTR(sv);
427 SSPUSHINT(SAVEt_FREESV);
428}
429
430void
8ac85365 431save_freeop(OP *o)
8990e307 432{
11343788 433 dTHR;
8990e307 434 SSCHECK(2);
11343788 435 SSPUSHPTR(o);
8990e307 436 SSPUSHINT(SAVEt_FREEOP);
437}
438
439void
8ac85365 440save_freepv(char *pv)
8990e307 441{
11343788 442 dTHR;
8990e307 443 SSCHECK(2);
444 SSPUSHPTR(pv);
445 SSPUSHINT(SAVEt_FREEPV);
446}
447
448void
8ac85365 449save_clearsv(SV **svp)
8990e307 450{
11343788 451 dTHR;
8990e307 452 SSCHECK(2);
4aa0a1f7 453 SSPUSHLONG((long)(svp-curpad));
8990e307 454 SSPUSHINT(SAVEt_CLEARSV);
455}
456
457void
8ac85365 458save_delete(HV *hv, char *key, I32 klen)
8990e307 459{
11343788 460 dTHR;
8990e307 461 SSCHECK(4);
462 SSPUSHINT(klen);
463 SSPUSHPTR(key);
4e4c362e 464 SSPUSHPTR(SvREFCNT_inc(hv));
8990e307 465 SSPUSHINT(SAVEt_DELETE);
466}
467
468void
5d863698 469save_list(register SV **sarg, I32 maxsarg)
79072805 470{
11343788 471 dTHR;
79072805 472 register SV *sv;
473 register I32 i;
474
79072805 475 for (i = 1; i <= maxsarg; i++) {
79072805 476 sv = NEWSV(0,0);
477 sv_setsv(sv,sarg[i]);
f46d017c 478 SSCHECK(3);
479 SSPUSHPTR(sarg[i]); /* remember the pointer */
79072805 480 SSPUSHPTR(sv); /* remember the value */
481 SSPUSHINT(SAVEt_ITEM);
482 }
483}
484
485void
8ac85365 486save_destructor(void (*f) (void *), void *p)
a0d0e21e 487{
11343788 488 dTHR;
a0d0e21e 489 SSCHECK(3);
490 SSPUSHDPTR(f);
491 SSPUSHPTR(p);
492 SSPUSHINT(SAVEt_DESTRUCTOR);
493}
494
495void
4e4c362e 496save_aelem(AV *av, I32 idx, SV **sptr)
497{
498 dTHR;
499 SSCHECK(4);
500 SSPUSHPTR(SvREFCNT_inc(av));
501 SSPUSHINT(idx);
502 SSPUSHPTR(SvREFCNT_inc(*sptr));
503 SSPUSHINT(SAVEt_AELEM);
504 save_scalar_at(sptr);
505}
506
507void
508save_helem(HV *hv, SV *key, SV **sptr)
509{
510 dTHR;
511 SSCHECK(4);
512 SSPUSHPTR(SvREFCNT_inc(hv));
513 SSPUSHPTR(SvREFCNT_inc(key));
514 SSPUSHPTR(SvREFCNT_inc(*sptr));
515 SSPUSHINT(SAVEt_HELEM);
516 save_scalar_at(sptr);
517}
518
519void
8ac85365 520save_op(void)
462e5cf6 521{
522 dTHR;
523 SSCHECK(2);
524 SSPUSHPTR(op);
525 SSPUSHINT(SAVEt_OP);
526}
527
528void
8ac85365 529leave_scope(I32 base)
79072805 530{
11343788 531 dTHR;
79072805 532 register SV *sv;
533 register SV *value;
534 register GV *gv;
535 register AV *av;
536 register HV *hv;
537 register void* ptr;
161b7d16 538 I32 i;
79072805 539
540 if (base < -1)
463ee0b2 541 croak("panic: corrupt saved stack index");
79072805 542 while (savestack_ix > base) {
543 switch (SSPOPINT) {
544 case SAVEt_ITEM: /* normal string */
545 value = (SV*)SSPOPPTR;
546 sv = (SV*)SSPOPPTR;
547 sv_replace(sv,value);
748a9306 548 localizing = 2;
79072805 549 SvSETMAGIC(sv);
748a9306 550 localizing = 0;
79072805 551 break;
552 case SAVEt_SV: /* scalar reference */
553 value = (SV*)SSPOPPTR;
554 gv = (GV*)SSPOPPTR;
7a4c00b4 555 ptr = &GvSV(gv);
4e4c362e 556 SvREFCNT_dec(gv);
7a4c00b4 557 goto restore_sv;
79072805 558 case SAVEt_SVREF: /* scalar reference */
7a4c00b4 559 value = (SV*)SSPOPPTR;
79072805 560 ptr = SSPOPPTR;
7a4c00b4 561 restore_sv:
79072805 562 sv = *(SV**)ptr;
54b9620d 563 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
564 "restore svref: %p %p:%s -> %p:%s\n",
565 ptr, sv, SvPEEK(sv), value, SvPEEK(value)));
748a9306 566 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv) &&
567 SvTYPE(sv) != SVt_PVGV)
568 {
a0d0e21e 569 (void)SvUPGRADE(value, SvTYPE(sv));
570 SvMAGIC(value) = SvMAGIC(sv);
571 SvFLAGS(value) |= SvMAGICAL(sv);
572 SvMAGICAL_off(sv);
79072805 573 SvMAGIC(sv) = 0;
a0d0e21e 574 }
7a4c00b4 575 else if (SvTYPE(value) >= SVt_PVMG && SvMAGIC(value) &&
576 SvTYPE(value) != SVt_PVGV)
577 {
578 SvFLAGS(value) |= (SvFLAGS(value) &
579 (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
580 SvMAGICAL_off(value);
581 SvMAGIC(value) = 0;
582 }
8990e307 583 SvREFCNT_dec(sv);
a0d0e21e 584 *(SV**)ptr = value;
748a9306 585 localizing = 2;
a0d0e21e 586 SvSETMAGIC(value);
748a9306 587 localizing = 0;
4e4c362e 588 SvREFCNT_dec(value);
79072805 589 break;
590 case SAVEt_AV: /* array reference */
591 av = (AV*)SSPOPPTR;
592 gv = (GV*)SSPOPPTR;
fb73857a 593 if (GvAV(gv)) {
594 AV *goner = GvAV(gv);
595 SvMAGIC(av) = SvMAGIC(goner);
596 SvFLAGS(av) |= SvMAGICAL(goner);
597 SvMAGICAL_off(goner);
598 SvMAGIC(goner) = 0;
599 SvREFCNT_dec(goner);
600 }
79072805 601 GvAV(gv) = av;
fb73857a 602 if (SvMAGICAL(av)) {
603 localizing = 2;
604 SvSETMAGIC((SV*)av);
605 localizing = 0;
606 }
79072805 607 break;
608 case SAVEt_HV: /* hash reference */
609 hv = (HV*)SSPOPPTR;
610 gv = (GV*)SSPOPPTR;
fb73857a 611 if (GvHV(gv)) {
612 HV *goner = GvHV(gv);
613 SvMAGIC(hv) = SvMAGIC(goner);
614 SvFLAGS(hv) |= SvMAGICAL(goner);
615 SvMAGICAL_off(goner);
616 SvMAGIC(goner) = 0;
617 SvREFCNT_dec(goner);
618 }
79072805 619 GvHV(gv) = hv;
fb73857a 620 if (SvMAGICAL(hv)) {
621 localizing = 2;
622 SvSETMAGIC((SV*)hv);
623 localizing = 0;
624 }
79072805 625 break;
626 case SAVEt_INT: /* int reference */
627 ptr = SSPOPPTR;
628 *(int*)ptr = (int)SSPOPINT;
629 break;
85e6fe83 630 case SAVEt_LONG: /* long reference */
631 ptr = SSPOPPTR;
632 *(long*)ptr = (long)SSPOPLONG;
633 break;
79072805 634 case SAVEt_I32: /* I32 reference */
635 ptr = SSPOPPTR;
636 *(I32*)ptr = (I32)SSPOPINT;
637 break;
55497cff 638 case SAVEt_I16: /* I16 reference */
639 ptr = SSPOPPTR;
640 *(I16*)ptr = (I16)SSPOPINT;
641 break;
a0d0e21e 642 case SAVEt_IV: /* IV reference */
643 ptr = SSPOPPTR;
644 *(IV*)ptr = (IV)SSPOPIV;
645 break;
79072805 646 case SAVEt_SPTR: /* SV* reference */
647 ptr = SSPOPPTR;
648 *(SV**)ptr = (SV*)SSPOPPTR;
649 break;
85e6fe83 650 case SAVEt_PPTR: /* char* reference */
651 ptr = SSPOPPTR;
652 *(char**)ptr = (char*)SSPOPPTR;
653 break;
79072805 654 case SAVEt_HPTR: /* HV* reference */
655 ptr = SSPOPPTR;
656 *(HV**)ptr = (HV*)SSPOPPTR;
657 break;
658 case SAVEt_APTR: /* AV* reference */
659 ptr = SSPOPPTR;
660 *(AV**)ptr = (AV*)SSPOPPTR;
661 break;
662 case SAVEt_NSTAB:
663 gv = (GV*)SSPOPPTR;
1f96a9ed 664 (void)sv_clear((SV*)gv);
79072805 665 break;
fb73857a 666 case SAVEt_GP: /* scalar reference */
79072805 667 ptr = SSPOPPTR;
668 gv = (GV*)SSPOPPTR;
fb73857a 669 if (SvPOK(gv) && SvLEN(gv) > 0) {
670 Safefree(SvPVX(gv));
671 }
672 SvPVX(gv) = (char *)SSPOPPTR;
673 SvCUR(gv) = (STRLEN)SSPOPIV;
674 SvLEN(gv) = (STRLEN)SSPOPIV;
f46d017c 675 gp_free(gv);
676 GvGP(gv) = (GP*)ptr;
4633a7c4 677 SvREFCNT_dec(gv);
79072805 678 break;
8990e307 679 case SAVEt_FREESV:
680 ptr = SSPOPPTR;
681 SvREFCNT_dec((SV*)ptr);
682 break;
683 case SAVEt_FREEOP:
684 ptr = SSPOPPTR;
46fc3d4c 685 if (comppad)
686 curpad = AvARRAY(comppad);
8990e307 687 op_free((OP*)ptr);
688 break;
689 case SAVEt_FREEPV:
690 ptr = SSPOPPTR;
691 Safefree((char*)ptr);
692 break;
693 case SAVEt_CLEARSV:
4aa0a1f7 694 ptr = (void*)&curpad[SSPOPLONG];
8990e307 695 sv = *(SV**)ptr;
bc44cdaf 696 /* Can clear pad variable in place? */
697 if (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) {
8990e307 698 if (SvTHINKFIRST(sv)) {
699 if (SvREADONLY(sv))
700 croak("panic: leave_scope clearsv");
701 if (SvROK(sv))
702 sv_unref(sv);
703 }
a0d0e21e 704 if (SvMAGICAL(sv))
705 mg_free(sv);
8990e307 706
707 switch (SvTYPE(sv)) {
708 case SVt_NULL:
709 break;
710 case SVt_PVAV:
44a8e56a 711 av_clear((AV*)sv);
8990e307 712 break;
713 case SVt_PVHV:
44a8e56a 714 hv_clear((HV*)sv);
8990e307 715 break;
716 case SVt_PVCV:
5377b701 717 croak("panic: leave_scope pad code");
718 case SVt_RV:
719 case SVt_IV:
720 case SVt_NV:
721 (void)SvOK_off(sv);
8990e307 722 break;
723 default:
a0d0e21e 724 (void)SvOK_off(sv);
5377b701 725 (void)SvOOK_off(sv);
8990e307 726 break;
727 }
728 }
729 else { /* Someone has a claim on this, so abandon it. */
4aa0a1f7 730 U32 padflags = SvFLAGS(sv) & (SVs_PADBUSY|SVs_PADMY|SVs_PADTMP);
8990e307 731 switch (SvTYPE(sv)) { /* Console ourselves with a new value */
732 case SVt_PVAV: *(SV**)ptr = (SV*)newAV(); break;
733 case SVt_PVHV: *(SV**)ptr = (SV*)newHV(); break;
734 default: *(SV**)ptr = NEWSV(0,0); break;
735 }
53868620 736 SvREFCNT_dec(sv); /* Cast current value to the winds. */
4aa0a1f7 737 SvFLAGS(*(SV**)ptr) |= padflags; /* preserve pad nature */
8990e307 738 }
739 break;
740 case SAVEt_DELETE:
741 ptr = SSPOPPTR;
742 hv = (HV*)ptr;
743 ptr = SSPOPPTR;
748a9306 744 (void)hv_delete(hv, (char*)ptr, (U32)SSPOPINT, G_DISCARD);
4e4c362e 745 SvREFCNT_dec(hv);
adbc6bb1 746 Safefree(ptr);
8990e307 747 break;
a0d0e21e 748 case SAVEt_DESTRUCTOR:
749 ptr = SSPOPPTR;
750 (*SSPOPDPTR)(ptr);
751 break;
752 case SAVEt_REGCONTEXT:
161b7d16 753 i = SSPOPINT;
754 savestack_ix -= i; /* regexp must have croaked */
a0d0e21e 755 break;
55497cff 756 case SAVEt_STACK_POS: /* Position on Perl stack */
161b7d16 757 i = SSPOPINT;
758 stack_sp = stack_base + i;
55497cff 759 break;
161b7d16 760 case SAVEt_AELEM: /* array element */
761 value = (SV*)SSPOPPTR;
762 i = SSPOPINT;
763 av = (AV*)SSPOPPTR;
764 ptr = av_fetch(av,i,1);
4e4c362e 765 if (ptr) {
766 sv = *(SV**)ptr;
767 if (sv && sv != &sv_undef) {
768 if (SvRMAGICAL(av) && mg_find((SV*)av, 'P'))
769 (void)SvREFCNT_inc(sv);
770 SvREFCNT_dec(av);
771 goto restore_sv;
772 }
773 }
774 SvREFCNT_dec(av);
775 SvREFCNT_dec(value);
776 break;
161b7d16 777 case SAVEt_HELEM: /* hash element */
778 value = (SV*)SSPOPPTR;
9002cb76 779 sv = (SV*)SSPOPPTR;
161b7d16 780 hv = (HV*)SSPOPPTR;
781 ptr = hv_fetch_ent(hv, sv, 1, 0);
4e4c362e 782 if (ptr) {
783 SV *oval = HeVAL((HE*)ptr);
784 if (oval && oval != &sv_undef) {
785 ptr = &HeVAL((HE*)ptr);
786 if (SvRMAGICAL(hv) && mg_find((SV*)hv, 'P'))
787 (void)SvREFCNT_inc(*(SV**)ptr);
788 SvREFCNT_dec(hv);
789 SvREFCNT_dec(sv);
790 goto restore_sv;
791 }
792 }
793 SvREFCNT_dec(hv);
794 SvREFCNT_dec(sv);
795 SvREFCNT_dec(value);
796 break;
462e5cf6 797 case SAVEt_OP:
798 op = (OP*)SSPOPPTR;
799 break;
79072805 800 default:
463ee0b2 801 croak("panic: leave_scope inconsistency");
79072805 802 }
803 }
804}
8990e307 805
806#ifdef DEBUGGING
1f96a9ed 807
8990e307 808void
c09156bb 809cx_dump(PERL_CONTEXT *cx)
8990e307 810{
11343788 811 dTHR;
fb73857a 812 PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), block_type[cx->cx_type]);
8990e307 813 if (cx->cx_type != CXt_SUBST) {
760ac839 814 PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
815 PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%lx\n", (long)cx->blk_oldcop);
816 PerlIO_printf(Perl_debug_log, "BLK_OLDMARKSP = %ld\n", (long)cx->blk_oldmarksp);
817 PerlIO_printf(Perl_debug_log, "BLK_OLDSCOPESP = %ld\n", (long)cx->blk_oldscopesp);
818 PerlIO_printf(Perl_debug_log, "BLK_OLDRETSP = %ld\n", (long)cx->blk_oldretsp);
819 PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%lx\n", (long)cx->blk_oldpm);
820 PerlIO_printf(Perl_debug_log, "BLK_GIMME = %s\n", cx->blk_gimme ? "LIST" : "SCALAR");
8990e307 821 }
822 switch (cx->cx_type) {
823 case CXt_NULL:
824 case CXt_BLOCK:
825 break;
826 case CXt_SUB:
760ac839 827 PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%lx\n",
8990e307 828 (long)cx->blk_sub.cv);
760ac839 829 PerlIO_printf(Perl_debug_log, "BLK_SUB.GV = 0x%lx\n",
8990e307 830 (long)cx->blk_sub.gv);
760ac839 831 PerlIO_printf(Perl_debug_log, "BLK_SUB.DFOUTGV = 0x%lx\n",
8990e307 832 (long)cx->blk_sub.dfoutgv);
760ac839 833 PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
8990e307 834 (long)cx->blk_sub.olddepth);
760ac839 835 PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
8990e307 836 (int)cx->blk_sub.hasargs);
837 break;
838 case CXt_EVAL:
760ac839 839 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
8990e307 840 (long)cx->blk_eval.old_in_eval);
760ac839 841 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
c07a80fd 842 op_name[cx->blk_eval.old_op_type],
843 op_desc[cx->blk_eval.old_op_type]);
760ac839 844 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
8990e307 845 cx->blk_eval.old_name);
760ac839 846 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%lx\n",
8990e307 847 (long)cx->blk_eval.old_eval_root);
848 break;
849
850 case CXt_LOOP:
760ac839 851 PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n",
8990e307 852 cx->blk_loop.label);
760ac839 853 PerlIO_printf(Perl_debug_log, "BLK_LOOP.RESETSP = %ld\n",
8990e307 854 (long)cx->blk_loop.resetsp);
760ac839 855 PerlIO_printf(Perl_debug_log, "BLK_LOOP.REDO_OP = 0x%lx\n",
8990e307 856 (long)cx->blk_loop.redo_op);
760ac839 857 PerlIO_printf(Perl_debug_log, "BLK_LOOP.NEXT_OP = 0x%lx\n",
8990e307 858 (long)cx->blk_loop.next_op);
760ac839 859 PerlIO_printf(Perl_debug_log, "BLK_LOOP.LAST_OP = 0x%lx\n",
8990e307 860 (long)cx->blk_loop.last_op);
760ac839 861 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
8990e307 862 (long)cx->blk_loop.iterix);
760ac839 863 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%lx\n",
8990e307 864 (long)cx->blk_loop.iterary);
760ac839 865 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%lx\n",
8990e307 866 (long)cx->blk_loop.itervar);
867 if (cx->blk_loop.itervar)
760ac839 868 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERSAVE = 0x%lx\n",
8990e307 869 (long)cx->blk_loop.itersave);
7a4c00b4 870 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERLVAL = 0x%lx\n",
871 (long)cx->blk_loop.iterlval);
8990e307 872 break;
873
874 case CXt_SUBST:
760ac839 875 PerlIO_printf(Perl_debug_log, "SB_ITERS = %ld\n",
8990e307 876 (long)cx->sb_iters);
760ac839 877 PerlIO_printf(Perl_debug_log, "SB_MAXITERS = %ld\n",
8990e307 878 (long)cx->sb_maxiters);
760ac839 879 PerlIO_printf(Perl_debug_log, "SB_SAFEBASE = %ld\n",
8990e307 880 (long)cx->sb_safebase);
760ac839 881 PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
8990e307 882 (long)cx->sb_once);
760ac839 883 PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
8990e307 884 cx->sb_orig);
760ac839 885 PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%lx\n",
8990e307 886 (long)cx->sb_dstr);
760ac839 887 PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%lx\n",
8990e307 888 (long)cx->sb_targ);
760ac839 889 PerlIO_printf(Perl_debug_log, "SB_S = 0x%lx\n",
8990e307 890 (long)cx->sb_s);
760ac839 891 PerlIO_printf(Perl_debug_log, "SB_M = 0x%lx\n",
8990e307 892 (long)cx->sb_m);
760ac839 893 PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%lx\n",
8990e307 894 (long)cx->sb_strend);
c90c0ff4 895 PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%lx\n",
896 (long)cx->sb_rxres);
8990e307 897 break;
898 }
899}
900#endif