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 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
59 Signal_t Perl_csighandler(int sig, ...);
61 Signal_t Perl_csighandler(int sig);
65 /* Missing protos on LynxOS */
66 void setruid(uid_t id);
67 void seteuid(uid_t id);
68 void setrgid(uid_t id);
69 void setegid(uid_t id);
73 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
81 /* MGS is typedef'ed to struct magic_state in perl.h */
84 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
88 assert(SvMAGICAL(sv));
89 /* Turning READONLY off for a copy-on-write scalar (including shared
90 hash keys) is a bad idea. */
92 sv_force_normal_flags(sv, 0);
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)
143 const I32 mgs_ix = SSNEW(sizeof(MGS));
144 const bool was_temp = (bool)SvTEMP(sv);
146 MAGIC *newmg, *head, *cur, *mg;
147 /* guard against sv having being freed midway by holding a private
150 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
151 cause the SV's buffer to get stolen (and maybe other stuff).
154 sv_2mortal(SvREFCNT_inc(sv));
159 save_magic(mgs_ix, sv);
161 /* We must call svt_get(sv, mg) for each valid entry in the linked
162 list of magic. svt_get() may delete the current entry, add new
163 magic to the head of the list, or upgrade the SV. AMS 20010810 */
165 newmg = cur = head = mg = SvMAGIC(sv);
167 const MGVTBL * const vtbl = mg->mg_virtual;
169 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
170 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
172 /* guard against magic having been deleted - eg FETCH calling
177 /* Don't restore the flags for this entry if it was deleted. */
178 if (mg->mg_flags & MGf_GSKIP)
179 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
182 mg = mg->mg_moremagic;
185 /* Have we finished with the new entries we saw? Start again
186 where we left off (unless there are more new entries). */
194 /* Were any new entries added? */
195 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
202 restore_magic(INT2PTR(void *, (IV)mgs_ix));
204 if (SvREFCNT(sv) == 1) {
205 /* We hold the last reference to this SV, which implies that the
206 SV was deleted as a side effect of the routines we called. */
215 Do magic after a value is assigned to the SV. See C<sv_magic>.
221 Perl_mg_set(pTHX_ SV *sv)
224 const I32 mgs_ix = SSNEW(sizeof(MGS));
228 save_magic(mgs_ix, sv);
230 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
231 const MGVTBL* vtbl = mg->mg_virtual;
232 nextmg = mg->mg_moremagic; /* it may delete itself */
233 if (mg->mg_flags & MGf_GSKIP) {
234 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
235 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
237 if (vtbl && vtbl->svt_set)
238 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
241 restore_magic(INT2PTR(void*, (IV)mgs_ix));
246 =for apidoc mg_length
248 Report on the SV's length. See C<sv_magic>.
254 Perl_mg_length(pTHX_ SV *sv)
260 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
261 const MGVTBL * const vtbl = mg->mg_virtual;
262 if (vtbl && vtbl->svt_len) {
263 const I32 mgs_ix = SSNEW(sizeof(MGS));
264 save_magic(mgs_ix, sv);
265 /* omit MGf_GSKIP -- not changed here */
266 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
267 restore_magic(INT2PTR(void*, (IV)mgs_ix));
273 const U8 *s = (U8*)SvPV_const(sv, len);
274 len = Perl_utf8_length(aTHX_ s, s + len);
277 (void)SvPV_const(sv, len);
282 Perl_mg_size(pTHX_ SV *sv)
286 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
287 const MGVTBL* const vtbl = mg->mg_virtual;
288 if (vtbl && vtbl->svt_len) {
289 const I32 mgs_ix = SSNEW(sizeof(MGS));
291 save_magic(mgs_ix, sv);
292 /* omit MGf_GSKIP -- not changed here */
293 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
294 restore_magic(INT2PTR(void*, (IV)mgs_ix));
301 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
305 Perl_croak(aTHX_ "Size magic not implemented");
314 Clear something magical that the SV represents. See C<sv_magic>.
320 Perl_mg_clear(pTHX_ SV *sv)
322 const I32 mgs_ix = SSNEW(sizeof(MGS));
325 save_magic(mgs_ix, sv);
327 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
328 const MGVTBL* const vtbl = mg->mg_virtual;
329 /* omit GSKIP -- never set here */
331 if (vtbl && vtbl->svt_clear)
332 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
335 restore_magic(INT2PTR(void*, (IV)mgs_ix));
342 Finds the magic pointer for type matching the SV. See C<sv_magic>.
348 Perl_mg_find(pTHX_ const SV *sv, int type)
352 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
353 if (mg->mg_type == type)
363 Copies the magic from one SV to another. See C<sv_magic>.
369 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
373 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
374 const MGVTBL* const vtbl = mg->mg_virtual;
375 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
376 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
379 const char type = mg->mg_type;
382 (type == PERL_MAGIC_tied)
384 : (type == PERL_MAGIC_regdata && mg->mg_obj)
387 toLOWER(type), key, klen);
396 =for apidoc mg_localize
398 Copy some of the magic from an existing SV to new localized version of
399 that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
400 doesn't (eg taint, pos).
406 Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
410 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
411 MGVTBL* const vtbl = mg->mg_virtual;
412 switch (mg->mg_type) {
413 /* value magic types: don't copy */
416 case PERL_MAGIC_regex_global:
417 case PERL_MAGIC_nkeys:
418 #ifdef USE_LOCALE_COLLATE
419 case PERL_MAGIC_collxfrm:
422 case PERL_MAGIC_taint:
424 case PERL_MAGIC_vstring:
425 case PERL_MAGIC_utf8:
426 case PERL_MAGIC_substr:
427 case PERL_MAGIC_defelem:
428 case PERL_MAGIC_arylen:
430 case PERL_MAGIC_backref:
431 case PERL_MAGIC_arylen_p:
432 case PERL_MAGIC_rhash:
433 case PERL_MAGIC_symtab:
437 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
438 (void)CALL_FPTR(vtbl->svt_local)(aTHX_ nsv, mg);
440 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
441 mg->mg_ptr, mg->mg_len);
443 /* container types should remain read-only across localization */
444 SvFLAGS(nsv) |= SvREADONLY(sv);
447 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
448 SvFLAGS(nsv) |= SvMAGICAL(sv);
458 Free any magic storage used by the SV. See C<sv_magic>.
464 Perl_mg_free(pTHX_ SV *sv)
468 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
469 const MGVTBL* const vtbl = mg->mg_virtual;
470 moremagic = mg->mg_moremagic;
471 if (vtbl && vtbl->svt_free)
472 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
473 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
474 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
475 Safefree(mg->mg_ptr);
476 else if (mg->mg_len == HEf_SVKEY)
477 SvREFCNT_dec((SV*)mg->mg_ptr);
479 if (mg->mg_flags & MGf_REFCOUNTED)
480 SvREFCNT_dec(mg->mg_obj);
483 SvMAGIC_set(sv, NULL);
490 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
496 register const REGEXP * const rx = PM_GETRE(PL_curpm);
499 ? rx->nparens /* @+ */
500 : rx->lastparen; /* @- */
508 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
512 register const REGEXP * const rx = PM_GETRE(PL_curpm);
514 register const I32 paren = mg->mg_len;
519 if (paren <= (I32)rx->nparens &&
520 (s = rx->startp[paren]) != -1 &&
521 (t = rx->endp[paren]) != -1)
524 if (mg->mg_obj) /* @+ */
529 if (i > 0 && RX_MATCH_UTF8(rx)) {
530 const char * const b = rx->subbeg;
532 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
543 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
545 PERL_UNUSED_ARG(sv); PERL_UNUSED_ARG(mg);
546 Perl_croak(aTHX_ PL_no_modify);
547 NORETURN_FUNCTION_END;
551 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
556 register const REGEXP *rx;
559 switch (*mg->mg_ptr) {
560 case '1': case '2': case '3': case '4':
561 case '5': case '6': case '7': case '8': case '9': case '&':
562 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
564 paren = atoi(mg->mg_ptr); /* $& is in [0] */
566 if (paren <= (I32)rx->nparens &&
567 (s1 = rx->startp[paren]) != -1 &&
568 (t1 = rx->endp[paren]) != -1)
572 if (i > 0 && RX_MATCH_UTF8(rx)) {
573 const char * const s = rx->subbeg + s1;
578 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
582 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
586 if (ckWARN(WARN_UNINITIALIZED))
591 if (ckWARN(WARN_UNINITIALIZED))
596 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
597 paren = rx->lastparen;
602 case '\016': /* ^N */
603 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
604 paren = rx->lastcloseparen;
610 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
611 if (rx->startp[0] != -1) {
622 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
623 if (rx->endp[0] != -1) {
624 i = rx->sublen - rx->endp[0];
635 if (!SvPOK(sv) && SvNIOK(sv)) {
643 #define SvRTRIM(sv) STMT_START { \
644 STRLEN len = SvCUR(sv); \
645 char * const p = SvPVX(sv); \
646 while (len > 0 && isSPACE(p[len-1])) \
648 SvCUR_set(sv, len); \
653 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
657 register char *s = NULL;
660 const char * const remaining = mg->mg_ptr + 1;
661 const char nextchar = *remaining;
663 switch (*mg->mg_ptr) {
664 case '\001': /* ^A */
665 sv_setsv(sv, PL_bodytarget);
667 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
668 if (nextchar == '\0') {
669 sv_setiv(sv, (IV)PL_minus_c);
671 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
672 sv_setiv(sv, (IV)STATUS_NATIVE);
676 case '\004': /* ^D */
677 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
679 case '\005': /* ^E */
680 if (nextchar == '\0') {
681 #ifdef MACOS_TRADITIONAL
685 sv_setnv(sv,(double)gMacPerl_OSErr);
686 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
691 # include <descrip.h>
692 # include <starlet.h>
694 $DESCRIPTOR(msgdsc,msg);
695 sv_setnv(sv,(NV) vaxc$errno);
696 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
697 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
703 if (!(_emx_env & 0x200)) { /* Under DOS */
704 sv_setnv(sv, (NV)errno);
705 sv_setpv(sv, errno ? Strerror(errno) : "");
707 if (errno != errno_isOS2) {
708 const int tmp = _syserrno();
709 if (tmp) /* 2nd call to _syserrno() makes it 0 */
712 sv_setnv(sv, (NV)Perl_rc);
713 sv_setpv(sv, os2error(Perl_rc));
718 DWORD dwErr = GetLastError();
719 sv_setnv(sv, (NV)dwErr);
721 PerlProc_GetOSError(sv, dwErr);
724 sv_setpvn(sv, "", 0);
729 const int saveerrno = errno;
730 sv_setnv(sv, (NV)errno);
731 sv_setpv(sv, errno ? Strerror(errno) : "");
739 SvNOK_on(sv); /* what a wonderful hack! */
741 else if (strEQ(remaining, "NCODING"))
742 sv_setsv(sv, PL_encoding);
744 case '\006': /* ^F */
745 sv_setiv(sv, (IV)PL_maxsysfd);
747 case '\010': /* ^H */
748 sv_setiv(sv, (IV)PL_hints);
750 case '\011': /* ^I */ /* NOT \t in EBCDIC */
752 sv_setpv(sv, PL_inplace);
754 sv_setsv(sv, &PL_sv_undef);
756 case '\017': /* ^O & ^OPEN */
757 if (nextchar == '\0') {
758 sv_setpv(sv, PL_osname);
761 else if (strEQ(remaining, "PEN")) {
762 if (!PL_compiling.cop_io)
763 sv_setsv(sv, &PL_sv_undef);
765 sv_setsv(sv, PL_compiling.cop_io);
769 case '\020': /* ^P */
770 sv_setiv(sv, (IV)PL_perldb);
772 case '\023': /* ^S */
773 if (nextchar == '\0') {
774 if (PL_lex_state != LEX_NOTPARSING)
777 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
782 case '\024': /* ^T */
783 if (nextchar == '\0') {
785 sv_setnv(sv, PL_basetime);
787 sv_setiv(sv, (IV)PL_basetime);
790 else if (strEQ(remaining, "AINT"))
791 sv_setiv(sv, PL_tainting
792 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
795 case '\025': /* $^UNICODE, $^UTF8LOCALE */
796 if (strEQ(remaining, "NICODE"))
797 sv_setuv(sv, (UV) PL_unicode);
798 else if (strEQ(remaining, "TF8LOCALE"))
799 sv_setuv(sv, (UV) PL_utf8locale);
801 case '\027': /* ^W & $^WARNING_BITS */
802 if (nextchar == '\0')
803 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
804 else if (strEQ(remaining, "ARNING_BITS")) {
805 if (PL_compiling.cop_warnings == pWARN_NONE) {
806 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
808 else if (PL_compiling.cop_warnings == pWARN_STD) {
811 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
815 else if (PL_compiling.cop_warnings == pWARN_ALL) {
816 /* Get the bit mask for $warnings::Bits{all}, because
817 * it could have been extended by warnings::register */
819 HV * const bits=get_hv("warnings::Bits", FALSE);
820 if (bits && (bits_all=hv_fetchs(bits, "all", FALSE))) {
821 sv_setsv(sv, *bits_all);
824 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
828 sv_setsv(sv, PL_compiling.cop_warnings);
833 case '1': case '2': case '3': case '4':
834 case '5': case '6': case '7': case '8': case '9': case '&':
835 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
839 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
840 * XXX Does the new way break anything?
842 paren = atoi(mg->mg_ptr); /* $& is in [0] */
844 if (paren <= (I32)rx->nparens &&
845 (s1 = rx->startp[paren]) != -1 &&
846 (t1 = rx->endp[paren]) != -1)
855 const int oldtainted = PL_tainted;
858 PL_tainted = oldtainted;
859 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
864 if (RX_MATCH_TAINTED(rx)) {
865 MAGIC* const mg = SvMAGIC(sv);
868 SvMAGIC_set(sv, mg->mg_moremagic);
870 if ((mgt = SvMAGIC(sv))) {
871 mg->mg_moremagic = mgt;
881 sv_setsv(sv,&PL_sv_undef);
884 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
885 paren = rx->lastparen;
889 sv_setsv(sv,&PL_sv_undef);
891 case '\016': /* ^N */
892 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
893 paren = rx->lastcloseparen;
897 sv_setsv(sv,&PL_sv_undef);
900 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
901 if ((s = rx->subbeg) && rx->startp[0] != -1) {
906 sv_setsv(sv,&PL_sv_undef);
909 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
910 if (rx->subbeg && rx->endp[0] != -1) {
911 s = rx->subbeg + rx->endp[0];
912 i = rx->sublen - rx->endp[0];
916 sv_setsv(sv,&PL_sv_undef);
919 if (GvIO(PL_last_in_gv)) {
920 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
925 sv_setiv(sv, (IV)STATUS_CURRENT);
926 #ifdef COMPLEX_STATUS
927 LvTARGOFF(sv) = PL_statusvalue;
928 LvTARGLEN(sv) = PL_statusvalue_vms;
933 if (GvIOp(PL_defoutgv))
934 s = IoTOP_NAME(GvIOp(PL_defoutgv));
938 sv_setpv(sv,GvENAME(PL_defoutgv));
943 if (GvIOp(PL_defoutgv))
944 s = IoFMT_NAME(GvIOp(PL_defoutgv));
946 s = GvENAME(PL_defoutgv);
950 if (GvIOp(PL_defoutgv))
951 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
954 if (GvIOp(PL_defoutgv))
955 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
958 if (GvIOp(PL_defoutgv))
959 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
966 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
969 if (GvIOp(PL_defoutgv))
970 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
976 sv_copypv(sv, PL_ors_sv);
980 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
981 sv_setpv(sv, errno ? Strerror(errno) : "");
984 const int saveerrno = errno;
985 sv_setnv(sv, (NV)errno);
987 if (errno == errno_isOS2 || errno == errno_isOS2_set)
988 sv_setpv(sv, os2error(Perl_rc));
991 sv_setpv(sv, errno ? Strerror(errno) : "");
996 SvNOK_on(sv); /* what a wonderful hack! */
999 sv_setiv(sv, (IV)PL_uid);
1002 sv_setiv(sv, (IV)PL_euid);
1005 sv_setiv(sv, (IV)PL_gid);
1008 sv_setiv(sv, (IV)PL_egid);
1010 #ifdef HAS_GETGROUPS
1012 Groups_t *gary = NULL;
1013 I32 i, num_groups = getgroups(0, gary);
1014 Newx(gary, num_groups, Groups_t);
1015 num_groups = getgroups(num_groups, gary);
1016 for (i = 0; i < num_groups; i++)
1017 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1020 (void)SvIOK_on(sv); /* what a wonderful hack! */
1023 #ifndef MACOS_TRADITIONAL
1032 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1034 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1036 if (uf && uf->uf_val)
1037 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1042 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1046 const char *s = SvPV_const(sv,len);
1047 const char * const ptr = MgPV_const(mg,klen);
1050 #ifdef DYNAMIC_ENV_FETCH
1051 /* We just undefd an environment var. Is a replacement */
1052 /* waiting in the wings? */
1054 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1056 s = SvPV_const(*valp, len);
1060 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1061 /* And you'll never guess what the dog had */
1062 /* in its mouth... */
1064 MgTAINTEDDIR_off(mg);
1066 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1067 char pathbuf[256], eltbuf[256], *cp, *elt;
1071 strncpy(eltbuf, s, 255);
1074 do { /* DCL$PATH may be a search list */
1075 while (1) { /* as may dev portion of any element */
1076 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1077 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1078 cando_by_name(S_IWUSR,0,elt) ) {
1079 MgTAINTEDDIR_on(mg);
1083 if ((cp = strchr(elt, ':')) != Nullch)
1085 if (my_trnlnm(elt, eltbuf, j++))
1091 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1094 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1095 const char * const strend = s + len;
1097 while (s < strend) {
1101 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1102 s, strend, ':', &i);
1104 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1106 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1107 MgTAINTEDDIR_on(mg);
1113 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1119 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1121 PERL_UNUSED_ARG(sv);
1122 my_setenv(MgPV_nolen_const(mg),Nullch);
1127 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1130 PERL_UNUSED_ARG(mg);
1132 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1134 if (PL_localizing) {
1137 hv_iterinit((HV*)sv);
1138 while ((entry = hv_iternext((HV*)sv))) {
1140 my_setenv(hv_iterkey(entry, &keylen),
1141 SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1149 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1152 PERL_UNUSED_ARG(sv);
1153 PERL_UNUSED_ARG(mg);
1155 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1163 #ifdef HAS_SIGPROCMASK
1165 restore_sigmask(pTHX_ SV *save_sv)
1167 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1168 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1172 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1175 /* Are we fetching a signal entry? */
1176 const I32 i = whichsig(MgPV_nolen_const(mg));
1179 sv_setsv(sv,PL_psig_ptr[i]);
1181 Sighandler_t sigstate;
1182 sigstate = rsignal_state(i);
1183 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1184 if (PL_sig_handlers_initted && PL_sig_ignoring[i]) sigstate = SIG_IGN;
1186 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1187 if (PL_sig_handlers_initted && PL_sig_defaulting[i]) sigstate = SIG_DFL;
1189 /* cache state so we don't fetch it again */
1190 if(sigstate == (Sighandler_t) SIG_IGN)
1191 sv_setpv(sv,"IGNORE");
1193 sv_setsv(sv,&PL_sv_undef);
1194 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1201 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1203 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1204 * refactoring might be in order.
1207 register const char * const s = MgPV_nolen_const(mg);
1208 PERL_UNUSED_ARG(sv);
1211 if (strEQ(s,"__DIE__"))
1213 else if (strEQ(s,"__WARN__"))
1216 Perl_croak(aTHX_ "No such hook: %s", s);
1218 SV * const to_dec = *svp;
1220 SvREFCNT_dec(to_dec);
1224 /* Are we clearing a signal entry? */
1225 const I32 i = whichsig(s);
1227 #ifdef HAS_SIGPROCMASK
1230 /* Avoid having the signal arrive at a bad time, if possible. */
1233 sigprocmask(SIG_BLOCK, &set, &save);
1235 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1236 SAVEFREESV(save_sv);
1237 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1240 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1241 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1243 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1244 PL_sig_defaulting[i] = 1;
1245 (void)rsignal(i, PL_csighandlerp);
1247 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1249 if(PL_psig_name[i]) {
1250 SvREFCNT_dec(PL_psig_name[i]);
1253 if(PL_psig_ptr[i]) {
1254 SV * const to_dec=PL_psig_ptr[i];
1257 SvREFCNT_dec(to_dec);
1267 S_raise_signal(pTHX_ int sig)
1270 /* Set a flag to say this signal is pending */
1271 PL_psig_pend[sig]++;
1272 /* And one to say _a_ signal is pending */
1277 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1278 Perl_csighandler(int sig, ...)
1280 Perl_csighandler(int sig)
1283 #ifdef PERL_GET_SIG_CONTEXT
1284 dTHXa(PERL_GET_SIG_CONTEXT);
1288 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1289 (void) rsignal(sig, PL_csighandlerp);
1290 if (PL_sig_ignoring[sig]) return;
1292 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1293 if (PL_sig_defaulting[sig])
1294 #ifdef KILL_BY_SIGPRC
1295 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1300 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1301 /* Call the perl level handler now--
1302 * with risk we may be in malloc() etc. */
1303 (*PL_sighandlerp)(sig);
1305 S_raise_signal(aTHX_ sig);
1308 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1310 Perl_csighandler_init(void)
1313 if (PL_sig_handlers_initted) return;
1315 for (sig = 1; sig < SIG_SIZE; sig++) {
1316 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1318 PL_sig_defaulting[sig] = 1;
1319 (void) rsignal(sig, PL_csighandlerp);
1321 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1322 PL_sig_ignoring[sig] = 0;
1325 PL_sig_handlers_initted = 1;
1330 Perl_despatch_signals(pTHX)
1335 for (sig = 1; sig < SIG_SIZE; sig++) {
1336 if (PL_psig_pend[sig]) {
1337 PERL_BLOCKSIG_ADD(set, sig);
1338 PL_psig_pend[sig] = 0;
1339 PERL_BLOCKSIG_BLOCK(set);
1340 (*PL_sighandlerp)(sig);
1341 PERL_BLOCKSIG_UNBLOCK(set);
1347 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1352 /* Need to be careful with SvREFCNT_dec(), because that can have side
1353 * effects (due to closures). We must make sure that the new disposition
1354 * is in place before it is called.
1358 #ifdef HAS_SIGPROCMASK
1363 register const char *s = MgPV_const(mg,len);
1365 if (strEQ(s,"__DIE__"))
1367 else if (strEQ(s,"__WARN__"))
1370 Perl_croak(aTHX_ "No such hook: %s", s);
1378 i = whichsig(s); /* ...no, a brick */
1380 if (ckWARN(WARN_SIGNAL))
1381 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1384 #ifdef HAS_SIGPROCMASK
1385 /* Avoid having the signal arrive at a bad time, if possible. */
1388 sigprocmask(SIG_BLOCK, &set, &save);
1390 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1391 SAVEFREESV(save_sv);
1392 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1395 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1396 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1398 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1399 PL_sig_ignoring[i] = 0;
1401 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1402 PL_sig_defaulting[i] = 0;
1404 SvREFCNT_dec(PL_psig_name[i]);
1405 to_dec = PL_psig_ptr[i];
1406 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1407 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1408 PL_psig_name[i] = newSVpvn(s, len);
1409 SvREADONLY_on(PL_psig_name[i]);
1411 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1413 (void)rsignal(i, PL_csighandlerp);
1414 #ifdef HAS_SIGPROCMASK
1419 *svp = SvREFCNT_inc(sv);
1421 SvREFCNT_dec(to_dec);
1424 s = SvPV_force(sv,len);
1425 if (strEQ(s,"IGNORE")) {
1427 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1428 PL_sig_ignoring[i] = 1;
1429 (void)rsignal(i, PL_csighandlerp);
1431 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1435 else if (strEQ(s,"DEFAULT") || !*s) {
1437 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1439 PL_sig_defaulting[i] = 1;
1440 (void)rsignal(i, PL_csighandlerp);
1443 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1448 * We should warn if HINT_STRICT_REFS, but without
1449 * access to a known hint bit in a known OP, we can't
1450 * tell whether HINT_STRICT_REFS is in force or not.
1452 if (!strchr(s,':') && !strchr(s,'\''))
1453 Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"));
1455 (void)rsignal(i, PL_csighandlerp);
1457 *svp = SvREFCNT_inc(sv);
1459 #ifdef HAS_SIGPROCMASK
1464 SvREFCNT_dec(to_dec);
1467 #endif /* !PERL_MICRO */
1470 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1473 PERL_UNUSED_ARG(sv);
1474 PERL_UNUSED_ARG(mg);
1475 PL_sub_generation++;
1480 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1483 PERL_UNUSED_ARG(sv);
1484 PERL_UNUSED_ARG(mg);
1485 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1486 PL_amagic_generation++;
1492 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1494 HV * const hv = (HV*)LvTARG(sv);
1496 PERL_UNUSED_ARG(mg);
1499 (void) hv_iterinit(hv);
1500 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1503 while (hv_iternext(hv))
1508 sv_setiv(sv, (IV)i);
1513 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1515 PERL_UNUSED_ARG(mg);
1517 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1522 /* caller is responsible for stack switching/cleanup */
1524 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1531 PUSHs(SvTIED_obj(sv, mg));
1534 if (mg->mg_len >= 0)
1535 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1536 else if (mg->mg_len == HEf_SVKEY)
1537 PUSHs((SV*)mg->mg_ptr);
1539 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1540 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1548 return call_method(meth, flags);
1552 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1558 PUSHSTACKi(PERLSI_MAGIC);
1560 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1561 sv_setsv(sv, *PL_stack_sp--);
1571 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1574 mg->mg_flags |= MGf_GSKIP;
1575 magic_methpack(sv,mg,"FETCH");
1580 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1584 PUSHSTACKi(PERLSI_MAGIC);
1585 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1592 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1594 return magic_methpack(sv,mg,"DELETE");
1599 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1606 PUSHSTACKi(PERLSI_MAGIC);
1607 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1608 sv = *PL_stack_sp--;
1609 retval = (U32) SvIV(sv)-1;
1618 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1623 PUSHSTACKi(PERLSI_MAGIC);
1625 XPUSHs(SvTIED_obj(sv, mg));
1627 call_method("CLEAR", G_SCALAR|G_DISCARD);
1635 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1638 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1642 PUSHSTACKi(PERLSI_MAGIC);
1645 PUSHs(SvTIED_obj(sv, mg));
1650 if (call_method(meth, G_SCALAR))
1651 sv_setsv(key, *PL_stack_sp--);
1660 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1662 return magic_methpack(sv,mg,"EXISTS");
1666 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1669 SV *retval = &PL_sv_undef;
1670 SV * const tied = SvTIED_obj((SV*)hv, mg);
1671 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1673 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1675 if (HvEITER_get(hv))
1676 /* we are in an iteration so the hash cannot be empty */
1678 /* no xhv_eiter so now use FIRSTKEY */
1679 key = sv_newmortal();
1680 magic_nextpack((SV*)hv, mg, key);
1681 HvEITER_set(hv, NULL); /* need to reset iterator */
1682 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1685 /* there is a SCALAR method that we can call */
1687 PUSHSTACKi(PERLSI_MAGIC);
1693 if (call_method("SCALAR", G_SCALAR))
1694 retval = *PL_stack_sp--;
1701 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1704 GV * const gv = PL_DBline;
1705 const I32 i = SvTRUE(sv);
1706 SV ** const svp = av_fetch(GvAV(gv),
1707 atoi(MgPV_nolen_const(mg)), FALSE);
1708 if (svp && SvIOKp(*svp)) {
1709 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1711 /* set or clear breakpoint in the relevant control op */
1713 o->op_flags |= OPf_SPECIAL;
1715 o->op_flags &= ~OPf_SPECIAL;
1722 Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1725 const AV * const obj = (AV*)mg->mg_obj;
1727 sv_setiv(sv, AvFILL(obj) + PL_curcop->cop_arybase);
1735 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1738 AV * const obj = (AV*)mg->mg_obj;
1740 av_fill(obj, SvIV(sv) - PL_curcop->cop_arybase);
1742 if (ckWARN(WARN_MISC))
1743 Perl_warner(aTHX_ packWARN(WARN_MISC),
1744 "Attempt to set length of freed array");
1750 Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1753 PERL_UNUSED_ARG(sv);
1754 /* during global destruction, mg_obj may already have been freed */
1755 if (PL_in_clean_all)
1758 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1761 /* arylen scalar holds a pointer back to the array, but doesn't own a
1762 reference. Hence the we (the array) are about to go away with it
1763 still pointing at us. Clear its pointer, else it would be pointing
1764 at free memory. See the comment in sv_magic about reference loops,
1765 and why it can't own a reference to us. */
1772 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1775 SV* const lsv = LvTARG(sv);
1777 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1778 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1779 if (mg && mg->mg_len >= 0) {
1782 sv_pos_b2u(lsv, &i);
1783 sv_setiv(sv, i + PL_curcop->cop_arybase);
1792 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1795 SV* const lsv = LvTARG(sv);
1802 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1803 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1807 sv_magic(lsv, NULL, PERL_MAGIC_regex_global, NULL, 0);
1808 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1810 else if (!SvOK(sv)) {
1814 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1816 pos = SvIV(sv) - PL_curcop->cop_arybase;
1819 ulen = sv_len_utf8(lsv);
1829 else if (pos > (SSize_t)len)
1834 sv_pos_u2b(lsv, &p, 0);
1839 mg->mg_flags &= ~MGf_MINMATCH;
1845 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1847 PERL_UNUSED_ARG(mg);
1848 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1850 gv_efullname3(sv,((GV*)sv), "*");
1854 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
1859 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1862 PERL_UNUSED_ARG(mg);
1866 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
1871 GvGP(sv) = gp_ref(GvGP(gv));
1876 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1879 SV * const lsv = LvTARG(sv);
1880 const char * const tmps = SvPV_const(lsv,len);
1881 I32 offs = LvTARGOFF(sv);
1882 I32 rem = LvTARGLEN(sv);
1883 PERL_UNUSED_ARG(mg);
1886 sv_pos_u2b(lsv, &offs, &rem);
1887 if (offs > (I32)len)
1889 if (rem + offs > (I32)len)
1891 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1898 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1902 const char *tmps = SvPV_const(sv, len);
1903 SV * const lsv = LvTARG(sv);
1904 I32 lvoff = LvTARGOFF(sv);
1905 I32 lvlen = LvTARGLEN(sv);
1906 PERL_UNUSED_ARG(mg);
1909 sv_utf8_upgrade(lsv);
1910 sv_pos_u2b(lsv, &lvoff, &lvlen);
1911 sv_insert(lsv, lvoff, lvlen, tmps, len);
1912 LvTARGLEN(sv) = sv_len_utf8(sv);
1915 else if (lsv && SvUTF8(lsv)) {
1916 sv_pos_u2b(lsv, &lvoff, &lvlen);
1917 LvTARGLEN(sv) = len;
1918 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1919 sv_insert(lsv, lvoff, lvlen, tmps, len);
1923 sv_insert(lsv, lvoff, lvlen, tmps, len);
1924 LvTARGLEN(sv) = len;
1932 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1935 PERL_UNUSED_ARG(sv);
1936 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
1941 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1944 PERL_UNUSED_ARG(sv);
1945 /* update taint status unless we're restoring at scope exit */
1946 if (PL_localizing != 2) {
1956 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1958 SV * const lsv = LvTARG(sv);
1959 PERL_UNUSED_ARG(mg);
1962 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1970 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1972 PERL_UNUSED_ARG(mg);
1973 do_vecset(sv); /* XXX slurp this routine */
1978 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1982 if (LvTARGLEN(sv)) {
1984 SV * const ahv = LvTARG(sv);
1985 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1990 AV* const av = (AV*)LvTARG(sv);
1991 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1992 targ = AvARRAY(av)[LvTARGOFF(sv)];
1994 if (targ && targ != &PL_sv_undef) {
1995 /* somebody else defined it for us */
1996 SvREFCNT_dec(LvTARG(sv));
1997 LvTARG(sv) = SvREFCNT_inc(targ);
1999 SvREFCNT_dec(mg->mg_obj);
2000 mg->mg_obj = Nullsv;
2001 mg->mg_flags &= ~MGf_REFCOUNTED;
2006 sv_setsv(sv, targ ? targ : &PL_sv_undef);
2011 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2013 PERL_UNUSED_ARG(mg);
2017 sv_setsv(LvTARG(sv), sv);
2018 SvSETMAGIC(LvTARG(sv));
2024 Perl_vivify_defelem(pTHX_ SV *sv)
2030 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2033 SV * const ahv = LvTARG(sv);
2034 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
2037 if (!value || value == &PL_sv_undef)
2038 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
2041 AV* const av = (AV*)LvTARG(sv);
2042 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2043 LvTARG(sv) = Nullsv; /* array can't be extended */
2045 SV** const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2046 if (!svp || (value = *svp) == &PL_sv_undef)
2047 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2050 (void)SvREFCNT_inc(value);
2051 SvREFCNT_dec(LvTARG(sv));
2054 SvREFCNT_dec(mg->mg_obj);
2055 mg->mg_obj = Nullsv;
2056 mg->mg_flags &= ~MGf_REFCOUNTED;
2060 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2062 return Perl_sv_kill_backrefs(aTHX_ sv, (AV*)mg->mg_obj);
2066 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2074 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2076 PERL_UNUSED_ARG(mg);
2077 sv_unmagic(sv, PERL_MAGIC_bm);
2083 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2085 PERL_UNUSED_ARG(mg);
2086 sv_unmagic(sv, PERL_MAGIC_fm);
2092 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2094 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2096 if (uf && uf->uf_set)
2097 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2102 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2104 PERL_UNUSED_ARG(mg);
2105 sv_unmagic(sv, PERL_MAGIC_qr);
2110 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2113 regexp * const re = (regexp *)mg->mg_obj;
2114 PERL_UNUSED_ARG(sv);
2120 #ifdef USE_LOCALE_COLLATE
2122 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2125 * RenE<eacute> Descartes said "I think not."
2126 * and vanished with a faint plop.
2128 PERL_UNUSED_ARG(sv);
2130 Safefree(mg->mg_ptr);
2136 #endif /* USE_LOCALE_COLLATE */
2138 /* Just clear the UTF-8 cache data. */
2140 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2142 PERL_UNUSED_ARG(sv);
2143 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2145 mg->mg_len = -1; /* The mg_len holds the len cache. */
2150 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2153 register const char *s;
2156 switch (*mg->mg_ptr) {
2157 case '\001': /* ^A */
2158 sv_setsv(PL_bodytarget, sv);
2160 case '\003': /* ^C */
2161 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2164 case '\004': /* ^D */
2166 s = SvPV_nolen_const(sv);
2167 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2168 DEBUG_x(dump_all());
2170 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2173 case '\005': /* ^E */
2174 if (*(mg->mg_ptr+1) == '\0') {
2175 #ifdef MACOS_TRADITIONAL
2176 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2179 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2182 SetLastError( SvIV(sv) );
2185 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2187 /* will anyone ever use this? */
2188 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2194 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2196 SvREFCNT_dec(PL_encoding);
2197 if (SvOK(sv) || SvGMAGICAL(sv)) {
2198 PL_encoding = newSVsv(sv);
2201 PL_encoding = Nullsv;
2205 case '\006': /* ^F */
2206 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2208 case '\010': /* ^H */
2209 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2211 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2212 Safefree(PL_inplace);
2213 PL_inplace = SvOK(sv) ? savesvpv(sv) : Nullch;
2215 case '\017': /* ^O */
2216 if (*(mg->mg_ptr+1) == '\0') {
2217 Safefree(PL_osname);
2220 TAINT_PROPER("assigning to $^O");
2221 PL_osname = savesvpv(sv);
2224 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2225 if (!PL_compiling.cop_io)
2226 PL_compiling.cop_io = newSVsv(sv);
2228 sv_setsv(PL_compiling.cop_io,sv);
2231 case '\020': /* ^P */
2232 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2233 if (PL_perldb && !PL_DBsingle)
2236 case '\024': /* ^T */
2238 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2240 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2243 case '\027': /* ^W & $^WARNING_BITS */
2244 if (*(mg->mg_ptr+1) == '\0') {
2245 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2246 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2247 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2248 | (i ? G_WARN_ON : G_WARN_OFF) ;
2251 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2252 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2253 if (!SvPOK(sv) && PL_localizing) {
2254 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2255 PL_compiling.cop_warnings = pWARN_NONE;
2260 int accumulate = 0 ;
2261 int any_fatals = 0 ;
2262 const char * const ptr = SvPV_const(sv, len) ;
2263 for (i = 0 ; i < len ; ++i) {
2264 accumulate |= ptr[i] ;
2265 any_fatals |= (ptr[i] & 0xAA) ;
2268 PL_compiling.cop_warnings = pWARN_NONE;
2269 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2270 PL_compiling.cop_warnings = pWARN_ALL;
2271 PL_dowarn |= G_WARN_ONCE ;
2274 if (specialWARN(PL_compiling.cop_warnings))
2275 PL_compiling.cop_warnings = newSVsv(sv) ;
2277 sv_setsv(PL_compiling.cop_warnings, sv);
2278 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2279 PL_dowarn |= G_WARN_ONCE ;
2287 if (PL_localizing) {
2288 if (PL_localizing == 1)
2289 SAVESPTR(PL_last_in_gv);
2291 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2292 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2295 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2296 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2297 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2300 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2301 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2302 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2305 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2308 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2309 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2310 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2313 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2317 IO * const io = GvIOp(PL_defoutgv);
2320 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2321 IoFLAGS(io) &= ~IOf_FLUSH;
2323 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2324 PerlIO *ofp = IoOFP(io);
2326 (void)PerlIO_flush(ofp);
2327 IoFLAGS(io) |= IOf_FLUSH;
2333 SvREFCNT_dec(PL_rs);
2334 PL_rs = newSVsv(sv);
2338 SvREFCNT_dec(PL_ors_sv);
2339 if (SvOK(sv) || SvGMAGICAL(sv)) {
2340 PL_ors_sv = newSVsv(sv);
2348 SvREFCNT_dec(PL_ofs_sv);
2349 if (SvOK(sv) || SvGMAGICAL(sv)) {
2350 PL_ofs_sv = newSVsv(sv);
2357 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2360 #ifdef COMPLEX_STATUS
2361 if (PL_localizing == 2) {
2362 PL_statusvalue = LvTARGOFF(sv);
2363 PL_statusvalue_vms = LvTARGLEN(sv);
2367 #ifdef VMSISH_STATUS
2369 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2372 STATUS_UNIX_EXIT_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2377 # define PERL_VMS_BANG vaxc$errno
2379 # define PERL_VMS_BANG 0
2381 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2382 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2386 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2387 if (PL_delaymagic) {
2388 PL_delaymagic |= DM_RUID;
2389 break; /* don't do magic till later */
2392 (void)setruid((Uid_t)PL_uid);
2395 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2397 #ifdef HAS_SETRESUID
2398 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2400 if (PL_uid == PL_euid) { /* special case $< = $> */
2402 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2403 if (PL_uid != 0 && PerlProc_getuid() == 0)
2404 (void)PerlProc_setuid(0);
2406 (void)PerlProc_setuid(PL_uid);
2408 PL_uid = PerlProc_getuid();
2409 Perl_croak(aTHX_ "setruid() not implemented");
2414 PL_uid = PerlProc_getuid();
2415 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2418 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2419 if (PL_delaymagic) {
2420 PL_delaymagic |= DM_EUID;
2421 break; /* don't do magic till later */
2424 (void)seteuid((Uid_t)PL_euid);
2427 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2429 #ifdef HAS_SETRESUID
2430 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2432 if (PL_euid == PL_uid) /* special case $> = $< */
2433 PerlProc_setuid(PL_euid);
2435 PL_euid = PerlProc_geteuid();
2436 Perl_croak(aTHX_ "seteuid() not implemented");
2441 PL_euid = PerlProc_geteuid();
2442 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2445 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2446 if (PL_delaymagic) {
2447 PL_delaymagic |= DM_RGID;
2448 break; /* don't do magic till later */
2451 (void)setrgid((Gid_t)PL_gid);
2454 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2456 #ifdef HAS_SETRESGID
2457 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2459 if (PL_gid == PL_egid) /* special case $( = $) */
2460 (void)PerlProc_setgid(PL_gid);
2462 PL_gid = PerlProc_getgid();
2463 Perl_croak(aTHX_ "setrgid() not implemented");
2468 PL_gid = PerlProc_getgid();
2469 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2472 #ifdef HAS_SETGROUPS
2474 const char *p = SvPV_const(sv, len);
2475 Groups_t *gary = NULL;
2480 for (i = 0; i < NGROUPS; ++i) {
2481 while (*p && !isSPACE(*p))
2488 Newx(gary, i + 1, Groups_t);
2490 Renew(gary, i + 1, Groups_t);
2494 (void)setgroups(i, gary);
2498 #else /* HAS_SETGROUPS */
2499 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2500 #endif /* HAS_SETGROUPS */
2501 if (PL_delaymagic) {
2502 PL_delaymagic |= DM_EGID;
2503 break; /* don't do magic till later */
2506 (void)setegid((Gid_t)PL_egid);
2509 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2511 #ifdef HAS_SETRESGID
2512 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2514 if (PL_egid == PL_gid) /* special case $) = $( */
2515 (void)PerlProc_setgid(PL_egid);
2517 PL_egid = PerlProc_getegid();
2518 Perl_croak(aTHX_ "setegid() not implemented");
2523 PL_egid = PerlProc_getegid();
2524 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2527 PL_chopset = SvPV_force(sv,len);
2529 #ifndef MACOS_TRADITIONAL
2531 LOCK_DOLLARZERO_MUTEX;
2532 #ifdef HAS_SETPROCTITLE
2533 /* The BSDs don't show the argv[] in ps(1) output, they
2534 * show a string from the process struct and provide
2535 * the setproctitle() routine to manipulate that. */
2536 if (PL_origalen != 1) {
2537 s = SvPV_const(sv, len);
2538 # if __FreeBSD_version > 410001
2539 /* The leading "-" removes the "perl: " prefix,
2540 * but not the "(perl) suffix from the ps(1)
2541 * output, because that's what ps(1) shows if the
2542 * argv[] is modified. */
2543 setproctitle("-%s", s);
2544 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2545 /* This doesn't really work if you assume that
2546 * $0 = 'foobar'; will wipe out 'perl' from the $0
2547 * because in ps(1) output the result will be like
2548 * sprintf("perl: %s (perl)", s)
2549 * I guess this is a security feature:
2550 * one (a user process) cannot get rid of the original name.
2552 setproctitle("%s", s);
2556 #if defined(__hpux) && defined(PSTAT_SETCMD)
2557 if (PL_origalen != 1) {
2559 s = SvPV_const(sv, len);
2560 un.pst_command = (char *)s;
2561 pstat(PSTAT_SETCMD, un, len, 0, 0);
2564 if (PL_origalen > 1) {
2565 /* PL_origalen is set in perl_parse(). */
2566 s = SvPV_force(sv,len);
2567 if (len >= (STRLEN)PL_origalen-1) {
2568 /* Longer than original, will be truncated. We assume that
2569 * PL_origalen bytes are available. */
2570 Copy(s, PL_origargv[0], PL_origalen-1, char);
2573 /* Shorter than original, will be padded. */
2574 Copy(s, PL_origargv[0], len, char);
2575 PL_origargv[0][len] = 0;
2576 memset(PL_origargv[0] + len + 1,
2577 /* Is the space counterintuitive? Yes.
2578 * (You were expecting \0?)
2579 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2582 PL_origalen - len - 1);
2584 PL_origargv[0][PL_origalen-1] = 0;
2585 for (i = 1; i < PL_origargc; i++)
2588 UNLOCK_DOLLARZERO_MUTEX;
2596 Perl_whichsig(pTHX_ const char *sig)
2598 register char* const* sigv;
2600 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
2601 if (strEQ(sig,*sigv))
2602 return PL_sig_num[sigv - (char* const*)PL_sig_name];
2604 if (strEQ(sig,"CHLD"))
2608 if (strEQ(sig,"CLD"))
2615 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2616 Perl_sighandler(int sig, ...)
2618 Perl_sighandler(int sig)
2621 #ifdef PERL_GET_SIG_CONTEXT
2622 dTHXa(PERL_GET_SIG_CONTEXT);
2629 SV * const tSv = PL_Sv;
2633 XPV * const tXpv = PL_Xpv;
2635 if (PL_savestack_ix + 15 <= PL_savestack_max)
2637 if (PL_markstack_ptr < PL_markstack_max - 2)
2639 if (PL_scopestack_ix < PL_scopestack_max - 3)
2642 if (!PL_psig_ptr[sig]) {
2643 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2648 /* Max number of items pushed there is 3*n or 4. We cannot fix
2649 infinity, so we fix 4 (in fact 5): */
2651 PL_savestack_ix += 5; /* Protect save in progress. */
2652 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2655 PL_markstack_ptr++; /* Protect mark. */
2657 PL_scopestack_ix += 1;
2658 /* sv_2cv is too complicated, try a simpler variant first: */
2659 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2660 || SvTYPE(cv) != SVt_PVCV) {
2662 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2665 if (!cv || !CvROOT(cv)) {
2666 if (ckWARN(WARN_SIGNAL))
2667 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2668 PL_sig_name[sig], (gv ? GvENAME(gv)
2675 if(PL_psig_name[sig]) {
2676 sv = SvREFCNT_inc(PL_psig_name[sig]);
2678 #if !defined(PERL_IMPLICIT_CONTEXT)
2682 sv = sv_newmortal();
2683 sv_setpv(sv,PL_sig_name[sig]);
2686 PUSHSTACKi(PERLSI_SIGNAL);
2689 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2691 struct sigaction oact;
2693 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2697 va_start(args, sig);
2698 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2701 SV *rv = newRV_noinc((SV*)sih);
2702 /* The siginfo fields signo, code, errno, pid, uid,
2703 * addr, status, and band are defined by POSIX/SUSv3. */
2704 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2705 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
2706 #if 0 /* XXX TODO: Configure scan for the existence of these, but even that does not help if the SA_SIGINFO is not implemented according to the spec. */
2707 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
2708 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
2709 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2710 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2711 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
2712 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
2716 PUSHs(newSVpv((void*)sip, sizeof(*sip)));
2725 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2728 if (SvTRUE(ERRSV)) {
2730 #ifdef HAS_SIGPROCMASK
2731 /* Handler "died", for example to get out of a restart-able read().
2732 * Before we re-do that on its behalf re-enable the signal which was
2733 * blocked by the system when we entered.
2737 sigaddset(&set,sig);
2738 sigprocmask(SIG_UNBLOCK, &set, NULL);
2740 /* Not clear if this will work */
2741 (void)rsignal(sig, SIG_IGN);
2742 (void)rsignal(sig, PL_csighandlerp);
2744 #endif /* !PERL_MICRO */
2745 Perl_die(aTHX_ Nullch);
2749 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2753 PL_scopestack_ix -= 1;
2756 PL_op = myop; /* Apparently not needed... */
2758 PL_Sv = tSv; /* Restore global temporaries. */
2765 S_restore_magic(pTHX_ const void *p)
2768 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2769 SV* const sv = mgs->mgs_sv;
2774 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2776 #ifdef PERL_OLD_COPY_ON_WRITE
2777 /* While magic was saved (and off) sv_setsv may well have seen
2778 this SV as a prime candidate for COW. */
2780 sv_force_normal_flags(sv, 0);
2784 SvFLAGS(sv) |= mgs->mgs_flags;
2787 if (SvGMAGICAL(sv)) {
2788 /* downgrade public flags to private,
2789 and discard any other private flags */
2791 U32 public = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2793 SvFLAGS(sv) &= ~( public | SVp_IOK|SVp_NOK|SVp_POK );
2794 SvFLAGS(sv) |= ( public << PRIVSHIFT );
2799 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2801 /* If we're still on top of the stack, pop us off. (That condition
2802 * will be satisfied if restore_magic was called explicitly, but *not*
2803 * if it's being called via leave_scope.)
2804 * The reason for doing this is that otherwise, things like sv_2cv()
2805 * may leave alloc gunk on the savestack, and some code
2806 * (e.g. sighandler) doesn't expect that...
2808 if (PL_savestack_ix == mgs->mgs_ss_ix)
2810 I32 popval = SSPOPINT;
2811 assert(popval == SAVEt_DESTRUCTOR_X);
2812 PL_savestack_ix -= 2;
2814 assert(popval == SAVEt_ALLOC);
2816 PL_savestack_ix -= popval;
2822 S_unwind_handler_stack(pTHX_ const void *p)
2825 const U32 flags = *(const U32*)p;
2828 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2829 #if !defined(PERL_IMPLICIT_CONTEXT)
2831 SvREFCNT_dec(PL_sig_sv);
2837 * c-indentation-style: bsd
2839 * indent-tabs-mode: t
2842 * ex: set ts=8 sts=4 sw=4 noet: