3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006 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 * "Sam sat on the ground and put his head in his hands. 'I wish I had never
13 * come here, and I don't want to see no more magic,' he said, and fell silent."
17 =head1 Magical Functions
19 "Magic" is special data attached to SV structures in order to give them
20 "magical" properties. When any Perl code tries to read from, or assign to,
21 an SV marked as magical, it calls the 'get' or 'set' function associated
22 with that SV's magic. A get is called prior to reading an SV, in order to
23 give it a chance to update its internal value (get on $. writes the line
24 number of the last read filehandle into to the SV's IV slot), while
25 set is called after an SV has been written to, in order to allow it to make
26 use of its changed value (set on $/ copies the SV's new value to the
27 PL_rs global variable).
29 Magic is implemented as a linked list of MAGIC structures attached to the
30 SV. Each MAGIC struct holds the type of the magic, a pointer to an array
31 of functions that implement the get(), set(), length() etc functions,
32 plus space for some flags and pointers. For example, a tied variable has
33 a MAGIC structure that contains a pointer to the object associated with the
42 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
48 #if defined(HAS_SETGROUPS)
55 # include <sys/pstat.h>
58 Signal_t Perl_csighandler(int sig);
60 /* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
61 #if !defined(HAS_SIGACTION) && defined(VMS)
62 # define FAKE_PERSISTENT_SIGNAL_HANDLERS
64 /* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
65 #if defined(KILL_BY_SIGPRC)
66 # define FAKE_DEFAULT_SIGNAL_HANDLERS
70 /* Missing protos on LynxOS */
71 void setruid(uid_t id);
72 void seteuid(uid_t id);
73 void setrgid(uid_t id);
74 void setegid(uid_t id);
78 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
86 /* MGS is typedef'ed to struct magic_state in perl.h */
89 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
92 assert(SvMAGICAL(sv));
94 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
96 mgs = SSPTR(mgs_ix, MGS*);
98 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
99 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
103 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
107 =for apidoc mg_magical
109 Turns on the magical status of an SV. See C<sv_magic>.
115 Perl_mg_magical(pTHX_ SV *sv)
118 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
119 const MGVTBL* const vtbl = mg->mg_virtual;
121 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
125 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
134 Do magic after a value is retrieved from the SV. See C<sv_magic>.
140 Perl_mg_get(pTHX_ SV *sv)
142 const I32 mgs_ix = SSNEW(sizeof(MGS));
143 const bool was_temp = (bool)SvTEMP(sv);
145 MAGIC *newmg, *head, *cur, *mg;
146 /* guard against sv having being freed midway by holding a private
149 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
150 cause the SV's buffer to get stolen (and maybe other stuff).
153 sv_2mortal(SvREFCNT_inc(sv));
158 save_magic(mgs_ix, sv);
160 /* We must call svt_get(sv, mg) for each valid entry in the linked
161 list of magic. svt_get() may delete the current entry, add new
162 magic to the head of the list, or upgrade the SV. AMS 20010810 */
164 newmg = cur = head = mg = SvMAGIC(sv);
166 const MGVTBL * const vtbl = mg->mg_virtual;
168 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
169 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
171 /* guard against magic having been deleted - eg FETCH calling
176 /* Don't restore the flags for this entry if it was deleted. */
177 if (mg->mg_flags & MGf_GSKIP)
178 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
181 mg = mg->mg_moremagic;
184 /* Have we finished with the new entries we saw? Start again
185 where we left off (unless there are more new entries). */
193 /* Were any new entries added? */
194 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
201 restore_magic(INT2PTR(void *, (IV)mgs_ix));
203 if (SvREFCNT(sv) == 1) {
204 /* We hold the last reference to this SV, which implies that the
205 SV was deleted as a side effect of the routines we called. */
214 Do magic after a value is assigned to the SV. See C<sv_magic>.
220 Perl_mg_set(pTHX_ SV *sv)
222 const I32 mgs_ix = SSNEW(sizeof(MGS));
226 save_magic(mgs_ix, sv);
228 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
229 const MGVTBL* vtbl = mg->mg_virtual;
230 nextmg = mg->mg_moremagic; /* it may delete itself */
231 if (mg->mg_flags & MGf_GSKIP) {
232 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
233 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
235 if (vtbl && vtbl->svt_set)
236 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
239 restore_magic(INT2PTR(void*, (IV)mgs_ix));
244 =for apidoc mg_length
246 Report on the SV's length. See C<sv_magic>.
252 Perl_mg_length(pTHX_ SV *sv)
257 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
258 const MGVTBL * const vtbl = mg->mg_virtual;
259 if (vtbl && vtbl->svt_len) {
260 const I32 mgs_ix = SSNEW(sizeof(MGS));
261 save_magic(mgs_ix, sv);
262 /* omit MGf_GSKIP -- not changed here */
263 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
264 restore_magic(INT2PTR(void*, (IV)mgs_ix));
270 const U8 *s = (U8*)SvPV_const(sv, len);
271 len = Perl_utf8_length(aTHX_ (U8*)s, (U8*)s + len);
274 (void)SvPV_const(sv, len);
279 Perl_mg_size(pTHX_ SV *sv)
283 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
284 const MGVTBL* const vtbl = mg->mg_virtual;
285 if (vtbl && vtbl->svt_len) {
286 const I32 mgs_ix = SSNEW(sizeof(MGS));
288 save_magic(mgs_ix, sv);
289 /* omit MGf_GSKIP -- not changed here */
290 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
291 restore_magic(INT2PTR(void*, (IV)mgs_ix));
298 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
302 Perl_croak(aTHX_ "Size magic not implemented");
311 Clear something magical that the SV represents. See C<sv_magic>.
317 Perl_mg_clear(pTHX_ SV *sv)
319 const I32 mgs_ix = SSNEW(sizeof(MGS));
322 save_magic(mgs_ix, sv);
324 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
325 const MGVTBL* const vtbl = mg->mg_virtual;
326 /* omit GSKIP -- never set here */
328 if (vtbl && vtbl->svt_clear)
329 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
332 restore_magic(INT2PTR(void*, (IV)mgs_ix));
339 Finds the magic pointer for type matching the SV. See C<sv_magic>.
345 Perl_mg_find(pTHX_ SV *sv, int type)
349 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
350 if (mg->mg_type == type)
360 Copies the magic from one SV to another. See C<sv_magic>.
366 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
370 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
371 const MGVTBL* const vtbl = mg->mg_virtual;
372 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
373 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
376 const char type = mg->mg_type;
379 (type == PERL_MAGIC_tied)
381 : (type == PERL_MAGIC_regdata && mg->mg_obj)
384 toLOWER(type), key, klen);
395 Free any magic storage used by the SV. See C<sv_magic>.
401 Perl_mg_free(pTHX_ SV *sv)
405 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
406 const MGVTBL* const vtbl = mg->mg_virtual;
407 moremagic = mg->mg_moremagic;
408 if (vtbl && vtbl->svt_free)
409 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
410 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
411 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
412 Safefree(mg->mg_ptr);
413 else if (mg->mg_len == HEf_SVKEY)
414 SvREFCNT_dec((SV*)mg->mg_ptr);
416 if (mg->mg_flags & MGf_REFCOUNTED)
417 SvREFCNT_dec(mg->mg_obj);
420 SvMAGIC_set(sv, NULL);
427 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
429 register const REGEXP *rx;
432 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
433 if (mg->mg_obj) /* @+ */
436 return rx->lastparen;
443 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
447 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
448 register const I32 paren = mg->mg_len;
453 if (paren <= (I32)rx->nparens &&
454 (s = rx->startp[paren]) != -1 &&
455 (t = rx->endp[paren]) != -1)
458 if (mg->mg_obj) /* @+ */
463 if (i > 0 && RX_MATCH_UTF8(rx)) {
464 const char * const b = rx->subbeg;
466 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
476 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
478 PERL_UNUSED_ARG(sv); PERL_UNUSED_ARG(mg);
479 Perl_croak(aTHX_ PL_no_modify);
480 NORETURN_FUNCTION_END;
484 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
488 register const REGEXP *rx;
491 switch (*mg->mg_ptr) {
492 case '1': case '2': case '3': case '4':
493 case '5': case '6': case '7': case '8': case '9': case '&':
494 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
496 paren = atoi(mg->mg_ptr); /* $& is in [0] */
498 if (paren <= (I32)rx->nparens &&
499 (s1 = rx->startp[paren]) != -1 &&
500 (t1 = rx->endp[paren]) != -1)
504 if (i > 0 && RX_MATCH_UTF8(rx)) {
505 const char * const s = rx->subbeg + s1;
510 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
514 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
518 if (ckWARN(WARN_UNINITIALIZED))
523 if (ckWARN(WARN_UNINITIALIZED))
528 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
529 paren = rx->lastparen;
534 case '\016': /* ^N */
535 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
536 paren = rx->lastcloseparen;
542 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
543 if (rx->startp[0] != -1) {
554 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
555 if (rx->endp[0] != -1) {
556 i = rx->sublen - rx->endp[0];
567 if (!SvPOK(sv) && SvNIOK(sv)) {
575 #define SvRTRIM(sv) STMT_START { \
577 STRLEN len = SvCUR(sv); \
578 char * const p = SvPVX(sv); \
579 while (len > 0 && isSPACE(p[len-1])) \
581 SvCUR_set(sv, len); \
587 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
590 register char *s = NULL;
593 const char * const remaining = mg->mg_ptr + 1;
594 const char nextchar = *remaining;
596 switch (*mg->mg_ptr) {
597 case '\001': /* ^A */
598 sv_setsv(sv, PL_bodytarget);
600 case '\003': /* ^C */
601 sv_setiv(sv, (IV)PL_minus_c);
604 case '\004': /* ^D */
605 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
606 #if defined(YYDEBUG) && defined(DEBUGGING)
607 PL_yydebug = DEBUG_p_TEST;
610 case '\005': /* ^E */
611 if (nextchar == '\0') {
612 #ifdef MACOS_TRADITIONAL
616 sv_setnv(sv,(double)gMacPerl_OSErr);
617 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
622 # include <descrip.h>
623 # include <starlet.h>
625 $DESCRIPTOR(msgdsc,msg);
626 sv_setnv(sv,(NV) vaxc$errno);
627 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
628 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
634 if (!(_emx_env & 0x200)) { /* Under DOS */
635 sv_setnv(sv, (NV)errno);
636 sv_setpv(sv, errno ? Strerror(errno) : "");
638 if (errno != errno_isOS2) {
639 const int tmp = _syserrno();
640 if (tmp) /* 2nd call to _syserrno() makes it 0 */
643 sv_setnv(sv, (NV)Perl_rc);
644 sv_setpv(sv, os2error(Perl_rc));
649 DWORD dwErr = GetLastError();
650 sv_setnv(sv, (NV)dwErr);
652 PerlProc_GetOSError(sv, dwErr);
655 sv_setpvn(sv, "", 0);
660 const int saveerrno = errno;
661 sv_setnv(sv, (NV)errno);
662 sv_setpv(sv, errno ? Strerror(errno) : "");
670 SvNOK_on(sv); /* what a wonderful hack! */
672 else if (strEQ(remaining, "NCODING"))
673 sv_setsv(sv, PL_encoding);
675 case '\006': /* ^F */
676 sv_setiv(sv, (IV)PL_maxsysfd);
678 case '\010': /* ^H */
679 sv_setiv(sv, (IV)PL_hints);
681 case '\011': /* ^I */ /* NOT \t in EBCDIC */
683 sv_setpv(sv, PL_inplace);
685 sv_setsv(sv, &PL_sv_undef);
687 case '\017': /* ^O & ^OPEN */
688 if (nextchar == '\0') {
689 sv_setpv(sv, PL_osname);
692 else if (strEQ(remaining, "PEN")) {
693 if (!PL_compiling.cop_io)
694 sv_setsv(sv, &PL_sv_undef);
696 sv_setsv(sv, PL_compiling.cop_io);
700 case '\020': /* ^P */
701 sv_setiv(sv, (IV)PL_perldb);
703 case '\023': /* ^S */
704 if (nextchar == '\0') {
705 if (PL_lex_state != LEX_NOTPARSING)
708 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
713 case '\024': /* ^T */
714 if (nextchar == '\0') {
716 sv_setnv(sv, PL_basetime);
718 sv_setiv(sv, (IV)PL_basetime);
721 else if (strEQ(remaining, "AINT"))
722 sv_setiv(sv, PL_tainting
723 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
726 case '\025': /* $^UNICODE, $^UTF8LOCALE */
727 if (strEQ(remaining, "NICODE"))
728 sv_setuv(sv, (UV) PL_unicode);
729 else if (strEQ(remaining, "TF8LOCALE"))
730 sv_setuv(sv, (UV) PL_utf8locale);
732 case '\027': /* ^W & $^WARNING_BITS */
733 if (nextchar == '\0')
734 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
735 else if (strEQ(remaining, "ARNING_BITS")) {
736 if (PL_compiling.cop_warnings == pWARN_NONE) {
737 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
739 else if (PL_compiling.cop_warnings == pWARN_STD) {
742 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
746 else if (PL_compiling.cop_warnings == pWARN_ALL) {
747 /* Get the bit mask for $warnings::Bits{all}, because
748 * it could have been extended by warnings::register */
750 HV * const bits=get_hv("warnings::Bits", FALSE);
751 if (bits && (bits_all=hv_fetch(bits, "all", 3, FALSE))) {
752 sv_setsv(sv, *bits_all);
755 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
759 sv_setsv(sv, PL_compiling.cop_warnings);
764 case '1': case '2': case '3': case '4':
765 case '5': case '6': case '7': case '8': case '9': case '&':
766 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
770 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
771 * XXX Does the new way break anything?
773 paren = atoi(mg->mg_ptr); /* $& is in [0] */
775 if (paren <= (I32)rx->nparens &&
776 (s1 = rx->startp[paren]) != -1 &&
777 (t1 = rx->endp[paren]) != -1)
786 int oldtainted = PL_tainted;
789 PL_tainted = oldtainted;
790 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
795 if (RX_MATCH_TAINTED(rx)) {
796 MAGIC* const mg = SvMAGIC(sv);
799 SvMAGIC_set(sv, mg->mg_moremagic);
801 if ((mgt = SvMAGIC(sv))) {
802 mg->mg_moremagic = mgt;
812 sv_setsv(sv,&PL_sv_undef);
815 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
816 paren = rx->lastparen;
820 sv_setsv(sv,&PL_sv_undef);
822 case '\016': /* ^N */
823 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
824 paren = rx->lastcloseparen;
828 sv_setsv(sv,&PL_sv_undef);
831 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
832 if ((s = rx->subbeg) && rx->startp[0] != -1) {
837 sv_setsv(sv,&PL_sv_undef);
840 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
841 if (rx->subbeg && rx->endp[0] != -1) {
842 s = rx->subbeg + rx->endp[0];
843 i = rx->sublen - rx->endp[0];
847 sv_setsv(sv,&PL_sv_undef);
850 if (GvIO(PL_last_in_gv)) {
851 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
856 sv_setiv(sv, (IV)STATUS_CURRENT);
857 #ifdef COMPLEX_STATUS
858 LvTARGOFF(sv) = PL_statusvalue;
859 LvTARGLEN(sv) = PL_statusvalue_vms;
864 if (GvIOp(PL_defoutgv))
865 s = IoTOP_NAME(GvIOp(PL_defoutgv));
869 sv_setpv(sv,GvENAME(PL_defoutgv));
874 if (GvIOp(PL_defoutgv))
875 s = IoFMT_NAME(GvIOp(PL_defoutgv));
877 s = GvENAME(PL_defoutgv);
881 if (GvIOp(PL_defoutgv))
882 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
885 if (GvIOp(PL_defoutgv))
886 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
889 if (GvIOp(PL_defoutgv))
890 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
897 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
900 if (GvIOp(PL_defoutgv))
901 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
907 sv_copypv(sv, PL_ors_sv);
910 sv_setpv(sv,PL_ofmt);
914 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
915 sv_setpv(sv, errno ? Strerror(errno) : "");
918 const int saveerrno = errno;
919 sv_setnv(sv, (NV)errno);
921 if (errno == errno_isOS2 || errno == errno_isOS2_set)
922 sv_setpv(sv, os2error(Perl_rc));
925 sv_setpv(sv, errno ? Strerror(errno) : "");
930 SvNOK_on(sv); /* what a wonderful hack! */
933 sv_setiv(sv, (IV)PL_uid);
936 sv_setiv(sv, (IV)PL_euid);
939 sv_setiv(sv, (IV)PL_gid);
941 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_gid);
945 sv_setiv(sv, (IV)PL_egid);
947 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_egid);
952 Groups_t *gary = NULL;
953 I32 num_groups = getgroups(0, gary);
954 Newx(gary, num_groups, Groups_t);
955 num_groups = getgroups(num_groups, gary);
956 while (--num_groups >= 0)
957 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f,
958 (long unsigned int)gary[num_groups]);
962 (void)SvIOK_on(sv); /* what a wonderful hack! */
966 #ifndef MACOS_TRADITIONAL
970 #ifdef USE_5005THREADS
972 sv_setsv(sv, thr->errsv);
974 #endif /* USE_5005THREADS */
980 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
982 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
984 if (uf && uf->uf_val)
985 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
990 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
996 s = SvPV_const(sv,len);
997 ptr = MgPV_const(mg,klen);
998 my_setenv((char *)ptr, (char *)s);
1000 #ifdef DYNAMIC_ENV_FETCH
1001 /* We just undefd an environment var. Is a replacement */
1002 /* waiting in the wings? */
1005 if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
1006 s = SvPV_const(*valp, len);
1010 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1011 /* And you'll never guess what the dog had */
1012 /* in its mouth... */
1014 MgTAINTEDDIR_off(mg);
1016 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1017 char pathbuf[256], eltbuf[256], *cp, *elt = (char *) s;
1021 do { /* DCL$PATH may be a search list */
1022 while (1) { /* as may dev portion of any element */
1023 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1024 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1025 cando_by_name(S_IWUSR,0,elt) ) {
1026 MgTAINTEDDIR_on(mg);
1030 if ((cp = strchr(elt, ':')) != Nullch)
1032 if (my_trnlnm(elt, eltbuf, j++))
1038 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1041 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1042 const char * const strend = s + len;
1044 while (s < strend) {
1048 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1049 (char *) s, (char *) strend, ':', &i);
1051 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1053 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1054 MgTAINTEDDIR_on(mg);
1060 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1066 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1068 PERL_UNUSED_ARG(sv);
1069 my_setenv((char *)MgPV_nolen_const(mg),Nullch);
1074 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1077 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1079 if (PL_localizing) {
1082 hv_iterinit((HV*)sv);
1083 while ((entry = hv_iternext((HV*)sv))) {
1085 my_setenv(hv_iterkey(entry, &keylen),
1086 (char *)SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1094 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1096 PERL_UNUSED_ARG(sv);
1097 PERL_UNUSED_ARG(mg);
1100 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1104 #endif /* !PERL_MICRO */
1108 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1109 static int PL_sig_handlers_initted = 0;
1111 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1112 static int PL_sig_ignoring[SIG_SIZE]; /* which signals we are ignoring */
1114 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1115 static int PL_sig_defaulting[SIG_SIZE];
1119 #ifdef HAS_SIGPROCMASK
1121 restore_sigmask(pTHX_ SV *save_sv)
1123 const sigset_t *ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1124 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1128 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1130 /* Are we fetching a signal entry? */
1131 const I32 i = whichsig((char *)MgPV_nolen_const(mg));
1134 sv_setsv(sv,PL_psig_ptr[i]);
1136 Sighandler_t sigstate;
1137 sigstate = rsignal_state(i);
1138 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1139 if (PL_sig_handlers_initted && PL_sig_ignoring[i]) sigstate = SIG_IGN;
1141 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1142 if (PL_sig_handlers_initted && PL_sig_defaulting[i]) sigstate = SIG_DFL;
1144 /* cache state so we don't fetch it again */
1145 if(sigstate == SIG_IGN)
1146 sv_setpv(sv,"IGNORE");
1148 sv_setsv(sv,&PL_sv_undef);
1149 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1156 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1158 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1159 * refactoring might be in order.
1161 register const char * const s = MgPV_nolen_const(mg);
1162 PERL_UNUSED_ARG(sv);
1165 if (strEQ(s,"__DIE__"))
1167 else if (strEQ(s,"__WARN__"))
1170 Perl_croak(aTHX_ "No such hook: %s", s);
1172 SV * const to_dec = *svp;
1174 SvREFCNT_dec(to_dec);
1178 /* Are we clearing a signal entry? */
1179 const I32 i = whichsig((char *)s);
1181 #ifdef HAS_SIGPROCMASK
1184 /* Avoid having the signal arrive at a bad time, if possible. */
1187 sigprocmask(SIG_BLOCK, &set, &save);
1189 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1190 SAVEFREESV(save_sv);
1191 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1194 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1195 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1197 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1198 PL_sig_defaulting[i] = 1;
1199 (void)rsignal(i, PL_csighandlerp);
1201 (void)rsignal(i, SIG_DFL);
1203 if(PL_psig_name[i]) {
1204 SvREFCNT_dec(PL_psig_name[i]);
1207 if(PL_psig_ptr[i]) {
1208 SV *to_dec=PL_psig_ptr[i];
1211 SvREFCNT_dec(to_dec);
1221 S_raise_signal(pTHX_ int sig)
1223 /* Set a flag to say this signal is pending */
1224 PL_psig_pend[sig]++;
1225 /* And one to say _a_ signal is pending */
1230 Perl_csighandler(int sig)
1232 #ifdef PERL_GET_SIG_CONTEXT
1233 dTHXa(PERL_GET_SIG_CONTEXT);
1237 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1238 (void) rsignal(sig, PL_csighandlerp);
1239 if (PL_sig_ignoring[sig]) return;
1241 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1242 if (PL_sig_defaulting[sig])
1243 #ifdef KILL_BY_SIGPRC
1244 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1249 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1250 /* Call the perl level handler now--
1251 * with risk we may be in malloc() etc. */
1252 (*PL_sighandlerp)(sig);
1254 S_raise_signal(aTHX_ sig);
1257 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1259 Perl_csighandler_init(void)
1262 if (PL_sig_handlers_initted) return;
1264 for (sig = 1; sig < SIG_SIZE; sig++) {
1265 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1267 PL_sig_defaulting[sig] = 1;
1268 (void) rsignal(sig, PL_csighandlerp);
1270 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1271 PL_sig_ignoring[sig] = 0;
1274 PL_sig_handlers_initted = 1;
1279 Perl_despatch_signals(pTHX)
1283 for (sig = 1; sig < SIG_SIZE; sig++) {
1284 if (PL_psig_pend[sig]) {
1285 PERL_BLOCKSIG_ADD(set, sig);
1286 PL_psig_pend[sig] = 0;
1287 PERL_BLOCKSIG_BLOCK(set);
1288 (*PL_sighandlerp)(sig);
1289 PERL_BLOCKSIG_UNBLOCK(set);
1295 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1299 /* Need to be careful with SvREFCNT_dec(), because that can have side
1300 * effects (due to closures). We must make sure that the new disposition
1301 * is in place before it is called.
1305 #ifdef HAS_SIGPROCMASK
1310 register const char *s = MgPV_const(mg,len);
1312 if (strEQ(s,"__DIE__"))
1314 else if (strEQ(s,"__WARN__"))
1317 Perl_croak(aTHX_ "No such hook: %s", s);
1325 i = whichsig((char *)s); /* ...no, a brick */
1327 if (ckWARN(WARN_SIGNAL))
1328 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1331 #ifdef HAS_SIGPROCMASK
1332 /* Avoid having the signal arrive at a bad time, if possible. */
1335 sigprocmask(SIG_BLOCK, &set, &save);
1337 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1338 SAVEFREESV(save_sv);
1339 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1342 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1343 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1345 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1346 PL_sig_ignoring[i] = 0;
1348 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1349 PL_sig_defaulting[i] = 0;
1351 SvREFCNT_dec(PL_psig_name[i]);
1352 to_dec = PL_psig_ptr[i];
1353 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1354 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1355 PL_psig_name[i] = newSVpvn(s, len);
1356 SvREADONLY_on(PL_psig_name[i]);
1358 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1360 (void)rsignal(i, PL_csighandlerp);
1361 #ifdef HAS_SIGPROCMASK
1366 *svp = SvREFCNT_inc(sv);
1368 SvREFCNT_dec(to_dec);
1371 s = SvPV_force(sv,len);
1372 if (strEQ(s,"IGNORE")) {
1374 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1375 PL_sig_ignoring[i] = 1;
1376 (void)rsignal(i, PL_csighandlerp);
1378 (void)rsignal(i, SIG_IGN);
1382 else if (strEQ(s,"DEFAULT") || !*s) {
1384 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1386 PL_sig_defaulting[i] = 1;
1387 (void)rsignal(i, PL_csighandlerp);
1390 (void)rsignal(i, SIG_DFL);
1395 * We should warn if HINT_STRICT_REFS, but without
1396 * access to a known hint bit in a known OP, we can't
1397 * tell whether HINT_STRICT_REFS is in force or not.
1399 if (!strchr(s,':') && !strchr(s,'\''))
1400 sv_insert(sv, 0, 0, "main::", 6);
1402 (void)rsignal(i, PL_csighandlerp);
1404 *svp = SvREFCNT_inc(sv);
1406 #ifdef HAS_SIGPROCMASK
1411 SvREFCNT_dec(to_dec);
1414 #endif /* !PERL_MICRO */
1417 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1419 PERL_UNUSED_ARG(sv);
1420 PERL_UNUSED_ARG(mg);
1421 PL_sub_generation++;
1426 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1428 PERL_UNUSED_ARG(sv);
1429 PERL_UNUSED_ARG(mg);
1430 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1431 PL_amagic_generation++;
1437 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1439 HV * const hv = (HV*)LvTARG(sv);
1441 PERL_UNUSED_ARG(mg);
1444 (void) hv_iterinit(hv);
1445 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1448 while (hv_iternext(hv))
1453 sv_setiv(sv, (IV)i);
1458 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1460 PERL_UNUSED_ARG(mg);
1462 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1467 /* caller is responsible for stack switching/cleanup */
1469 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1475 PUSHs(SvTIED_obj(sv, mg));
1478 if (mg->mg_len >= 0)
1479 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1480 else if (mg->mg_len == HEf_SVKEY)
1481 PUSHs((SV*)mg->mg_ptr);
1483 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1484 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1492 return call_method(meth, flags);
1496 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1502 PUSHSTACKi(PERLSI_MAGIC);
1504 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1505 sv_setsv(sv, *PL_stack_sp--);
1515 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1518 mg->mg_flags |= MGf_GSKIP;
1519 magic_methpack(sv,mg,"FETCH");
1524 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1528 PUSHSTACKi(PERLSI_MAGIC);
1529 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1536 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1538 return magic_methpack(sv,mg,"DELETE");
1543 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1550 PUSHSTACKi(PERLSI_MAGIC);
1551 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1552 sv = *PL_stack_sp--;
1553 retval = (U32) SvIV(sv)-1;
1562 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1567 PUSHSTACKi(PERLSI_MAGIC);
1569 XPUSHs(SvTIED_obj(sv, mg));
1571 call_method("CLEAR", G_SCALAR|G_DISCARD);
1579 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1582 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1586 PUSHSTACKi(PERLSI_MAGIC);
1589 PUSHs(SvTIED_obj(sv, mg));
1594 if (call_method(meth, G_SCALAR))
1595 sv_setsv(key, *PL_stack_sp--);
1604 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1606 return magic_methpack(sv,mg,"EXISTS");
1610 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1613 SV *retval = &PL_sv_undef;
1614 SV * const tied = SvTIED_obj((SV*)hv, mg);
1615 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1617 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1619 if (HvEITER_get(hv))
1620 /* we are in an iteration so the hash cannot be empty */
1622 /* no xhv_eiter so now use FIRSTKEY */
1623 key = sv_newmortal();
1624 magic_nextpack((SV*)hv, mg, key);
1625 HvEITER_set(hv, NULL); /* need to reset iterator */
1626 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1629 /* there is a SCALAR method that we can call */
1631 PUSHSTACKi(PERLSI_MAGIC);
1637 if (call_method("SCALAR", G_SCALAR))
1638 retval = *PL_stack_sp--;
1645 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1647 GV * const gv = PL_DBline;
1648 const I32 i = SvTRUE(sv);
1649 SV ** const svp = av_fetch(GvAV(gv),
1650 atoi(MgPV_nolen_const(mg)), FALSE);
1651 if (svp && SvIOKp(*svp)) {
1652 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1654 /* set or clear breakpoint in the relevant control op */
1656 o->op_flags |= OPf_SPECIAL;
1658 o->op_flags &= ~OPf_SPECIAL;
1665 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1667 AV *obj = (AV*)mg->mg_obj;
1669 sv_setiv(sv, AvFILL(obj) + PL_curcop->cop_arybase);
1677 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1679 AV *obj = (AV*)mg->mg_obj;
1681 av_fill(obj, SvIV(sv) - PL_curcop->cop_arybase);
1683 if (ckWARN(WARN_MISC))
1684 Perl_warner(aTHX_ packWARN(WARN_MISC),
1685 "Attempt to set length of freed array");
1691 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1693 SV* const lsv = LvTARG(sv);
1695 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1696 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1697 if (mg && mg->mg_len >= 0) {
1700 sv_pos_b2u(lsv, &i);
1701 sv_setiv(sv, i + PL_curcop->cop_arybase);
1710 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1712 SV* const lsv = LvTARG(sv);
1719 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1720 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1724 sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1725 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1727 else if (!SvOK(sv)) {
1731 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1733 pos = SvIV(sv) - PL_curcop->cop_arybase;
1736 ulen = sv_len_utf8(lsv);
1746 else if (pos > (SSize_t)len)
1751 sv_pos_u2b(lsv, &p, 0);
1756 mg->mg_flags &= ~MGf_MINMATCH;
1762 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1764 PERL_UNUSED_ARG(mg);
1765 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1767 gv_efullname3(sv,((GV*)sv), "*");
1771 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
1776 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1781 PERL_UNUSED_ARG(mg);
1786 if (*s == '*' && s[1])
1788 gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1793 GvGP(sv) = gp_ref(GvGP(gv));
1798 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1801 SV * const lsv = LvTARG(sv);
1802 const char * const tmps = SvPV_const(lsv,len);
1803 I32 offs = LvTARGOFF(sv);
1804 I32 rem = LvTARGLEN(sv);
1805 PERL_UNUSED_ARG(mg);
1808 sv_pos_u2b(lsv, &offs, &rem);
1809 if (offs > (I32)len)
1811 if (rem + offs > (I32)len)
1813 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1820 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1823 const char *tmps = SvPV_const(sv, len);
1824 SV * const lsv = LvTARG(sv);
1825 I32 lvoff = LvTARGOFF(sv);
1826 I32 lvlen = LvTARGLEN(sv);
1827 PERL_UNUSED_ARG(mg);
1830 sv_utf8_upgrade(lsv);
1831 sv_pos_u2b(lsv, &lvoff, &lvlen);
1832 sv_insert(lsv, lvoff, lvlen, (char *)tmps, len);
1835 else if (lsv && SvUTF8(lsv)) {
1836 sv_pos_u2b(lsv, &lvoff, &lvlen);
1837 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1838 sv_insert(lsv, lvoff, lvlen, (char *)tmps, len);
1842 sv_insert(lsv, lvoff, lvlen, (char *)tmps, len);
1848 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1850 PERL_UNUSED_ARG(sv);
1851 TAINT_IF((mg->mg_len & 1) ||
1852 ((mg->mg_len & 2) && mg->mg_obj == sv)); /* kludge */
1857 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1859 PERL_UNUSED_ARG(sv);
1860 if (PL_localizing) {
1861 if (PL_localizing == 1)
1866 else if (PL_tainted)
1874 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1876 SV * const lsv = LvTARG(sv);
1877 PERL_UNUSED_ARG(mg);
1884 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1889 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1891 PERL_UNUSED_ARG(mg);
1892 do_vecset(sv); /* XXX slurp this routine */
1897 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1900 if (LvTARGLEN(sv)) {
1902 SV * const ahv = LvTARG(sv);
1903 if (SvTYPE(ahv) == SVt_PVHV) {
1904 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1909 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, FALSE, 0);
1915 AV* const av = (AV*)LvTARG(sv);
1916 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1917 targ = AvARRAY(av)[LvTARGOFF(sv)];
1919 if (targ && targ != &PL_sv_undef) {
1920 /* somebody else defined it for us */
1921 SvREFCNT_dec(LvTARG(sv));
1922 LvTARG(sv) = SvREFCNT_inc(targ);
1924 SvREFCNT_dec(mg->mg_obj);
1925 mg->mg_obj = Nullsv;
1926 mg->mg_flags &= ~MGf_REFCOUNTED;
1931 sv_setsv(sv, targ ? targ : &PL_sv_undef);
1936 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1938 PERL_UNUSED_ARG(mg);
1942 sv_setsv(LvTARG(sv), sv);
1943 SvSETMAGIC(LvTARG(sv));
1949 Perl_vivify_defelem(pTHX_ SV *sv)
1954 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1957 SV * const ahv = LvTARG(sv);
1958 if (SvTYPE(ahv) == SVt_PVHV) {
1959 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1964 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, TRUE, 0);
1968 if (!value || value == &PL_sv_undef)
1969 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
1972 AV* const av = (AV*)LvTARG(sv);
1973 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1974 LvTARG(sv) = Nullsv; /* array can't be extended */
1976 SV** const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1977 if (!svp || (value = *svp) == &PL_sv_undef)
1978 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
1981 (void)SvREFCNT_inc(value);
1982 SvREFCNT_dec(LvTARG(sv));
1985 SvREFCNT_dec(mg->mg_obj);
1986 mg->mg_obj = Nullsv;
1987 mg->mg_flags &= ~MGf_REFCOUNTED;
1991 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
1993 AV * const av = (AV*)mg->mg_obj;
1994 SV ** const svp = AvARRAY(av);
1995 I32 i = AvFILLp(av);
1996 PERL_UNUSED_ARG(sv);
2000 if (!SvWEAKREF(svp[i]))
2001 Perl_croak(aTHX_ "panic: magic_killbackrefs (flags=%"UVxf")",
2002 (UV)SvFLAGS(svp[i]));
2003 /* XXX Should we check that it hasn't changed? */
2004 SvRV_set(svp[i], 0);
2006 SvWEAKREF_off(svp[i]);
2011 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
2016 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2024 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2026 PERL_UNUSED_ARG(mg);
2027 sv_unmagic(sv, PERL_MAGIC_bm);
2033 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2035 PERL_UNUSED_ARG(mg);
2036 sv_unmagic(sv, PERL_MAGIC_fm);
2042 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2044 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2046 if (uf && uf->uf_set)
2047 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2052 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2054 PERL_UNUSED_ARG(mg);
2055 sv_unmagic(sv, PERL_MAGIC_qr);
2060 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2062 regexp * const re = (regexp *)mg->mg_obj;
2063 PERL_UNUSED_ARG(sv);
2069 #ifdef USE_LOCALE_COLLATE
2071 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2074 * RenE<eacute> Descartes said "I think not."
2075 * and vanished with a faint plop.
2077 PERL_UNUSED_ARG(sv);
2079 Safefree(mg->mg_ptr);
2085 #endif /* USE_LOCALE_COLLATE */
2087 /* Just clear the UTF-8 cache data. */
2089 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2091 PERL_UNUSED_ARG(sv);
2092 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2094 mg->mg_len = -1; /* The mg_len holds the len cache. */
2099 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2101 register const char *s;
2104 switch (*mg->mg_ptr) {
2105 case '\001': /* ^A */
2106 sv_setsv(PL_bodytarget, sv);
2108 case '\003': /* ^C */
2109 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2112 case '\004': /* ^D */
2114 s = SvPV_nolen_const(sv);
2115 PL_debug = get_debug_opts_flags((char **)&s, 0) | DEBUG_TOP_FLAG;
2116 DEBUG_x(dump_all());
2118 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2121 case '\005': /* ^E */
2122 if (*(mg->mg_ptr+1) == '\0') {
2123 #ifdef MACOS_TRADITIONAL
2124 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2127 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2130 SetLastError( SvIV(sv) );
2133 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2135 /* will anyone ever use this? */
2136 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2142 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2144 SvREFCNT_dec(PL_encoding);
2145 if (SvOK(sv) || SvGMAGICAL(sv)) {
2146 PL_encoding = newSVsv(sv);
2149 PL_encoding = Nullsv;
2153 case '\006': /* ^F */
2154 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2156 case '\010': /* ^H */
2157 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2159 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2160 Safefree(PL_inplace);
2161 PL_inplace = SvOK(sv) ? savesvpv(sv) : Nullch;
2163 case '\017': /* ^O */
2164 if (*(mg->mg_ptr+1) == '\0') {
2165 Safefree(PL_osname);
2168 TAINT_PROPER("assigning to $^O");
2169 PL_osname = savesvpv(sv);
2172 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2173 if (!PL_compiling.cop_io)
2174 PL_compiling.cop_io = newSVsv(sv);
2176 sv_setsv(PL_compiling.cop_io,sv);
2179 case '\020': /* ^P */
2180 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2181 if (PL_perldb && !PL_DBsingle)
2184 case '\024': /* ^T */
2186 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2188 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2191 case '\027': /* ^W & $^WARNING_BITS */
2192 if (*(mg->mg_ptr+1) == '\0') {
2193 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2194 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2195 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2196 | (i ? G_WARN_ON : G_WARN_OFF) ;
2199 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2200 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2201 if (!SvPOK(sv) && PL_localizing) {
2202 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2203 PL_compiling.cop_warnings = pWARN_NONE;
2208 int accumulate = 0 ;
2209 int any_fatals = 0 ;
2210 const char * const ptr = SvPV_const(sv, len) ;
2211 for (i = 0 ; i < len ; ++i) {
2212 accumulate |= ptr[i] ;
2213 any_fatals |= (ptr[i] & 0xAA) ;
2216 PL_compiling.cop_warnings = pWARN_NONE;
2217 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2218 PL_compiling.cop_warnings = pWARN_ALL;
2219 PL_dowarn |= G_WARN_ONCE ;
2222 if (specialWARN(PL_compiling.cop_warnings))
2223 PL_compiling.cop_warnings = newSVsv(sv) ;
2225 sv_setsv(PL_compiling.cop_warnings, sv);
2226 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2227 PL_dowarn |= G_WARN_ONCE ;
2235 if (PL_localizing) {
2236 if (PL_localizing == 1)
2237 SAVESPTR(PL_last_in_gv);
2239 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2240 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2243 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2244 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2245 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
2248 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2249 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2250 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
2253 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2256 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2257 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2258 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2261 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2265 IO * const io = GvIOp(PL_defoutgv);
2268 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2269 IoFLAGS(io) &= ~IOf_FLUSH;
2271 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2272 PerlIO *ofp = IoOFP(io);
2274 (void)PerlIO_flush(ofp);
2275 IoFLAGS(io) |= IOf_FLUSH;
2281 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2282 PL_multiline = (i != 0);
2285 SvREFCNT_dec(PL_rs);
2286 PL_rs = newSVsv(sv);
2290 SvREFCNT_dec(PL_ors_sv);
2291 if (SvOK(sv) || SvGMAGICAL(sv)) {
2292 PL_ors_sv = newSVsv(sv);
2300 SvREFCNT_dec(PL_ofs_sv);
2301 if (SvOK(sv) || SvGMAGICAL(sv)) {
2302 PL_ofs_sv = newSVsv(sv);
2311 PL_ofmt = savesvpv(sv);
2314 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2317 #ifdef COMPLEX_STATUS
2318 if (PL_localizing == 2) {
2319 PL_statusvalue = LvTARGOFF(sv);
2320 PL_statusvalue_vms = LvTARGLEN(sv);
2324 #ifdef VMSISH_STATUS
2326 STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
2329 STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2334 # define PERL_VMS_BANG vaxc$errno
2336 # define PERL_VMS_BANG 0
2338 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2339 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2343 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2344 if (PL_delaymagic) {
2345 PL_delaymagic |= DM_RUID;
2346 break; /* don't do magic till later */
2349 (void)setruid((Uid_t)PL_uid);
2352 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2354 #ifdef HAS_SETRESUID
2355 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2357 if (PL_uid == PL_euid) { /* special case $< = $> */
2359 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2360 if (PL_uid != 0 && PerlProc_getuid() == 0)
2361 (void)PerlProc_setuid(0);
2363 (void)PerlProc_setuid(PL_uid);
2365 PL_uid = PerlProc_getuid();
2366 Perl_croak(aTHX_ "setruid() not implemented");
2371 PL_uid = PerlProc_getuid();
2372 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2375 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2376 if (PL_delaymagic) {
2377 PL_delaymagic |= DM_EUID;
2378 break; /* don't do magic till later */
2381 (void)seteuid((Uid_t)PL_euid);
2384 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2386 #ifdef HAS_SETRESUID
2387 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2389 if (PL_euid == PL_uid) /* special case $> = $< */
2390 PerlProc_setuid(PL_euid);
2392 PL_euid = PerlProc_geteuid();
2393 Perl_croak(aTHX_ "seteuid() not implemented");
2398 PL_euid = PerlProc_geteuid();
2399 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2402 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2403 if (PL_delaymagic) {
2404 PL_delaymagic |= DM_RGID;
2405 break; /* don't do magic till later */
2408 (void)setrgid((Gid_t)PL_gid);
2411 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2413 #ifdef HAS_SETRESGID
2414 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2416 if (PL_gid == PL_egid) /* special case $( = $) */
2417 (void)PerlProc_setgid(PL_gid);
2419 PL_gid = PerlProc_getgid();
2420 Perl_croak(aTHX_ "setrgid() not implemented");
2425 PL_gid = PerlProc_getgid();
2426 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2429 #ifdef HAS_SETGROUPS
2431 const char *p = SvPV_const(sv, len);
2432 Groups_t *gary = NULL;
2437 for (i = 0; i < NGROUPS; ++i) {
2438 while (*p && !isSPACE(*p))
2445 Newx(gary, i + 1, Groups_t);
2447 Renew(gary, i + 1, Groups_t);
2451 (void)setgroups(i, gary);
2455 #else /* HAS_SETGROUPS */
2456 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2457 #endif /* HAS_SETGROUPS */
2458 if (PL_delaymagic) {
2459 PL_delaymagic |= DM_EGID;
2460 break; /* don't do magic till later */
2463 (void)setegid((Gid_t)PL_egid);
2466 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2468 #ifdef HAS_SETRESGID
2469 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2471 if (PL_egid == PL_gid) /* special case $) = $( */
2472 (void)PerlProc_setgid(PL_egid);
2474 PL_egid = PerlProc_getegid();
2475 Perl_croak(aTHX_ "setegid() not implemented");
2480 PL_egid = PerlProc_getegid();
2481 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2484 PL_chopset = SvPV_force(sv,len);
2486 #ifndef MACOS_TRADITIONAL
2488 LOCK_DOLLARZERO_MUTEX;
2489 #ifdef HAS_SETPROCTITLE
2490 /* The BSDs don't show the argv[] in ps(1) output, they
2491 * show a string from the process struct and provide
2492 * the setproctitle() routine to manipulate that. */
2494 s = SvPV_const(sv, len);
2495 # if __FreeBSD_version > 410001
2496 /* The leading "-" removes the "perl: " prefix,
2497 * but not the "(perl) suffix from the ps(1)
2498 * output, because that's what ps(1) shows if the
2499 * argv[] is modified. */
2500 setproctitle("-%s", s);
2501 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2502 /* This doesn't really work if you assume that
2503 * $0 = 'foobar'; will wipe out 'perl' from the $0
2504 * because in ps(1) output the result will be like
2505 * sprintf("perl: %s (perl)", s)
2506 * I guess this is a security feature:
2507 * one (a user process) cannot get rid of the original name.
2509 setproctitle("%s", s);
2513 #if defined(__hpux) && defined(PSTAT_SETCMD)
2516 s = SvPV_const(sv, len);
2517 un.pst_command = (char *)s;
2518 pstat(PSTAT_SETCMD, un, len, 0, 0);
2521 /* PL_origalen is set in perl_parse(). */
2522 s = SvPV_force(sv,len);
2523 if (len >= (STRLEN)PL_origalen) {
2524 /* Longer than original, will be truncated. */
2525 Copy(s, PL_origargv[0], PL_origalen, char);
2526 PL_origargv[0][PL_origalen - 1] = 0;
2529 /* Shorter than original, will be padded. */
2530 Copy(s, PL_origargv[0], len, char);
2531 PL_origargv[0][len] = 0;
2532 memset(PL_origargv[0] + len + 1,
2533 /* Is the space counterintuitive? Yes.
2534 * (You were expecting \0?)
2535 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2538 PL_origalen - len - 1);
2539 for (i = 1; i < PL_origargc; i++)
2542 UNLOCK_DOLLARZERO_MUTEX;
2545 #ifdef USE_5005THREADS
2547 sv_setsv(thr->errsv, sv);
2549 #endif /* USE_5005THREADS */
2554 #ifdef USE_5005THREADS
2556 Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg)
2558 DEBUG_S(PerlIO_printf(Perl_debug_log,
2559 "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n",
2560 PTR2UV(thr), PTR2UV(sv)));
2562 Perl_croak(aTHX_ "panic: magic_mutexfree");
2563 MUTEX_DESTROY(MgMUTEXP(mg));
2564 COND_DESTROY(MgCONDP(mg));
2567 #endif /* USE_5005THREADS */
2570 Perl_whichsig(pTHX_ char *sig)
2572 register const char * const *sigv;
2574 for (sigv = PL_sig_name; *sigv; sigv++)
2575 if (strEQ(sig,*sigv))
2576 return PL_sig_num[sigv - PL_sig_name];
2578 if (strEQ(sig,"CHLD"))
2582 if (strEQ(sig,"CLD"))
2588 #if !defined(PERL_IMPLICIT_CONTEXT)
2589 static SV* PL_sig_sv;
2593 Perl_sighandler(int sig)
2595 #ifdef PERL_GET_SIG_CONTEXT
2596 dTHXa(PERL_GET_SIG_CONTEXT);
2603 SV * const tSv = PL_Sv;
2607 XPV * const tXpv = PL_Xpv;
2609 if (PL_savestack_ix + 15 <= PL_savestack_max)
2611 if (PL_markstack_ptr < PL_markstack_max - 2)
2613 if (PL_retstack_ix < PL_retstack_max - 2)
2615 if (PL_scopestack_ix < PL_scopestack_max - 3)
2618 if (!PL_psig_ptr[sig]) {
2619 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2624 /* Max number of items pushed there is 3*n or 4. We cannot fix
2625 infinity, so we fix 4 (in fact 5): */
2627 PL_savestack_ix += 5; /* Protect save in progress. */
2628 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2631 PL_markstack_ptr++; /* Protect mark. */
2634 PL_retstack[PL_retstack_ix] = NULL;
2637 PL_scopestack_ix += 1;
2638 /* sv_2cv is too complicated, try a simpler variant first: */
2639 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2640 || SvTYPE(cv) != SVt_PVCV) {
2642 cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
2645 if (!cv || !CvROOT(cv)) {
2646 if (ckWARN(WARN_SIGNAL))
2647 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2648 PL_sig_name[sig], (gv ? GvENAME(gv)
2655 if(PL_psig_name[sig]) {
2656 sv = SvREFCNT_inc(PL_psig_name[sig]);
2658 #if !defined(PERL_IMPLICIT_CONTEXT)
2662 sv = sv_newmortal();
2663 sv_setpv(sv,PL_sig_name[sig]);
2666 PUSHSTACKi(PERLSI_SIGNAL);
2671 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2674 if (SvTRUE(ERRSV)) {
2676 #ifdef HAS_SIGPROCMASK
2677 /* Handler "died", for example to get out of a restart-able read().
2678 * Before we re-do that on its behalf re-enable the signal which was
2679 * blocked by the system when we entered.
2683 sigaddset(&set,sig);
2684 sigprocmask(SIG_UNBLOCK, &set, NULL);
2686 /* Not clear if this will work */
2687 (void)rsignal(sig, SIG_IGN);
2688 (void)rsignal(sig, PL_csighandlerp);
2690 #endif /* !PERL_MICRO */
2691 Perl_die(aTHX_ Nullch);
2695 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2701 PL_scopestack_ix -= 1;
2704 PL_op = myop; /* Apparently not needed... */
2706 PL_Sv = tSv; /* Restore global temporaries. */
2713 S_restore_magic(pTHX_ const void *p)
2715 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2716 SV* const sv = mgs->mgs_sv;
2721 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2724 SvFLAGS(sv) |= mgs->mgs_flags;
2727 if (SvGMAGICAL(sv)) {
2728 /* downgrade public flags to private,
2729 and discard any other private flags */
2731 U32 public = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2733 SvFLAGS(sv) &= ~( public | SVp_IOK|SVp_NOK|SVp_POK );
2734 SvFLAGS(sv) |= ( public << PRIVSHIFT );
2739 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2741 /* If we're still on top of the stack, pop us off. (That condition
2742 * will be satisfied if restore_magic was called explicitly, but *not*
2743 * if it's being called via leave_scope.)
2744 * The reason for doing this is that otherwise, things like sv_2cv()
2745 * may leave alloc gunk on the savestack, and some code
2746 * (e.g. sighandler) doesn't expect that...
2748 if (PL_savestack_ix == mgs->mgs_ss_ix)
2750 I32 popval = SSPOPINT;
2751 assert(popval == SAVEt_DESTRUCTOR_X);
2752 PL_savestack_ix -= 2;
2754 assert(popval == SAVEt_ALLOC);
2756 PL_savestack_ix -= popval;
2762 S_unwind_handler_stack(pTHX_ const void *p)
2764 const U32 flags = *(const U32*)p;
2767 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2768 /* cxstack_ix-- Not needed, die already unwound it. */
2769 #if !defined(PERL_IMPLICIT_CONTEXT)
2771 SvREFCNT_dec(PL_sig_sv);
2777 * c-indentation-style: bsd
2779 * indent-tabs-mode: t
2782 * ex: set ts=8 sts=4 sw=4 noet: