3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
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.
12 * For the fashion of Minas Tirith was such that it was built on seven
15 * [p.751 of _The Lord of the Rings_, V/i: "Minas Tirith"]
18 /* This file contains functions to manipulate several of Perl's stacks;
19 * in particular it contains code to push various types of things onto
20 * the savestack, then to pop them off and perform the correct restorative
21 * action for each one. This corresponds to the cleanup Perl does at
26 #define PERL_IN_SCOPE_C
30 Perl_stack_grow(pTHX_ SV **sp, SV **p, SSize_t n)
34 PERL_ARGS_ASSERT_STACK_GROW;
37 #ifndef STRESS_REALLOC
38 av_extend(PL_curstack, (p - PL_stack_base) + (n) + 128);
40 av_extend(PL_curstack, (p - PL_stack_base) + (n) + 1);
45 #ifndef STRESS_REALLOC
46 #define GROW(old) ((old) * 3 / 2)
48 #define GROW(old) ((old) + 1)
52 Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
57 si->si_stack = newAV();
58 AvREAL_off(si->si_stack);
59 av_extend(si->si_stack, stitems > 0 ? stitems-1 : 0);
60 AvALLOC(si->si_stack)[0] = &PL_sv_undef;
61 AvFILLp(si->si_stack) = 0;
64 si->si_cxmax = cxitems - 1;
66 si->si_type = PERLSI_UNDEF;
67 Newx(si->si_cxstack, cxitems, PERL_CONTEXT);
68 /* Without any kind of initialising PUSHSUBST()
69 * in pp_subst() will read uninitialised heap. */
70 PoisonNew(si->si_cxstack, cxitems, PERL_CONTEXT);
78 const IV old_max = cxstack_max;
79 cxstack_max = GROW(cxstack_max);
80 Renew(cxstack, cxstack_max + 1, PERL_CONTEXT);
81 /* Without any kind of initialising deep enough recursion
82 * will end up reading uninitialised PERL_CONTEXTs. */
83 PoisonNew(cxstack + old_max + 1, cxstack_max - old_max, PERL_CONTEXT);
84 return cxstack_ix + 1;
91 if (UNLIKELY(PL_scopestack_ix == PL_scopestack_max)) {
92 PL_scopestack_max = GROW(PL_scopestack_max);
93 Renew(PL_scopestack, PL_scopestack_max, I32);
95 Renew(PL_scopestack_name, PL_scopestack_max, const char*);
99 PL_scopestack_name[PL_scopestack_ix] = "unknown";
101 PL_scopestack[PL_scopestack_ix++] = PL_savestack_ix;
109 const I32 oldsave = PL_scopestack[--PL_scopestack_ix];
110 LEAVE_SCOPE(oldsave);
114 Perl_markstack_grow(pTHX)
117 const I32 oldmax = PL_markstack_max - PL_markstack;
118 const I32 newmax = GROW(oldmax);
120 Renew(PL_markstack, newmax, I32);
121 PL_markstack_max = PL_markstack + newmax;
122 PL_markstack_ptr = PL_markstack + oldmax;
123 return PL_markstack_ptr;
127 Perl_savestack_grow(pTHX)
130 PL_savestack_max = GROW(PL_savestack_max) + 4;
131 Renew(PL_savestack, PL_savestack_max, ANY);
135 Perl_savestack_grow_cnt(pTHX_ I32 need)
138 PL_savestack_max = PL_savestack_ix + need;
139 Renew(PL_savestack, PL_savestack_max, ANY);
145 Perl_tmps_grow(pTHX_ SSize_t n)
148 #ifndef STRESS_REALLOC
150 n = (PL_tmps_max < 512) ? 128 : 512;
152 PL_tmps_max = PL_tmps_ix + n + 1;
153 Renew(PL_tmps_stack, PL_tmps_max, SV*);
161 /* XXX should tmps_floor live in cxstack? */
162 const SSize_t myfloor = PL_tmps_floor;
163 while (PL_tmps_ix > myfloor) { /* clean up after last statement */
164 SV* const sv = PL_tmps_stack[PL_tmps_ix--];
166 PoisonWith(PL_tmps_stack + PL_tmps_ix + 1, 1, SV *, 0xAB);
168 if (LIKELY(sv && sv != &PL_sv_undef)) {
170 SvREFCNT_dec_NN(sv); /* note, can modify tmps_ix!!! */
176 S_save_scalar_at(pTHX_ SV **sptr, const U32 flags)
182 PERL_ARGS_ASSERT_SAVE_SCALAR_AT;
185 sv = (flags & SAVEf_KEEPOLDELEM) ? osv : (*sptr = newSV(0));
187 if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv)) {
188 if (SvGMAGICAL(osv)) {
189 SvFLAGS(osv) |= (SvFLAGS(osv) &
190 (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
192 if (!(flags & SAVEf_KEEPOLDELEM))
193 mg_localize(osv, sv, cBOOL(flags & SAVEf_SETMAGIC));
200 Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type)
211 Perl_save_scalar(pTHX_ GV *gv)
214 SV ** const sptr = &GvSVn(gv);
216 PERL_ARGS_ASSERT_SAVE_SCALAR;
218 if (UNLIKELY(SvGMAGICAL(*sptr))) {
223 save_pushptrptr(SvREFCNT_inc_simple(gv), SvREFCNT_inc(*sptr), SAVEt_SV);
224 return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
227 /* Like save_sptr(), but also SvREFCNT_dec()s the new value. Can be used to
228 * restore a global SV to its prior contents, freeing new value. */
230 Perl_save_generic_svref(pTHX_ SV **sptr)
234 PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF;
236 save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_GENERIC_SVREF);
239 /* Like save_pptr(), but also Safefree()s the new value if it is different
240 * from the old one. Can be used to restore a global char* to its prior
241 * contents, freeing new value. */
243 Perl_save_generic_pvref(pTHX_ char **str)
247 PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF;
249 save_pushptrptr(*str, str, SAVEt_GENERIC_PVREF);
252 /* Like save_generic_pvref(), but uses PerlMemShared_free() rather than Safefree().
253 * Can be used to restore a shared global char* to its prior
254 * contents, freeing new value. */
256 Perl_save_shared_pvref(pTHX_ char **str)
260 PERL_ARGS_ASSERT_SAVE_SHARED_PVREF;
262 save_pushptrptr(str, *str, SAVEt_SHARED_PVREF);
265 /* set the SvFLAGS specified by mask to the values in val */
268 Perl_save_set_svflags(pTHX_ SV* sv, U32 mask, U32 val)
273 PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS;
278 SS_ADD_UV(SAVEt_SET_SVFLAGS);
283 Perl_save_gp(pTHX_ GV *gv, I32 empty)
287 PERL_ARGS_ASSERT_SAVE_GP;
289 save_pushptrptr(SvREFCNT_inc(gv), GvGP(gv), SAVEt_GP);
292 GP *gp = Perl_newGP(aTHX_ gv);
293 HV * const stash = GvSTASH(gv);
294 bool isa_changed = 0;
296 if (stash && HvENAME(stash)) {
297 if (GvNAMELEN(gv) == 3 && strnEQ(GvNAME(gv), "ISA", 3))
300 /* taking a method out of circulation ("local")*/
301 mro_method_changed_in(stash);
303 if (GvIOp(gv) && (IoFLAGS(GvIOp(gv)) & IOf_ARGV)) {
305 IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
308 if (isa_changed) mro_isa_changed_in(stash);
317 Perl_save_ary(pTHX_ GV *gv)
320 AV * const oav = GvAVn(gv);
323 PERL_ARGS_ASSERT_SAVE_ARY;
325 if (UNLIKELY(!AvREAL(oav) && AvREIFY(oav)))
327 save_pushptrptr(SvREFCNT_inc_simple_NN(gv), oav, SAVEt_AV);
331 if (UNLIKELY(SvMAGIC(oav)))
332 mg_localize(MUTABLE_SV(oav), MUTABLE_SV(av), TRUE);
337 Perl_save_hash(pTHX_ GV *gv)
342 PERL_ARGS_ASSERT_SAVE_HASH;
345 SvREFCNT_inc_simple_NN(gv), (ohv = GvHVn(gv)), SAVEt_HV
350 if (UNLIKELY(SvMAGIC(ohv)))
351 mg_localize(MUTABLE_SV(ohv), MUTABLE_SV(hv), TRUE);
356 Perl_save_item(pTHX_ SV *item)
359 SV * const sv = newSVsv(item);
361 PERL_ARGS_ASSERT_SAVE_ITEM;
363 save_pushptrptr(item, /* remember the pointer */
364 sv, /* remember the value */
369 Perl_save_bool(pTHX_ bool *boolp)
374 PERL_ARGS_ASSERT_SAVE_BOOL;
377 SS_ADD_UV(SAVEt_BOOL | (*boolp << 8));
382 Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type)
394 Perl_save_int(pTHX_ int *intp)
398 UV type = ((UV)((UV)i << SAVE_TIGHT_SHIFT) | SAVEt_INT_SMALL);
402 PERL_ARGS_ASSERT_SAVE_INT;
404 if (UNLIKELY((int)(type >> SAVE_TIGHT_SHIFT) != i)) {
415 Perl_save_I8(pTHX_ I8 *bytep)
420 PERL_ARGS_ASSERT_SAVE_I8;
423 SS_ADD_UV(SAVEt_I8 | ((UV)*bytep << 8));
428 Perl_save_I16(pTHX_ I16 *intp)
433 PERL_ARGS_ASSERT_SAVE_I16;
436 SS_ADD_UV(SAVEt_I16 | ((UV)*intp << 8));
441 Perl_save_I32(pTHX_ I32 *intp)
445 UV type = ((I32)((U32)i << SAVE_TIGHT_SHIFT) | SAVEt_I32_SMALL);
449 PERL_ARGS_ASSERT_SAVE_I32;
451 if (UNLIKELY((I32)(type >> SAVE_TIGHT_SHIFT) != i)) {
462 Perl_save_strlen(pTHX_ STRLEN *ptr)
467 PERL_ARGS_ASSERT_SAVE_STRLEN;
471 SS_ADD_UV(SAVEt_STRLEN);
475 /* Cannot use save_sptr() to store a char* since the SV** cast will
476 * force word-alignment and we'll miss the pointer.
479 Perl_save_pptr(pTHX_ char **pptr)
483 PERL_ARGS_ASSERT_SAVE_PPTR;
485 save_pushptrptr(*pptr, pptr, SAVEt_PPTR);
489 Perl_save_vptr(pTHX_ void *ptr)
493 PERL_ARGS_ASSERT_SAVE_VPTR;
495 save_pushptrptr(*(char**)ptr, ptr, SAVEt_VPTR);
499 Perl_save_sptr(pTHX_ SV **sptr)
503 PERL_ARGS_ASSERT_SAVE_SPTR;
505 save_pushptrptr(*sptr, sptr, SAVEt_SPTR);
509 Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off)
514 ASSERT_CURPAD_ACTIVE("save_padsv");
515 SS_ADD_PTR(SvREFCNT_inc_simple_NN(PL_curpad[off]));
516 SS_ADD_PTR(PL_comppad);
518 SS_ADD_UV(SAVEt_PADSV_AND_MORTALIZE);
523 Perl_save_hptr(pTHX_ HV **hptr)
527 PERL_ARGS_ASSERT_SAVE_HPTR;
529 save_pushptrptr(*hptr, hptr, SAVEt_HPTR);
533 Perl_save_aptr(pTHX_ AV **aptr)
537 PERL_ARGS_ASSERT_SAVE_APTR;
539 save_pushptrptr(*aptr, aptr, SAVEt_APTR);
543 Perl_save_pushptr(pTHX_ void *const ptr, const int type)
553 Perl_save_clearsv(pTHX_ SV **svp)
556 const UV offset = svp - PL_curpad;
557 const UV offset_shifted = offset << SAVE_TIGHT_SHIFT;
559 PERL_ARGS_ASSERT_SAVE_CLEARSV;
561 ASSERT_CURPAD_ACTIVE("save_clearsv");
562 SvPADSTALE_off(*svp); /* mark lexical as active */
563 if (UNLIKELY((offset_shifted >> SAVE_TIGHT_SHIFT) != offset)) {
564 Perl_croak(aTHX_ "panic: pad offset %"UVuf" out of range (%p-%p)",
565 offset, svp, PL_curpad);
570 SS_ADD_UV(offset_shifted | SAVEt_CLEARSV);
576 Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen)
580 PERL_ARGS_ASSERT_SAVE_DELETE;
582 save_pushptri32ptr(key, klen, SvREFCNT_inc_simple(hv), SAVEt_DELETE);
586 Perl_save_hdelete(pTHX_ HV *hv, SV *keysv)
592 PERL_ARGS_ASSERT_SAVE_HDELETE;
594 key = SvPV_const(keysv, len);
595 klen = SvUTF8(keysv) ? -(I32)len : (I32)len;
596 SvREFCNT_inc_simple_void_NN(hv);
597 save_pushptri32ptr(savepvn(key, len), klen, hv, SAVEt_DELETE);
601 Perl_save_adelete(pTHX_ AV *av, SSize_t key)
606 PERL_ARGS_ASSERT_SAVE_ADELETE;
608 SvREFCNT_inc_void(av);
611 SS_ADD_IV(SAVEt_ADELETE);
616 Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
621 PERL_ARGS_ASSERT_SAVE_DESTRUCTOR;
625 SS_ADD_UV(SAVEt_DESTRUCTOR);
630 Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
637 SS_ADD_UV(SAVEt_DESTRUCTOR_X);
642 Perl_save_hints(pTHX)
645 COPHH *save_cophh = cophh_copy(CopHINTHASH_get(&PL_compiling));
646 if (PL_hints & HINT_LOCALIZE_HH) {
647 HV *oldhh = GvHV(PL_hintgv);
648 save_pushptri32ptr(oldhh, PL_hints, save_cophh, SAVEt_HINTS);
649 GvHV(PL_hintgv) = NULL; /* in case copying dies */
650 GvHV(PL_hintgv) = hv_copy_hints_hv(oldhh);
652 save_pushi32ptr(PL_hints, save_cophh, SAVEt_HINTS);
657 S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2,
669 Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr,
675 PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS;
678 SS_ADD_PTR(SvREFCNT_inc_simple(av));
680 SS_ADD_PTR(SvREFCNT_inc(*sptr));
681 SS_ADD_UV(SAVEt_AELEM);
683 /* The array needs to hold a reference count on its new element, so it
685 if (UNLIKELY(!AvREAL(av) && AvREIFY(av)))
687 save_scalar_at(sptr, flags); /* XXX - FIXME - see #60360 */
688 if (flags & SAVEf_KEEPOLDELEM)
691 /* If we're localizing a tied array element, this new sv
692 * won't actually be stored in the array - so it won't get
693 * reaped when the localize ends. Ensure it gets reaped by
694 * mortifying it instead. DAPM */
695 if (UNLIKELY(SvTIED_mg((const SV *)av, PERL_MAGIC_tied)))
700 Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags)
705 PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS;
710 SS_ADD_PTR(SvREFCNT_inc_simple(hv));
711 SS_ADD_PTR(newSVsv(key));
712 SS_ADD_PTR(SvREFCNT_inc(*sptr));
713 SS_ADD_UV(SAVEt_HELEM);
716 save_scalar_at(sptr, flags);
717 if (flags & SAVEf_KEEPOLDELEM)
720 /* If we're localizing a tied hash element, this new sv
721 * won't actually be stored in the hash - so it won't get
722 * reaped when the localize ends. Ensure it gets reaped by
723 * mortifying it instead. DAPM */
724 if (UNLIKELY(SvTIED_mg((const SV *)hv, PERL_MAGIC_tied)))
729 Perl_save_svref(pTHX_ SV **sptr)
733 PERL_ARGS_ASSERT_SAVE_SVREF;
736 save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_SVREF);
737 return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
741 Perl_save_alloc(pTHX_ I32 size, I32 pad)
744 const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
745 - (char*)PL_savestack);
746 const UV elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
747 const UV elems_shifted = elems << SAVE_TIGHT_SHIFT;
749 if (UNLIKELY((elems_shifted >> SAVE_TIGHT_SHIFT) != elems))
751 "panic: save_alloc elems %"UVuf" out of range (%"IVdf"-%"IVdf")",
752 elems, (IV)size, (IV)pad);
756 PL_savestack_ix += elems;
757 SSPUSHUV(SAVEt_ALLOC | elems_shifted);
763 #define ARG0_SV MUTABLE_SV(arg0.any_ptr)
764 #define ARG0_AV MUTABLE_AV(arg0.any_ptr)
765 #define ARG0_HV MUTABLE_HV(arg0.any_ptr)
766 #define ARG0_PTR arg0.any_ptr
767 #define ARG0_PV (char*)(arg0.any_ptr)
768 #define ARG0_PVP (char**)(arg0.any_ptr)
769 #define ARG0_I32 (arg0.any_i32)
771 #define ARG1_SV MUTABLE_SV(arg1.any_ptr)
772 #define ARG1_AV MUTABLE_AV(arg1.any_ptr)
773 #define ARG1_GV MUTABLE_GV(arg1.any_ptr)
774 #define ARG1_SVP (SV**)(arg1.any_ptr)
775 #define ARG1_PVP (char**)(arg1.any_ptr)
776 #define ARG1_PTR arg1.any_ptr
777 #define ARG1_PV (char*)(arg1.any_ptr)
778 #define ARG1_I32 (arg1.any_i32)
780 #define ARG2_SV MUTABLE_SV(arg2.any_ptr)
781 #define ARG2_AV MUTABLE_AV(arg2.any_ptr)
782 #define ARG2_HV MUTABLE_HV(arg2.any_ptr)
783 #define ARG2_GV MUTABLE_GV(arg2.any_ptr)
784 #define ARG2_PV (char*)(arg2.any_ptr)
787 Perl_leave_scope(pTHX_ I32 base)
791 /* Localise the effects of the TAINT_NOT inside the loop. */
792 bool was = TAINT_get;
794 ANY arg0, arg1, arg2;
796 /* these initialisations are logically unnecessary, but they shut up
797 * spurious 'may be used uninitialized' compiler warnings */
802 if (UNLIKELY(base < -1))
803 Perl_croak(aTHX_ "panic: corrupt saved stack index %ld", (long) base);
804 DEBUG_l(Perl_deb(aTHX_ "savestack: releasing items %ld -> %ld\n",
805 (long)PL_savestack_ix, (long)base));
806 while (PL_savestack_ix > base) {
816 I32 ix = PL_savestack_ix - 1;
817 ANY *p = &PL_savestack[ix];
819 type = (U8)uv & SAVE_MASK;
820 if (type > SAVEt_ARG0_MAX) {
823 if (type > SAVEt_ARG1_MAX) {
825 if (type > SAVEt_ARG2_MAX) {
831 PL_savestack_ix = ix;
835 case SAVEt_ITEM: /* normal string */
836 sv_replace(ARG1_SV, ARG0_SV);
837 if (UNLIKELY(SvSMAGICAL(ARG1_SV))) {
844 /* This would be a mathom, but Perl_save_svref() calls a static
845 function, S_save_scalar_at(), so has to stay in this file. */
846 case SAVEt_SVREF: /* scalar reference */
848 refsv = NULL; /* what to refcnt_dec */
851 case SAVEt_SV: /* scalar reference */
852 svp = &GvSV(ARG1_GV);
853 refsv = ARG1_SV; /* what to refcnt_dec */
856 SV * const sv = *svp;
859 if (UNLIKELY(SvSMAGICAL(ARG0_SV))) {
864 SvREFCNT_dec_NN(ARG0_SV);
868 case SAVEt_GENERIC_PVREF: /* generic pv */
869 if (*ARG0_PVP != ARG1_PV) {
874 case SAVEt_SHARED_PVREF: /* shared pv */
875 if (*ARG1_PVP != ARG0_PV) {
877 PerlMem_free(*ARG1_PVP);
879 PerlMemShared_free(*ARG1_PVP);
884 case SAVEt_GVSV: /* scalar slot in GV */
885 svp = &GvSV(ARG1_GV);
887 case SAVEt_GENERIC_SVREF: /* generic sv */
891 SV * const sv = *svp;
894 SvREFCNT_dec(ARG0_SV);
897 case SAVEt_GVSLOT: /* any slot in GV */
899 HV *const hv = GvSTASH(ARG2_GV);
901 if (hv && HvENAME(hv) && (
902 (ARG0_SV && SvTYPE(ARG0_SV) == SVt_PVCV)
903 || (*svp && SvTYPE(*svp) == SVt_PVCV)
906 if ((char *)svp < (char *)GvGP(ARG2_GV)
907 || (char *)svp > (char *)GvGP(ARG2_GV) + sizeof(struct gp)
908 || GvREFCNT(ARG2_GV) > 1)
910 else mro_method_changed_in(hv);
914 case SAVEt_AV: /* array reference */
915 SvREFCNT_dec(GvAV(ARG1_GV));
916 GvAV(ARG1_GV) = ARG0_AV;
917 if (UNLIKELY(SvSMAGICAL(ARG0_SV))) {
922 SvREFCNT_dec_NN(ARG1_GV);
924 case SAVEt_HV: /* hash reference */
925 SvREFCNT_dec(GvHV(ARG1_GV));
926 GvHV(ARG1_GV) = ARG0_HV;
927 if (UNLIKELY(SvSMAGICAL(ARG0_SV))) {
932 SvREFCNT_dec_NN(ARG1_GV);
934 case SAVEt_INT_SMALL:
935 *(int*)ARG0_PTR = (int)(uv >> SAVE_TIGHT_SHIFT);
937 case SAVEt_INT: /* int reference */
938 *(int*)ARG0_PTR = (int)ARG1_I32;
940 case SAVEt_STRLEN: /* STRLEN/size_t ref */
941 *(STRLEN*)ARG0_PTR = (STRLEN)arg1.any_iv;
943 case SAVEt_BOOL: /* bool reference */
944 *(bool*)ARG0_PTR = cBOOL(uv >> 8);
945 #ifdef NO_TAINT_SUPPORT
946 PERL_UNUSED_VAR(was);
948 if (UNLIKELY(ARG0_PTR == &(TAINT_get))) {
949 /* If we don't update <was>, to reflect what was saved on the
950 * stack for PL_tainted, then we will overwrite this attempt to
951 * restore it when we exit this routine. Note that this won't
952 * work if this value was saved in a wider-than necessary type,
954 was = *(bool*)ARG0_PTR;
958 case SAVEt_I32_SMALL:
959 *(I32*)ARG0_PTR = (I32)(uv >> SAVE_TIGHT_SHIFT);
961 case SAVEt_I32: /* I32 reference */
962 #ifdef PERL_DEBUG_READONLY_OPS
963 if (*(I32*)ARG0_PTR != ARG1_I32)
965 *(I32*)ARG0_PTR = ARG1_I32;
967 case SAVEt_SPTR: /* SV* reference */
968 *(SV**)(ARG0_PTR)= ARG1_SV;
970 case SAVEt_VPTR: /* random* reference */
971 case SAVEt_PPTR: /* char* reference */
974 case SAVEt_HPTR: /* HV* reference */
975 *(HV**)ARG0_PTR = MUTABLE_HV(ARG1_PTR);
977 case SAVEt_APTR: /* AV* reference */
978 *(AV**)ARG0_PTR = ARG1_AV;
980 case SAVEt_GP: /* scalar reference */
983 /* possibly taking a method out of circulation */
984 const bool had_method = !!GvCVu(ARG1_GV);
986 GvGP_set(ARG1_GV, (GP*)ARG0_PTR);
987 if ((hv=GvSTASH(ARG1_GV)) && HvENAME_get(hv)) {
988 if ( GvNAMELEN(ARG1_GV) == 3
989 && strnEQ(GvNAME(ARG1_GV), "ISA", 3)
991 mro_isa_changed_in(hv);
992 else if (had_method || GvCVu(ARG1_GV))
993 /* putting a method back into circulation ("local")*/
994 gv_method_changed(ARG1_GV);
996 SvREFCNT_dec_NN(ARG1_GV);
1000 SvREFCNT_dec(ARG0_SV);
1002 case SAVEt_FREECOPHH:
1003 cophh_free((COPHH *)ARG0_PTR);
1005 case SAVEt_MORTALIZESV:
1006 sv_2mortal(ARG0_SV);
1009 ASSERT_CURPAD_LEGAL("SAVEt_FREEOP");
1010 op_free((OP*)ARG0_PTR);
1021 case SAVEt_CLEARPADRANGE:
1022 i = (I32)((uv >> SAVE_TIGHT_SHIFT) & OPpPADRANGE_COUNTMASK);
1023 svp = &PL_curpad[uv >>
1024 (OPpPADRANGE_COUNTSHIFT + SAVE_TIGHT_SHIFT)] + i - 1;
1027 svp = &PL_curpad[uv >> SAVE_TIGHT_SHIFT];
1030 for (; i; i--, svp--) {
1033 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
1034 "Pad 0x%"UVxf"[0x%"UVxf"] clearsv: %ld sv=0x%"UVxf"<%"IVdf"> %s\n",
1035 PTR2UV(PL_comppad), PTR2UV(PL_curpad),
1036 (long)(svp-PL_curpad), PTR2UV(sv), (IV)SvREFCNT(sv),
1037 (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) ? "clear" : "abandon"
1040 assert(SvPADMY(sv));
1042 /* Can clear pad variable in place? */
1043 if (SvREFCNT(sv) == 1 && !SvOBJECT(sv)) {
1045 /* these flags are the union of all the relevant flags
1046 * in the individual conditions within */
1047 if (UNLIKELY(SvFLAGS(sv) & (
1048 SVf_READONLY /* for SvREADONLY_off() */
1049 | (SVs_GMG|SVs_SMG|SVs_RMG) /* SvMAGICAL() */
1053 /* if a my variable that was made readonly is
1054 * going out of scope, we want to remove the
1055 * readonlyness so that it can go out of scope
1058 if (SvREADONLY(sv) && !SvFAKE(sv))
1061 if (SvOOK(sv)) { /* OOK or HvAUX */
1062 if (SvTYPE(sv) == SVt_PVHV)
1063 Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
1068 if (SvMAGICAL(sv)) {
1069 /* note that backrefs (either in HvAUX or magic)
1070 * must be removed before other magic */
1071 sv_unmagic(sv, PERL_MAGIC_backref);
1072 if (SvTYPE(sv) != SVt_PVCV)
1075 if (SvTHINKFIRST(sv))
1076 sv_force_normal_flags(sv, SV_IMMEDIATE_UNREF
1080 switch (SvTYPE(sv)) {
1084 av_clear(MUTABLE_AV(sv));
1087 hv_clear(MUTABLE_HV(sv));
1091 HEK * const hek = CvNAME_HEK((CV *)sv);
1095 CvNAME_HEK_set(sv, hek);
1099 /* This looks odd, but these two macros are for use in
1100 expressions and finish with a trailing comma, so
1101 adding a ; after them would be wrong. */
1104 SvFLAGS(sv) &=~ (SVf_OK|SVf_IVisUV|SVf_UTF8);
1107 SvPADSTALE_on(sv); /* mark as no longer live */
1109 else { /* Someone has a claim on this, so abandon it. */
1110 assert( SvFLAGS(sv) & SVs_PADMY);
1111 assert(!(SvFLAGS(sv) & SVs_PADTMP));
1112 switch (SvTYPE(sv)) { /* Console ourselves with a new value */
1113 case SVt_PVAV: *svp = MUTABLE_SV(newAV()); break;
1114 case SVt_PVHV: *svp = MUTABLE_SV(newHV()); break;
1118 *svp = newSV_type(SVt_PVCV);
1121 assert(CvNAMED(sv));
1122 CvNAME_HEK_set(*svp,
1123 share_hek_hek(CvNAME_HEK((CV *)sv)));
1126 default: *svp = newSV(0); break;
1128 SvREFCNT_dec_NN(sv); /* Cast current value to the winds. */
1129 /* preserve pad nature, but also mark as not live
1130 * for any closure capturing */
1131 SvFLAGS(*svp) |= (SVs_PADMY|SVs_PADSTALE);
1137 (void)hv_delete(ARG0_HV, ARG2_PV, ARG1_I32, G_DISCARD);
1138 SvREFCNT_dec(ARG0_HV);
1139 Safefree(arg2.any_ptr);
1142 (void)av_delete(ARG0_AV, arg1.any_iv, G_DISCARD);
1143 SvREFCNT_dec(ARG0_AV);
1145 case SAVEt_DESTRUCTOR_X:
1146 (*arg1.any_dxptr)(aTHX_ ARG0_PTR);
1148 case SAVEt_REGCONTEXT:
1149 /* regexp must have croaked */
1151 PL_savestack_ix -= uv >> SAVE_TIGHT_SHIFT;
1153 case SAVEt_STACK_POS: /* Position on Perl stack */
1154 PL_stack_sp = PL_stack_base + arg0.any_i32;
1156 case SAVEt_AELEM: /* array element */
1157 svp = av_fetch(ARG2_AV, arg1.any_iv, 1);
1158 if (UNLIKELY(!AvREAL(ARG2_AV) && AvREIFY(ARG2_AV))) /* undo reify guard */
1159 SvREFCNT_dec(ARG0_SV);
1161 SV * const sv = *svp;
1162 if (LIKELY(sv && sv != &PL_sv_undef)) {
1163 if (UNLIKELY(SvTIED_mg((const SV *)ARG2_AV, PERL_MAGIC_tied)))
1164 SvREFCNT_inc_void_NN(sv);
1169 SvREFCNT_dec(ARG2_AV);
1170 SvREFCNT_dec(ARG0_SV);
1172 case SAVEt_HELEM: /* hash element */
1174 HE * const he = hv_fetch_ent(ARG2_HV, ARG1_SV, 1, 0);
1175 SvREFCNT_dec(ARG1_SV);
1177 const SV * const oval = HeVAL(he);
1178 if (LIKELY(oval && oval != &PL_sv_undef)) {
1180 if (UNLIKELY(SvTIED_mg((const SV *)ARG2_HV, PERL_MAGIC_tied)))
1181 SvREFCNT_inc_void(*svp);
1182 refsv = ARG2_SV; /* what to refcnt_dec */
1186 SvREFCNT_dec(ARG2_HV);
1187 SvREFCNT_dec(ARG0_SV);
1191 PL_op = (OP*)ARG0_PTR;
1194 if ((PL_hints & HINT_LOCALIZE_HH)) {
1195 while (GvHV(PL_hintgv)) {
1196 HV *hv = GvHV(PL_hintgv);
1197 GvHV(PL_hintgv) = NULL;
1198 SvREFCNT_dec(MUTABLE_SV(hv));
1201 cophh_free(CopHINTHASH_get(&PL_compiling));
1202 CopHINTHASH_set(&PL_compiling, (COPHH*)ARG0_PTR);
1203 *(I32*)&PL_hints = ARG1_I32;
1204 if (PL_hints & HINT_LOCALIZE_HH) {
1205 SvREFCNT_dec(MUTABLE_SV(GvHV(PL_hintgv)));
1206 GvHV(PL_hintgv) = MUTABLE_HV(SSPOPPTR);
1208 if (!GvHV(PL_hintgv)) {
1209 /* Need to add a new one manually, else rv2hv can
1210 add one via GvHVn and it won't have the magic set. */
1211 HV *const hv = newHV();
1212 hv_magic(hv, NULL, PERL_MAGIC_hints);
1213 GvHV(PL_hintgv) = hv;
1215 assert(GvHV(PL_hintgv));
1218 PL_comppad = (PAD*)ARG0_PTR;
1219 if (LIKELY(PL_comppad))
1220 PL_curpad = AvARRAY(PL_comppad);
1224 case SAVEt_PADSV_AND_MORTALIZE:
1228 svp = AvARRAY((PAD*)ARG1_PTR) + (PADOFFSET)arg0.any_uv;
1229 /* This mortalizing used to be done by POPLOOP() via itersave.
1230 But as we have all the information here, we can do it here,
1231 save even having to have itersave in the struct. */
1236 case SAVEt_SAVESWITCHSTACK:
1239 SWITCHSTACK(ARG0_AV, ARG1_AV);
1240 PL_curstackinfo->si_stack = ARG1_AV;
1243 case SAVEt_SET_SVFLAGS:
1244 SvFLAGS(ARG2_SV) &= ~((U32)ARG1_I32);
1245 SvFLAGS(ARG2_SV) |= (U32)ARG0_I32;
1248 /* These are only saved in mathoms.c */
1250 (void)sv_clear(ARG0_SV);
1252 case SAVEt_LONG: /* long reference */
1253 *(long*)ARG0_PTR = arg1.any_long;
1255 case SAVEt_IV: /* IV reference */
1256 *(IV*)ARG0_PTR = arg1.any_iv;
1259 case SAVEt_I16: /* I16 reference */
1260 *(I16*)ARG0_PTR = (I16)(uv >> 8);
1262 case SAVEt_I8: /* I8 reference */
1263 *(I8*)ARG0_PTR = (I8)(uv >> 8);
1265 case SAVEt_DESTRUCTOR:
1266 (*arg1.any_dptr)(ARG0_PTR);
1268 case SAVEt_COMPILE_WARNINGS:
1269 if (!specialWARN(PL_compiling.cop_warnings))
1270 PerlMemShared_free(PL_compiling.cop_warnings);
1272 PL_compiling.cop_warnings = (STRLEN*)ARG0_PTR;
1275 parser_free((yy_parser *) ARG0_PTR);
1277 case SAVEt_READONLY_OFF:
1278 SvREADONLY_off(ARG0_SV);
1281 Perl_croak(aTHX_ "panic: leave_scope inconsistency %u", type);
1289 Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
1293 PERL_ARGS_ASSERT_CX_DUMP;
1296 PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), PL_block_type[CxTYPE(cx)]);
1297 if (CxTYPE(cx) != CXt_SUBST) {
1298 const char *gimme_text;
1299 PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
1300 PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%"UVxf"\n",
1301 PTR2UV(cx->blk_oldcop));
1302 PerlIO_printf(Perl_debug_log, "BLK_OLDMARKSP = %ld\n", (long)cx->blk_oldmarksp);
1303 PerlIO_printf(Perl_debug_log, "BLK_OLDSCOPESP = %ld\n", (long)cx->blk_oldscopesp);
1304 PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%"UVxf"\n",
1305 PTR2UV(cx->blk_oldpm));
1306 switch (cx->blk_gimme) {
1308 gimme_text = "VOID";
1311 gimme_text = "SCALAR";
1314 gimme_text = "LIST";
1317 gimme_text = "UNKNOWN";
1320 PerlIO_printf(Perl_debug_log, "BLK_GIMME = %s\n", gimme_text);
1322 switch (CxTYPE(cx)) {
1327 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.CV = 0x%"UVxf"\n",
1328 PTR2UV(cx->blk_format.cv));
1329 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.GV = 0x%"UVxf"\n",
1330 PTR2UV(cx->blk_format.gv));
1331 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.DFOUTGV = 0x%"UVxf"\n",
1332 PTR2UV(cx->blk_format.dfoutgv));
1333 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.HASARGS = %d\n",
1334 (int)CxHASARGS(cx));
1335 PerlIO_printf(Perl_debug_log, "BLK_FORMAT.RETOP = 0x%"UVxf"\n",
1336 PTR2UV(cx->blk_format.retop));
1339 PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
1340 PTR2UV(cx->blk_sub.cv));
1341 PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
1342 (long)cx->blk_sub.olddepth);
1343 PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
1344 (int)CxHASARGS(cx));
1345 PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n", (int)CxLVAL(cx));
1346 PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%"UVxf"\n",
1347 PTR2UV(cx->blk_sub.retop));
1350 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
1351 (long)CxOLD_IN_EVAL(cx));
1352 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
1353 PL_op_name[CxOLD_OP_TYPE(cx)],
1354 PL_op_desc[CxOLD_OP_TYPE(cx)]);
1355 if (cx->blk_eval.old_namesv)
1356 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
1357 SvPVX_const(cx->blk_eval.old_namesv));
1358 PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%"UVxf"\n",
1359 PTR2UV(cx->blk_eval.old_eval_root));
1360 PerlIO_printf(Perl_debug_log, "BLK_EVAL.RETOP = 0x%"UVxf"\n",
1361 PTR2UV(cx->blk_eval.retop));
1364 case CXt_LOOP_LAZYIV:
1365 case CXt_LOOP_LAZYSV:
1367 case CXt_LOOP_PLAIN:
1368 PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n", CxLABEL(cx));
1369 PerlIO_printf(Perl_debug_log, "BLK_LOOP.RESETSP = %ld\n",
1370 (long)cx->blk_loop.resetsp);
1371 PerlIO_printf(Perl_debug_log, "BLK_LOOP.MY_OP = 0x%"UVxf"\n",
1372 PTR2UV(cx->blk_loop.my_op));
1373 /* XXX: not accurate for LAZYSV/IV */
1374 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%"UVxf"\n",
1375 PTR2UV(cx->blk_loop.state_u.ary.ary));
1376 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
1377 (long)cx->blk_loop.state_u.ary.ix);
1378 PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%"UVxf"\n",
1379 PTR2UV(CxITERVAR(cx)));
1383 PerlIO_printf(Perl_debug_log, "SB_ITERS = %ld\n",
1384 (long)cx->sb_iters);
1385 PerlIO_printf(Perl_debug_log, "SB_MAXITERS = %ld\n",
1386 (long)cx->sb_maxiters);
1387 PerlIO_printf(Perl_debug_log, "SB_RFLAGS = %ld\n",
1388 (long)cx->sb_rflags);
1389 PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
1391 PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
1393 PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%"UVxf"\n",
1394 PTR2UV(cx->sb_dstr));
1395 PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%"UVxf"\n",
1396 PTR2UV(cx->sb_targ));
1397 PerlIO_printf(Perl_debug_log, "SB_S = 0x%"UVxf"\n",
1399 PerlIO_printf(Perl_debug_log, "SB_M = 0x%"UVxf"\n",
1401 PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%"UVxf"\n",
1402 PTR2UV(cx->sb_strend));
1403 PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%"UVxf"\n",
1404 PTR2UV(cx->sb_rxres));
1408 PERL_UNUSED_CONTEXT;
1409 PERL_UNUSED_ARG(cx);
1410 #endif /* DEBUGGING */
1415 * c-indentation-style: bsd
1417 * indent-tabs-mode: nil
1420 * ex: set ts=8 sts=4 sw=4 et: