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_IOK|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)
119 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
120 const MGVTBL* const vtbl = mg->mg_virtual;
122 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
126 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
135 Do magic after a value is retrieved from the SV. See C<sv_magic>.
141 Perl_mg_get(pTHX_ SV *sv)
144 const I32 mgs_ix = SSNEW(sizeof(MGS));
145 const bool was_temp = (bool)SvTEMP(sv);
147 MAGIC *newmg, *head, *cur, *mg;
148 /* guard against sv having being freed midway by holding a private
151 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
152 cause the SV's buffer to get stolen (and maybe other stuff).
155 sv_2mortal(SvREFCNT_inc_simple_NN(sv));
160 save_magic(mgs_ix, sv);
162 /* We must call svt_get(sv, mg) for each valid entry in the linked
163 list of magic. svt_get() may delete the current entry, add new
164 magic to the head of the list, or upgrade the SV. AMS 20010810 */
166 newmg = cur = head = mg = SvMAGIC(sv);
168 const MGVTBL * const vtbl = mg->mg_virtual;
170 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
171 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
173 /* guard against magic having been deleted - eg FETCH calling
178 /* Don't restore the flags for this entry if it was deleted. */
179 if (mg->mg_flags & MGf_GSKIP)
180 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
183 mg = mg->mg_moremagic;
186 /* Have we finished with the new entries we saw? Start again
187 where we left off (unless there are more new entries). */
195 /* Were any new entries added? */
196 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
203 restore_magic(INT2PTR(void *, (IV)mgs_ix));
205 if (SvREFCNT(sv) == 1) {
206 /* We hold the last reference to this SV, which implies that the
207 SV was deleted as a side effect of the routines we called. */
216 Do magic after a value is assigned to the SV. See C<sv_magic>.
222 Perl_mg_set(pTHX_ SV *sv)
225 const I32 mgs_ix = SSNEW(sizeof(MGS));
229 save_magic(mgs_ix, sv);
231 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
232 const MGVTBL* vtbl = mg->mg_virtual;
233 nextmg = mg->mg_moremagic; /* it may delete itself */
234 if (mg->mg_flags & MGf_GSKIP) {
235 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
236 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
238 if (vtbl && vtbl->svt_set)
239 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
242 restore_magic(INT2PTR(void*, (IV)mgs_ix));
247 =for apidoc mg_length
249 Report on the SV's length. See C<sv_magic>.
255 Perl_mg_length(pTHX_ SV *sv)
261 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
262 const MGVTBL * const vtbl = mg->mg_virtual;
263 if (vtbl && vtbl->svt_len) {
264 const I32 mgs_ix = SSNEW(sizeof(MGS));
265 save_magic(mgs_ix, sv);
266 /* omit MGf_GSKIP -- not changed here */
267 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
268 restore_magic(INT2PTR(void*, (IV)mgs_ix));
274 const U8 *s = (U8*)SvPV_const(sv, len);
275 len = Perl_utf8_length(aTHX_ s, s + len);
278 (void)SvPV_const(sv, len);
283 Perl_mg_size(pTHX_ SV *sv)
287 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
288 const MGVTBL* const vtbl = mg->mg_virtual;
289 if (vtbl && vtbl->svt_len) {
290 const I32 mgs_ix = SSNEW(sizeof(MGS));
292 save_magic(mgs_ix, sv);
293 /* omit MGf_GSKIP -- not changed here */
294 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
295 restore_magic(INT2PTR(void*, (IV)mgs_ix));
302 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
306 Perl_croak(aTHX_ "Size magic not implemented");
315 Clear something magical that the SV represents. See C<sv_magic>.
321 Perl_mg_clear(pTHX_ SV *sv)
323 const I32 mgs_ix = SSNEW(sizeof(MGS));
326 save_magic(mgs_ix, sv);
328 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
329 const MGVTBL* const vtbl = mg->mg_virtual;
330 /* omit GSKIP -- never set here */
332 if (vtbl && vtbl->svt_clear)
333 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
336 restore_magic(INT2PTR(void*, (IV)mgs_ix));
343 Finds the magic pointer for type matching the SV. See C<sv_magic>.
349 Perl_mg_find(pTHX_ const SV *sv, int type)
354 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
355 if (mg->mg_type == type)
365 Copies the magic from one SV to another. See C<sv_magic>.
371 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
375 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
376 const MGVTBL* const vtbl = mg->mg_virtual;
377 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
378 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
381 const char type = mg->mg_type;
384 (type == PERL_MAGIC_tied)
386 : (type == PERL_MAGIC_regdata && mg->mg_obj)
389 toLOWER(type), key, klen);
398 =for apidoc mg_localize
400 Copy some of the magic from an existing SV to new localized version of
401 that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
402 doesn't (eg taint, pos).
408 Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
412 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
413 MGVTBL* const vtbl = mg->mg_virtual;
414 switch (mg->mg_type) {
415 /* value magic types: don't copy */
418 case PERL_MAGIC_regex_global:
419 case PERL_MAGIC_nkeys:
420 #ifdef USE_LOCALE_COLLATE
421 case PERL_MAGIC_collxfrm:
424 case PERL_MAGIC_taint:
426 case PERL_MAGIC_vstring:
427 case PERL_MAGIC_utf8:
428 case PERL_MAGIC_substr:
429 case PERL_MAGIC_defelem:
430 case PERL_MAGIC_arylen:
432 case PERL_MAGIC_backref:
433 case PERL_MAGIC_arylen_p:
434 case PERL_MAGIC_rhash:
435 case PERL_MAGIC_symtab:
439 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
440 (void)CALL_FPTR(vtbl->svt_local)(aTHX_ nsv, mg);
442 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
443 mg->mg_ptr, mg->mg_len);
445 /* container types should remain read-only across localization */
446 SvFLAGS(nsv) |= SvREADONLY(sv);
449 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
450 SvFLAGS(nsv) |= SvMAGICAL(sv);
460 Free any magic storage used by the SV. See C<sv_magic>.
466 Perl_mg_free(pTHX_ SV *sv)
470 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
471 const MGVTBL* const vtbl = mg->mg_virtual;
472 moremagic = mg->mg_moremagic;
473 if (vtbl && vtbl->svt_free)
474 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
475 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
476 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
477 Safefree(mg->mg_ptr);
478 else if (mg->mg_len == HEf_SVKEY)
479 SvREFCNT_dec((SV*)mg->mg_ptr);
481 if (mg->mg_flags & MGf_REFCOUNTED)
482 SvREFCNT_dec(mg->mg_obj);
485 SvMAGIC_set(sv, NULL);
492 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
498 register const REGEXP * const rx = PM_GETRE(PL_curpm);
501 ? rx->nparens /* @+ */
502 : rx->lastparen; /* @- */
510 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
514 register const REGEXP * const rx = PM_GETRE(PL_curpm);
516 register const I32 paren = mg->mg_len;
521 if (paren <= (I32)rx->nparens &&
522 (s = rx->startp[paren]) != -1 &&
523 (t = rx->endp[paren]) != -1)
526 if (mg->mg_obj) /* @+ */
531 if (i > 0 && RX_MATCH_UTF8(rx)) {
532 const char * const b = rx->subbeg;
534 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
545 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
549 Perl_croak(aTHX_ PL_no_modify);
550 NORETURN_FUNCTION_END;
554 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
559 register const REGEXP *rx;
562 switch (*mg->mg_ptr) {
563 case '1': case '2': case '3': case '4':
564 case '5': case '6': case '7': case '8': case '9': case '&':
565 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
567 paren = atoi(mg->mg_ptr); /* $& is in [0] */
569 if (paren <= (I32)rx->nparens &&
570 (s1 = rx->startp[paren]) != -1 &&
571 (t1 = rx->endp[paren]) != -1)
575 if (i > 0 && RX_MATCH_UTF8(rx)) {
576 const char * const s = rx->subbeg + s1;
581 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
585 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
589 if (ckWARN(WARN_UNINITIALIZED))
594 if (ckWARN(WARN_UNINITIALIZED))
599 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
600 paren = rx->lastparen;
605 case '\016': /* ^N */
606 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
607 paren = rx->lastcloseparen;
613 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
614 if (rx->startp[0] != -1) {
625 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
626 if (rx->endp[0] != -1) {
627 i = rx->sublen - rx->endp[0];
638 if (!SvPOK(sv) && SvNIOK(sv)) {
646 #define SvRTRIM(sv) STMT_START { \
648 STRLEN len = SvCUR(sv); \
649 char * const p = SvPVX(sv); \
650 while (len > 0 && isSPACE(p[len-1])) \
652 SvCUR_set(sv, len); \
658 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
662 register char *s = NULL;
665 const char * const remaining = mg->mg_ptr + 1;
666 const char nextchar = *remaining;
668 switch (*mg->mg_ptr) {
669 case '\001': /* ^A */
670 sv_setsv(sv, PL_bodytarget);
672 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
673 if (nextchar == '\0') {
674 sv_setiv(sv, (IV)PL_minus_c);
676 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
677 sv_setiv(sv, (IV)STATUS_NATIVE);
681 case '\004': /* ^D */
682 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
684 case '\005': /* ^E */
685 if (nextchar == '\0') {
686 #if defined(MACOS_TRADITIONAL)
690 sv_setnv(sv,(double)gMacPerl_OSErr);
691 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
695 # include <descrip.h>
696 # include <starlet.h>
698 $DESCRIPTOR(msgdsc,msg);
699 sv_setnv(sv,(NV) vaxc$errno);
700 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
701 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
706 if (!(_emx_env & 0x200)) { /* Under DOS */
707 sv_setnv(sv, (NV)errno);
708 sv_setpv(sv, errno ? Strerror(errno) : "");
710 if (errno != errno_isOS2) {
711 const int tmp = _syserrno();
712 if (tmp) /* 2nd call to _syserrno() makes it 0 */
715 sv_setnv(sv, (NV)Perl_rc);
716 sv_setpv(sv, os2error(Perl_rc));
720 const DWORD dwErr = GetLastError();
721 sv_setnv(sv, (NV)dwErr);
723 PerlProc_GetOSError(sv, dwErr);
726 sv_setpvn(sv, "", 0);
731 const int saveerrno = errno;
732 sv_setnv(sv, (NV)errno);
733 sv_setpv(sv, errno ? Strerror(errno) : "");
738 SvNOK_on(sv); /* what a wonderful hack! */
740 else if (strEQ(remaining, "NCODING"))
741 sv_setsv(sv, PL_encoding);
743 case '\006': /* ^F */
744 sv_setiv(sv, (IV)PL_maxsysfd);
746 case '\010': /* ^H */
747 sv_setiv(sv, (IV)PL_hints);
749 case '\011': /* ^I */ /* NOT \t in EBCDIC */
751 sv_setpv(sv, PL_inplace);
753 sv_setsv(sv, &PL_sv_undef);
755 case '\017': /* ^O & ^OPEN */
756 if (nextchar == '\0') {
757 sv_setpv(sv, PL_osname);
760 else if (strEQ(remaining, "PEN")) {
761 if (!PL_compiling.cop_io)
762 sv_setsv(sv, &PL_sv_undef);
764 sv_setsv(sv, PL_compiling.cop_io);
768 case '\020': /* ^P */
769 sv_setiv(sv, (IV)PL_perldb);
771 case '\023': /* ^S */
772 if (nextchar == '\0') {
773 if (PL_lex_state != LEX_NOTPARSING)
776 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
781 case '\024': /* ^T */
782 if (nextchar == '\0') {
784 sv_setnv(sv, PL_basetime);
786 sv_setiv(sv, (IV)PL_basetime);
789 else if (strEQ(remaining, "AINT"))
790 sv_setiv(sv, PL_tainting
791 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
794 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
795 if (strEQ(remaining, "NICODE"))
796 sv_setuv(sv, (UV) PL_unicode);
797 else if (strEQ(remaining, "TF8LOCALE"))
798 sv_setuv(sv, (UV) PL_utf8locale);
799 else if (strEQ(remaining, "TF8CACHE"))
800 sv_setiv(sv, (IV) PL_utf8cache);
802 case '\027': /* ^W & $^WARNING_BITS */
803 if (nextchar == '\0')
804 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
805 else if (strEQ(remaining, "ARNING_BITS")) {
806 if (PL_compiling.cop_warnings == pWARN_NONE) {
807 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
809 else if (PL_compiling.cop_warnings == pWARN_STD) {
812 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
816 else if (PL_compiling.cop_warnings == pWARN_ALL) {
817 /* Get the bit mask for $warnings::Bits{all}, because
818 * it could have been extended by warnings::register */
820 HV * const bits=get_hv("warnings::Bits", FALSE);
821 if (bits && (bits_all=hv_fetchs(bits, "all", FALSE))) {
822 sv_setsv(sv, *bits_all);
825 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
829 sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
830 *PL_compiling.cop_warnings);
835 case '1': case '2': case '3': case '4':
836 case '5': case '6': case '7': case '8': case '9': case '&':
837 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
841 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
842 * XXX Does the new way break anything?
844 paren = atoi(mg->mg_ptr); /* $& is in [0] */
846 if (paren <= (I32)rx->nparens &&
847 (s1 = rx->startp[paren]) != -1 &&
848 (t1 = rx->endp[paren]) != -1)
856 const int oldtainted = PL_tainted;
859 PL_tainted = oldtainted;
860 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
865 if (RX_MATCH_TAINTED(rx)) {
866 MAGIC* const mg = SvMAGIC(sv);
869 SvMAGIC_set(sv, mg->mg_moremagic);
871 if ((mgt = SvMAGIC(sv))) {
872 mg->mg_moremagic = mgt;
882 sv_setsv(sv,&PL_sv_undef);
885 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
886 paren = rx->lastparen;
890 sv_setsv(sv,&PL_sv_undef);
892 case '\016': /* ^N */
893 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
894 paren = rx->lastcloseparen;
898 sv_setsv(sv,&PL_sv_undef);
901 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
902 if ((s = rx->subbeg) && rx->startp[0] != -1) {
907 sv_setsv(sv,&PL_sv_undef);
910 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
911 if (rx->subbeg && rx->endp[0] != -1) {
912 s = rx->subbeg + rx->endp[0];
913 i = rx->sublen - rx->endp[0];
917 sv_setsv(sv,&PL_sv_undef);
920 if (GvIO(PL_last_in_gv)) {
921 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
926 sv_setiv(sv, (IV)STATUS_CURRENT);
927 #ifdef COMPLEX_STATUS
928 LvTARGOFF(sv) = PL_statusvalue;
929 LvTARGLEN(sv) = PL_statusvalue_vms;
934 if (GvIOp(PL_defoutgv))
935 s = IoTOP_NAME(GvIOp(PL_defoutgv));
939 sv_setpv(sv,GvENAME(PL_defoutgv));
944 if (GvIOp(PL_defoutgv))
945 s = IoFMT_NAME(GvIOp(PL_defoutgv));
947 s = GvENAME(PL_defoutgv);
951 if (GvIOp(PL_defoutgv))
952 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
955 if (GvIOp(PL_defoutgv))
956 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
959 if (GvIOp(PL_defoutgv))
960 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
967 WITH_THR(sv_setiv(sv, (IV)CopARYBASE_get(PL_curcop)));
970 if (GvIOp(PL_defoutgv))
971 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
977 sv_copypv(sv, PL_ors_sv);
981 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
982 sv_setpv(sv, errno ? Strerror(errno) : "");
985 const int saveerrno = errno;
986 sv_setnv(sv, (NV)errno);
988 if (errno == errno_isOS2 || errno == errno_isOS2_set)
989 sv_setpv(sv, os2error(Perl_rc));
992 sv_setpv(sv, errno ? Strerror(errno) : "");
997 SvNOK_on(sv); /* what a wonderful hack! */
1000 sv_setiv(sv, (IV)PL_uid);
1003 sv_setiv(sv, (IV)PL_euid);
1006 sv_setiv(sv, (IV)PL_gid);
1009 sv_setiv(sv, (IV)PL_egid);
1011 #ifdef HAS_GETGROUPS
1013 Groups_t *gary = NULL;
1014 I32 i, num_groups = getgroups(0, gary);
1015 Newx(gary, num_groups, Groups_t);
1016 num_groups = getgroups(num_groups, gary);
1017 for (i = 0; i < num_groups; i++)
1018 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1021 (void)SvIOK_on(sv); /* what a wonderful hack! */
1024 #ifndef MACOS_TRADITIONAL
1033 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1035 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1037 if (uf && uf->uf_val)
1038 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1043 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1046 STRLEN len = 0, klen;
1047 const char *s = SvOK(sv) ? SvPV_const(sv,len) : "";
1048 const char * const ptr = MgPV_const(mg,klen);
1051 #ifdef DYNAMIC_ENV_FETCH
1052 /* We just undefd an environment var. Is a replacement */
1053 /* waiting in the wings? */
1055 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1057 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1061 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1062 /* And you'll never guess what the dog had */
1063 /* in its mouth... */
1065 MgTAINTEDDIR_off(mg);
1067 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1068 char pathbuf[256], eltbuf[256], *cp, *elt;
1072 strncpy(eltbuf, s, 255);
1075 do { /* DCL$PATH may be a search list */
1076 while (1) { /* as may dev portion of any element */
1077 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1078 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1079 cando_by_name(S_IWUSR,0,elt) ) {
1080 MgTAINTEDDIR_on(mg);
1084 if ((cp = strchr(elt, ':')) != NULL)
1086 if (my_trnlnm(elt, eltbuf, j++))
1092 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1095 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1096 const char * const strend = s + len;
1098 while (s < strend) {
1102 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1103 s, strend, ':', &i);
1105 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1107 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1108 MgTAINTEDDIR_on(mg);
1114 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1120 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1122 PERL_UNUSED_ARG(sv);
1123 my_setenv(MgPV_nolen_const(mg),NULL);
1128 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1131 PERL_UNUSED_ARG(mg);
1133 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1135 if (PL_localizing) {
1138 hv_iterinit((HV*)sv);
1139 while ((entry = hv_iternext((HV*)sv))) {
1141 my_setenv(hv_iterkey(entry, &keylen),
1142 SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1150 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1153 PERL_UNUSED_ARG(sv);
1154 PERL_UNUSED_ARG(mg);
1156 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1164 #ifdef HAS_SIGPROCMASK
1166 restore_sigmask(pTHX_ SV *save_sv)
1168 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1169 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1173 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1176 /* Are we fetching a signal entry? */
1177 const I32 i = whichsig(MgPV_nolen_const(mg));
1180 sv_setsv(sv,PL_psig_ptr[i]);
1182 Sighandler_t sigstate = rsignal_state(i);
1183 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1184 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1187 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1188 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1191 /* cache state so we don't fetch it again */
1192 if(sigstate == (Sighandler_t) SIG_IGN)
1193 sv_setpv(sv,"IGNORE");
1195 sv_setsv(sv,&PL_sv_undef);
1196 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1203 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1205 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1206 * refactoring might be in order.
1209 register const char * const s = MgPV_nolen_const(mg);
1210 PERL_UNUSED_ARG(sv);
1213 if (strEQ(s,"__DIE__"))
1215 else if (strEQ(s,"__WARN__"))
1218 Perl_croak(aTHX_ "No such hook: %s", s);
1220 SV * const to_dec = *svp;
1222 SvREFCNT_dec(to_dec);
1226 /* Are we clearing a signal entry? */
1227 const I32 i = whichsig(s);
1229 #ifdef HAS_SIGPROCMASK
1232 /* Avoid having the signal arrive at a bad time, if possible. */
1235 sigprocmask(SIG_BLOCK, &set, &save);
1237 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1238 SAVEFREESV(save_sv);
1239 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1242 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1243 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1245 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1246 PL_sig_defaulting[i] = 1;
1247 (void)rsignal(i, PL_csighandlerp);
1249 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1251 if(PL_psig_name[i]) {
1252 SvREFCNT_dec(PL_psig_name[i]);
1255 if(PL_psig_ptr[i]) {
1256 SV * const to_dec=PL_psig_ptr[i];
1259 SvREFCNT_dec(to_dec);
1269 S_raise_signal(pTHX_ int sig)
1272 /* Set a flag to say this signal is pending */
1273 PL_psig_pend[sig]++;
1274 /* And one to say _a_ signal is pending */
1279 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1280 Perl_csighandler(int sig, ...)
1282 Perl_csighandler(int sig)
1285 #ifdef PERL_GET_SIG_CONTEXT
1286 dTHXa(PERL_GET_SIG_CONTEXT);
1290 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1291 (void) rsignal(sig, PL_csighandlerp);
1292 if (PL_sig_ignoring[sig]) return;
1294 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1295 if (PL_sig_defaulting[sig])
1296 #ifdef KILL_BY_SIGPRC
1297 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1302 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1303 /* Call the perl level handler now--
1304 * with risk we may be in malloc() etc. */
1305 (*PL_sighandlerp)(sig);
1307 S_raise_signal(aTHX_ sig);
1310 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1312 Perl_csighandler_init(void)
1315 if (PL_sig_handlers_initted) return;
1317 for (sig = 1; sig < SIG_SIZE; sig++) {
1318 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1320 PL_sig_defaulting[sig] = 1;
1321 (void) rsignal(sig, PL_csighandlerp);
1323 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1324 PL_sig_ignoring[sig] = 0;
1327 PL_sig_handlers_initted = 1;
1332 Perl_despatch_signals(pTHX)
1337 for (sig = 1; sig < SIG_SIZE; sig++) {
1338 if (PL_psig_pend[sig]) {
1339 PERL_BLOCKSIG_ADD(set, sig);
1340 PL_psig_pend[sig] = 0;
1341 PERL_BLOCKSIG_BLOCK(set);
1342 (*PL_sighandlerp)(sig);
1343 PERL_BLOCKSIG_UNBLOCK(set);
1349 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1354 /* Need to be careful with SvREFCNT_dec(), because that can have side
1355 * effects (due to closures). We must make sure that the new disposition
1356 * is in place before it is called.
1360 #ifdef HAS_SIGPROCMASK
1365 register const char *s = MgPV_const(mg,len);
1367 if (strEQ(s,"__DIE__"))
1369 else if (strEQ(s,"__WARN__"))
1372 Perl_croak(aTHX_ "No such hook: %s", s);
1380 i = whichsig(s); /* ...no, a brick */
1382 if (ckWARN(WARN_SIGNAL))
1383 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1386 #ifdef HAS_SIGPROCMASK
1387 /* Avoid having the signal arrive at a bad time, if possible. */
1390 sigprocmask(SIG_BLOCK, &set, &save);
1392 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1393 SAVEFREESV(save_sv);
1394 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1397 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1398 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1400 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1401 PL_sig_ignoring[i] = 0;
1403 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1404 PL_sig_defaulting[i] = 0;
1406 SvREFCNT_dec(PL_psig_name[i]);
1407 to_dec = PL_psig_ptr[i];
1408 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1409 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1410 PL_psig_name[i] = newSVpvn(s, len);
1411 SvREADONLY_on(PL_psig_name[i]);
1413 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1415 (void)rsignal(i, PL_csighandlerp);
1416 #ifdef HAS_SIGPROCMASK
1421 *svp = SvREFCNT_inc_simple_NN(sv);
1423 SvREFCNT_dec(to_dec);
1426 s = SvPV_force(sv,len);
1427 if (strEQ(s,"IGNORE")) {
1429 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1430 PL_sig_ignoring[i] = 1;
1431 (void)rsignal(i, PL_csighandlerp);
1433 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1437 else if (strEQ(s,"DEFAULT") || !*s) {
1439 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1441 PL_sig_defaulting[i] = 1;
1442 (void)rsignal(i, PL_csighandlerp);
1445 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1450 * We should warn if HINT_STRICT_REFS, but without
1451 * access to a known hint bit in a known OP, we can't
1452 * tell whether HINT_STRICT_REFS is in force or not.
1454 if (!strchr(s,':') && !strchr(s,'\''))
1455 Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"));
1457 (void)rsignal(i, PL_csighandlerp);
1459 *svp = SvREFCNT_inc_simple_NN(sv);
1461 #ifdef HAS_SIGPROCMASK
1466 SvREFCNT_dec(to_dec);
1469 #endif /* !PERL_MICRO */
1472 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1475 PERL_UNUSED_ARG(sv);
1476 PERL_UNUSED_ARG(mg);
1477 PL_sub_generation++;
1482 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1485 PERL_UNUSED_ARG(sv);
1486 PERL_UNUSED_ARG(mg);
1487 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1488 PL_amagic_generation++;
1494 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1496 HV * const hv = (HV*)LvTARG(sv);
1498 PERL_UNUSED_ARG(mg);
1501 (void) hv_iterinit(hv);
1502 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1505 while (hv_iternext(hv))
1510 sv_setiv(sv, (IV)i);
1515 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1517 PERL_UNUSED_ARG(mg);
1519 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1524 /* caller is responsible for stack switching/cleanup */
1526 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1533 PUSHs(SvTIED_obj(sv, mg));
1536 if (mg->mg_len >= 0)
1537 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1538 else if (mg->mg_len == HEf_SVKEY)
1539 PUSHs((SV*)mg->mg_ptr);
1541 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1542 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1550 return call_method(meth, flags);
1554 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1560 PUSHSTACKi(PERLSI_MAGIC);
1562 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1563 sv_setsv(sv, *PL_stack_sp--);
1573 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1576 mg->mg_flags |= MGf_GSKIP;
1577 magic_methpack(sv,mg,"FETCH");
1582 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1586 PUSHSTACKi(PERLSI_MAGIC);
1587 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1594 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1596 return magic_methpack(sv,mg,"DELETE");
1601 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1608 PUSHSTACKi(PERLSI_MAGIC);
1609 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1610 sv = *PL_stack_sp--;
1611 retval = (U32) SvIV(sv)-1;
1620 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1625 PUSHSTACKi(PERLSI_MAGIC);
1627 XPUSHs(SvTIED_obj(sv, mg));
1629 call_method("CLEAR", G_SCALAR|G_DISCARD);
1637 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1640 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1644 PUSHSTACKi(PERLSI_MAGIC);
1647 PUSHs(SvTIED_obj(sv, mg));
1652 if (call_method(meth, G_SCALAR))
1653 sv_setsv(key, *PL_stack_sp--);
1662 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1664 return magic_methpack(sv,mg,"EXISTS");
1668 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1671 SV *retval = &PL_sv_undef;
1672 SV * const tied = SvTIED_obj((SV*)hv, mg);
1673 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1675 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1677 if (HvEITER_get(hv))
1678 /* we are in an iteration so the hash cannot be empty */
1680 /* no xhv_eiter so now use FIRSTKEY */
1681 key = sv_newmortal();
1682 magic_nextpack((SV*)hv, mg, key);
1683 HvEITER_set(hv, NULL); /* need to reset iterator */
1684 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1687 /* there is a SCALAR method that we can call */
1689 PUSHSTACKi(PERLSI_MAGIC);
1695 if (call_method("SCALAR", G_SCALAR))
1696 retval = *PL_stack_sp--;
1703 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1706 GV * const gv = PL_DBline;
1707 const I32 i = SvTRUE(sv);
1708 SV ** const svp = av_fetch(GvAV(gv),
1709 atoi(MgPV_nolen_const(mg)), FALSE);
1710 if (svp && SvIOKp(*svp)) {
1711 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1713 /* set or clear breakpoint in the relevant control op */
1715 o->op_flags |= OPf_SPECIAL;
1717 o->op_flags &= ~OPf_SPECIAL;
1724 Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1727 const AV * const obj = (AV*)mg->mg_obj;
1729 sv_setiv(sv, AvFILL(obj) + CopARYBASE_get(PL_curcop));
1737 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1740 AV * const obj = (AV*)mg->mg_obj;
1742 av_fill(obj, SvIV(sv) - CopARYBASE_get(PL_curcop));
1744 if (ckWARN(WARN_MISC))
1745 Perl_warner(aTHX_ packWARN(WARN_MISC),
1746 "Attempt to set length of freed array");
1752 Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1755 PERL_UNUSED_ARG(sv);
1756 /* during global destruction, mg_obj may already have been freed */
1757 if (PL_in_clean_all)
1760 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1763 /* arylen scalar holds a pointer back to the array, but doesn't own a
1764 reference. Hence the we (the array) are about to go away with it
1765 still pointing at us. Clear its pointer, else it would be pointing
1766 at free memory. See the comment in sv_magic about reference loops,
1767 and why it can't own a reference to us. */
1774 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1777 SV* const lsv = LvTARG(sv);
1778 PERL_UNUSED_ARG(mg);
1780 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1781 MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
1782 if (found && found->mg_len >= 0) {
1783 I32 i = found->mg_len;
1785 sv_pos_b2u(lsv, &i);
1786 sv_setiv(sv, i + CopARYBASE_get(PL_curcop));
1795 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1798 SV* const lsv = LvTARG(sv);
1804 PERL_UNUSED_ARG(mg);
1806 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1807 found = mg_find(lsv, PERL_MAGIC_regex_global);
1813 #ifdef PERL_OLD_COPY_ON_WRITE
1815 sv_force_normal_flags(lsv, 0);
1817 found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
1820 else if (!SvOK(sv)) {
1824 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1826 pos = SvIV(sv) - CopARYBASE_get(PL_curcop);
1829 ulen = sv_len_utf8(lsv);
1839 else if (pos > (SSize_t)len)
1844 sv_pos_u2b(lsv, &p, 0);
1848 found->mg_len = pos;
1849 found->mg_flags &= ~MGf_MINMATCH;
1855 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1858 PERL_UNUSED_ARG(mg);
1862 if (SvFLAGS(sv) & SVp_SCREAM
1863 && (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVGV)) {
1864 /* We're actually already a typeglob, so don't need the stuff below.
1868 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
1873 GvGP(sv) = gp_ref(GvGP(gv));
1878 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1881 SV * const lsv = LvTARG(sv);
1882 const char * const tmps = SvPV_const(lsv,len);
1883 I32 offs = LvTARGOFF(sv);
1884 I32 rem = LvTARGLEN(sv);
1885 PERL_UNUSED_ARG(mg);
1888 sv_pos_u2b(lsv, &offs, &rem);
1889 if (offs > (I32)len)
1891 if (rem + offs > (I32)len)
1893 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1900 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1904 const char *tmps = SvPV_const(sv, len);
1905 SV * const lsv = LvTARG(sv);
1906 I32 lvoff = LvTARGOFF(sv);
1907 I32 lvlen = LvTARGLEN(sv);
1908 PERL_UNUSED_ARG(mg);
1911 sv_utf8_upgrade(lsv);
1912 sv_pos_u2b(lsv, &lvoff, &lvlen);
1913 sv_insert(lsv, lvoff, lvlen, tmps, len);
1914 LvTARGLEN(sv) = sv_len_utf8(sv);
1917 else if (lsv && SvUTF8(lsv)) {
1918 sv_pos_u2b(lsv, &lvoff, &lvlen);
1919 LvTARGLEN(sv) = len;
1920 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1921 sv_insert(lsv, lvoff, lvlen, tmps, len);
1925 sv_insert(lsv, lvoff, lvlen, tmps, len);
1926 LvTARGLEN(sv) = len;
1934 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1937 PERL_UNUSED_ARG(sv);
1938 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
1943 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1946 PERL_UNUSED_ARG(sv);
1947 /* update taint status unless we're restoring at scope exit */
1948 if (PL_localizing != 2) {
1958 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1960 SV * const lsv = LvTARG(sv);
1961 PERL_UNUSED_ARG(mg);
1964 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1972 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1974 PERL_UNUSED_ARG(mg);
1975 do_vecset(sv); /* XXX slurp this routine */
1980 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1984 if (LvTARGLEN(sv)) {
1986 SV * const ahv = LvTARG(sv);
1987 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1992 AV* const av = (AV*)LvTARG(sv);
1993 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1994 targ = AvARRAY(av)[LvTARGOFF(sv)];
1996 if (targ && (targ != &PL_sv_undef)) {
1997 /* somebody else defined it for us */
1998 SvREFCNT_dec(LvTARG(sv));
1999 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2001 SvREFCNT_dec(mg->mg_obj);
2003 mg->mg_flags &= ~MGf_REFCOUNTED;
2008 sv_setsv(sv, targ ? targ : &PL_sv_undef);
2013 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2015 PERL_UNUSED_ARG(mg);
2019 sv_setsv(LvTARG(sv), sv);
2020 SvSETMAGIC(LvTARG(sv));
2026 Perl_vivify_defelem(pTHX_ SV *sv)
2032 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2035 SV * const ahv = LvTARG(sv);
2036 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
2039 if (!value || value == &PL_sv_undef)
2040 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
2043 AV* const av = (AV*)LvTARG(sv);
2044 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2045 LvTARG(sv) = NULL; /* array can't be extended */
2047 SV* const * const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2048 if (!svp || (value = *svp) == &PL_sv_undef)
2049 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2052 SvREFCNT_inc_simple_void(value);
2053 SvREFCNT_dec(LvTARG(sv));
2056 SvREFCNT_dec(mg->mg_obj);
2058 mg->mg_flags &= ~MGf_REFCOUNTED;
2062 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2064 return Perl_sv_kill_backrefs(aTHX_ sv, (AV*)mg->mg_obj);
2068 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2070 PERL_UNUSED_CONTEXT;
2077 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2079 PERL_UNUSED_ARG(mg);
2080 sv_unmagic(sv, PERL_MAGIC_bm);
2086 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2088 PERL_UNUSED_ARG(mg);
2089 sv_unmagic(sv, PERL_MAGIC_fm);
2095 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2097 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2099 if (uf && uf->uf_set)
2100 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2105 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2107 PERL_UNUSED_ARG(mg);
2108 sv_unmagic(sv, PERL_MAGIC_qr);
2113 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2116 regexp * const re = (regexp *)mg->mg_obj;
2117 PERL_UNUSED_ARG(sv);
2123 #ifdef USE_LOCALE_COLLATE
2125 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2128 * RenE<eacute> Descartes said "I think not."
2129 * and vanished with a faint plop.
2131 PERL_UNUSED_CONTEXT;
2132 PERL_UNUSED_ARG(sv);
2134 Safefree(mg->mg_ptr);
2140 #endif /* USE_LOCALE_COLLATE */
2142 /* Just clear the UTF-8 cache data. */
2144 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2146 PERL_UNUSED_CONTEXT;
2147 PERL_UNUSED_ARG(sv);
2148 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2150 mg->mg_len = -1; /* The mg_len holds the len cache. */
2155 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2158 register const char *s;
2161 switch (*mg->mg_ptr) {
2162 case '\001': /* ^A */
2163 sv_setsv(PL_bodytarget, sv);
2165 case '\003': /* ^C */
2166 PL_minus_c = (bool)SvIV(sv);
2169 case '\004': /* ^D */
2171 s = SvPV_nolen_const(sv);
2172 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2173 DEBUG_x(dump_all());
2175 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2178 case '\005': /* ^E */
2179 if (*(mg->mg_ptr+1) == '\0') {
2180 #ifdef MACOS_TRADITIONAL
2181 gMacPerl_OSErr = SvIV(sv);
2184 set_vaxc_errno(SvIV(sv));
2187 SetLastError( SvIV(sv) );
2190 os2_setsyserrno(SvIV(sv));
2192 /* will anyone ever use this? */
2193 SETERRNO(SvIV(sv), 4);
2199 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2201 SvREFCNT_dec(PL_encoding);
2202 if (SvOK(sv) || SvGMAGICAL(sv)) {
2203 PL_encoding = newSVsv(sv);
2210 case '\006': /* ^F */
2211 PL_maxsysfd = SvIV(sv);
2213 case '\010': /* ^H */
2214 PL_hints = SvIV(sv);
2216 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2217 Safefree(PL_inplace);
2218 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2220 case '\017': /* ^O */
2221 if (*(mg->mg_ptr+1) == '\0') {
2222 Safefree(PL_osname);
2225 TAINT_PROPER("assigning to $^O");
2226 PL_osname = savesvpv(sv);
2229 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2230 if (!PL_compiling.cop_io)
2231 PL_compiling.cop_io = newSVsv(sv);
2233 sv_setsv(PL_compiling.cop_io,sv);
2236 case '\020': /* ^P */
2237 PL_perldb = SvIV(sv);
2238 if (PL_perldb && !PL_DBsingle)
2241 case '\024': /* ^T */
2243 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2245 PL_basetime = (Time_t)SvIV(sv);
2248 case '\025': /* ^UTF8CACHE */
2249 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2250 PL_utf8cache = (signed char) sv_2iv(sv);
2253 case '\027': /* ^W & $^WARNING_BITS */
2254 if (*(mg->mg_ptr+1) == '\0') {
2255 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2257 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2258 | (i ? G_WARN_ON : G_WARN_OFF) ;
2261 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2262 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2263 if (!SvPOK(sv) && PL_localizing) {
2264 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2265 PL_compiling.cop_warnings = pWARN_NONE;
2270 int accumulate = 0 ;
2271 int any_fatals = 0 ;
2272 const char * const ptr = SvPV_const(sv, len) ;
2273 for (i = 0 ; i < len ; ++i) {
2274 accumulate |= ptr[i] ;
2275 any_fatals |= (ptr[i] & 0xAA) ;
2278 PL_compiling.cop_warnings = pWARN_NONE;
2279 /* Yuck. I can't see how to abstract this: */
2280 else if (isWARN_on(((STRLEN *)SvPV_nolen_const(sv)) - 1,
2281 WARN_ALL) && !any_fatals) {
2282 PL_compiling.cop_warnings = pWARN_ALL;
2283 PL_dowarn |= G_WARN_ONCE ;
2287 const char *const p = SvPV_const(sv, len);
2289 PL_compiling.cop_warnings
2290 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
2293 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2294 PL_dowarn |= G_WARN_ONCE ;
2302 if (PL_localizing) {
2303 if (PL_localizing == 1)
2304 SAVESPTR(PL_last_in_gv);
2306 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2307 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2310 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2311 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2312 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2315 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2316 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2317 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2320 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
2323 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2324 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2325 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2328 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
2332 IO * const io = GvIOp(PL_defoutgv);
2335 if ((SvIV(sv)) == 0)
2336 IoFLAGS(io) &= ~IOf_FLUSH;
2338 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2339 PerlIO *ofp = IoOFP(io);
2341 (void)PerlIO_flush(ofp);
2342 IoFLAGS(io) |= IOf_FLUSH;
2348 SvREFCNT_dec(PL_rs);
2349 PL_rs = newSVsv(sv);
2353 SvREFCNT_dec(PL_ors_sv);
2354 if (SvOK(sv) || SvGMAGICAL(sv)) {
2355 PL_ors_sv = newSVsv(sv);
2363 SvREFCNT_dec(PL_ofs_sv);
2364 if (SvOK(sv) || SvGMAGICAL(sv)) {
2365 PL_ofs_sv = newSVsv(sv);
2372 CopARYBASE_set(&PL_compiling, SvIV(sv));
2375 #ifdef COMPLEX_STATUS
2376 if (PL_localizing == 2) {
2377 PL_statusvalue = LvTARGOFF(sv);
2378 PL_statusvalue_vms = LvTARGLEN(sv);
2382 #ifdef VMSISH_STATUS
2384 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2387 STATUS_UNIX_EXIT_SET(SvIV(sv));
2392 # define PERL_VMS_BANG vaxc$errno
2394 # define PERL_VMS_BANG 0
2396 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2397 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2402 if (PL_delaymagic) {
2403 PL_delaymagic |= DM_RUID;
2404 break; /* don't do magic till later */
2407 (void)setruid((Uid_t)PL_uid);
2410 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2412 #ifdef HAS_SETRESUID
2413 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2415 if (PL_uid == PL_euid) { /* special case $< = $> */
2417 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2418 if (PL_uid != 0 && PerlProc_getuid() == 0)
2419 (void)PerlProc_setuid(0);
2421 (void)PerlProc_setuid(PL_uid);
2423 PL_uid = PerlProc_getuid();
2424 Perl_croak(aTHX_ "setruid() not implemented");
2429 PL_uid = PerlProc_getuid();
2430 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2434 if (PL_delaymagic) {
2435 PL_delaymagic |= DM_EUID;
2436 break; /* don't do magic till later */
2439 (void)seteuid((Uid_t)PL_euid);
2442 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2444 #ifdef HAS_SETRESUID
2445 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2447 if (PL_euid == PL_uid) /* special case $> = $< */
2448 PerlProc_setuid(PL_euid);
2450 PL_euid = PerlProc_geteuid();
2451 Perl_croak(aTHX_ "seteuid() not implemented");
2456 PL_euid = PerlProc_geteuid();
2457 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2461 if (PL_delaymagic) {
2462 PL_delaymagic |= DM_RGID;
2463 break; /* don't do magic till later */
2466 (void)setrgid((Gid_t)PL_gid);
2469 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2471 #ifdef HAS_SETRESGID
2472 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2474 if (PL_gid == PL_egid) /* special case $( = $) */
2475 (void)PerlProc_setgid(PL_gid);
2477 PL_gid = PerlProc_getgid();
2478 Perl_croak(aTHX_ "setrgid() not implemented");
2483 PL_gid = PerlProc_getgid();
2484 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2487 #ifdef HAS_SETGROUPS
2489 const char *p = SvPV_const(sv, len);
2490 Groups_t *gary = NULL;
2495 for (i = 0; i < NGROUPS; ++i) {
2496 while (*p && !isSPACE(*p))
2503 Newx(gary, i + 1, Groups_t);
2505 Renew(gary, i + 1, Groups_t);
2509 (void)setgroups(i, gary);
2513 #else /* HAS_SETGROUPS */
2515 #endif /* HAS_SETGROUPS */
2516 if (PL_delaymagic) {
2517 PL_delaymagic |= DM_EGID;
2518 break; /* don't do magic till later */
2521 (void)setegid((Gid_t)PL_egid);
2524 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2526 #ifdef HAS_SETRESGID
2527 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2529 if (PL_egid == PL_gid) /* special case $) = $( */
2530 (void)PerlProc_setgid(PL_egid);
2532 PL_egid = PerlProc_getegid();
2533 Perl_croak(aTHX_ "setegid() not implemented");
2538 PL_egid = PerlProc_getegid();
2539 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2542 PL_chopset = SvPV_force(sv,len);
2544 #ifndef MACOS_TRADITIONAL
2546 LOCK_DOLLARZERO_MUTEX;
2547 #ifdef HAS_SETPROCTITLE
2548 /* The BSDs don't show the argv[] in ps(1) output, they
2549 * show a string from the process struct and provide
2550 * the setproctitle() routine to manipulate that. */
2551 if (PL_origalen != 1) {
2552 s = SvPV_const(sv, len);
2553 # if __FreeBSD_version > 410001
2554 /* The leading "-" removes the "perl: " prefix,
2555 * but not the "(perl) suffix from the ps(1)
2556 * output, because that's what ps(1) shows if the
2557 * argv[] is modified. */
2558 setproctitle("-%s", s);
2559 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2560 /* This doesn't really work if you assume that
2561 * $0 = 'foobar'; will wipe out 'perl' from the $0
2562 * because in ps(1) output the result will be like
2563 * sprintf("perl: %s (perl)", s)
2564 * I guess this is a security feature:
2565 * one (a user process) cannot get rid of the original name.
2567 setproctitle("%s", s);
2571 #if defined(__hpux) && defined(PSTAT_SETCMD)
2572 if (PL_origalen != 1) {
2574 s = SvPV_const(sv, len);
2575 un.pst_command = (char *)s;
2576 pstat(PSTAT_SETCMD, un, len, 0, 0);
2579 if (PL_origalen > 1) {
2580 /* PL_origalen is set in perl_parse(). */
2581 s = SvPV_force(sv,len);
2582 if (len >= (STRLEN)PL_origalen-1) {
2583 /* Longer than original, will be truncated. We assume that
2584 * PL_origalen bytes are available. */
2585 Copy(s, PL_origargv[0], PL_origalen-1, char);
2588 /* Shorter than original, will be padded. */
2589 Copy(s, PL_origargv[0], len, char);
2590 PL_origargv[0][len] = 0;
2591 memset(PL_origargv[0] + len + 1,
2592 /* Is the space counterintuitive? Yes.
2593 * (You were expecting \0?)
2594 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2597 PL_origalen - len - 1);
2599 PL_origargv[0][PL_origalen-1] = 0;
2600 for (i = 1; i < PL_origargc; i++)
2603 UNLOCK_DOLLARZERO_MUTEX;
2611 Perl_whichsig(pTHX_ const char *sig)
2613 register char* const* sigv;
2614 PERL_UNUSED_CONTEXT;
2616 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
2617 if (strEQ(sig,*sigv))
2618 return PL_sig_num[sigv - (char* const*)PL_sig_name];
2620 if (strEQ(sig,"CHLD"))
2624 if (strEQ(sig,"CLD"))
2631 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2632 Perl_sighandler(int sig, ...)
2634 Perl_sighandler(int sig)
2637 #ifdef PERL_GET_SIG_CONTEXT
2638 dTHXa(PERL_GET_SIG_CONTEXT);
2645 SV * const tSv = PL_Sv;
2649 XPV * const tXpv = PL_Xpv;
2651 if (PL_savestack_ix + 15 <= PL_savestack_max)
2653 if (PL_markstack_ptr < PL_markstack_max - 2)
2655 if (PL_scopestack_ix < PL_scopestack_max - 3)
2658 if (!PL_psig_ptr[sig]) {
2659 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2664 /* Max number of items pushed there is 3*n or 4. We cannot fix
2665 infinity, so we fix 4 (in fact 5): */
2667 PL_savestack_ix += 5; /* Protect save in progress. */
2668 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2671 PL_markstack_ptr++; /* Protect mark. */
2673 PL_scopestack_ix += 1;
2674 /* sv_2cv is too complicated, try a simpler variant first: */
2675 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2676 || SvTYPE(cv) != SVt_PVCV) {
2678 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2681 if (!cv || !CvROOT(cv)) {
2682 if (ckWARN(WARN_SIGNAL))
2683 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2684 PL_sig_name[sig], (gv ? GvENAME(gv)
2691 if(PL_psig_name[sig]) {
2692 sv = SvREFCNT_inc_NN(PL_psig_name[sig]);
2694 #if !defined(PERL_IMPLICIT_CONTEXT)
2698 sv = sv_newmortal();
2699 sv_setpv(sv,PL_sig_name[sig]);
2702 PUSHSTACKi(PERLSI_SIGNAL);
2705 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2707 struct sigaction oact;
2709 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2713 va_start(args, sig);
2714 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2717 SV *rv = newRV_noinc((SV*)sih);
2718 /* The siginfo fields signo, code, errno, pid, uid,
2719 * addr, status, and band are defined by POSIX/SUSv3. */
2720 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2721 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
2722 #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. */
2723 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
2724 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
2725 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2726 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2727 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
2728 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
2732 PUSHs(newSVpv((void*)sip, sizeof(*sip)));
2741 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2744 if (SvTRUE(ERRSV)) {
2746 #ifdef HAS_SIGPROCMASK
2747 /* Handler "died", for example to get out of a restart-able read().
2748 * Before we re-do that on its behalf re-enable the signal which was
2749 * blocked by the system when we entered.
2753 sigaddset(&set,sig);
2754 sigprocmask(SIG_UNBLOCK, &set, NULL);
2756 /* Not clear if this will work */
2757 (void)rsignal(sig, SIG_IGN);
2758 (void)rsignal(sig, PL_csighandlerp);
2760 #endif /* !PERL_MICRO */
2761 Perl_die(aTHX_ NULL);
2765 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2769 PL_scopestack_ix -= 1;
2772 PL_op = myop; /* Apparently not needed... */
2774 PL_Sv = tSv; /* Restore global temporaries. */
2781 S_restore_magic(pTHX_ const void *p)
2784 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2785 SV* const sv = mgs->mgs_sv;
2790 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2792 #ifdef PERL_OLD_COPY_ON_WRITE
2793 /* While magic was saved (and off) sv_setsv may well have seen
2794 this SV as a prime candidate for COW. */
2796 sv_force_normal_flags(sv, 0);
2800 SvFLAGS(sv) |= mgs->mgs_flags;
2803 if (SvGMAGICAL(sv)) {
2804 /* downgrade public flags to private,
2805 and discard any other private flags */
2807 U32 public = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2809 SvFLAGS(sv) &= ~( public | SVp_IOK|SVp_NOK|SVp_POK );
2810 SvFLAGS(sv) |= ( public << PRIVSHIFT );
2815 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2817 /* If we're still on top of the stack, pop us off. (That condition
2818 * will be satisfied if restore_magic was called explicitly, but *not*
2819 * if it's being called via leave_scope.)
2820 * The reason for doing this is that otherwise, things like sv_2cv()
2821 * may leave alloc gunk on the savestack, and some code
2822 * (e.g. sighandler) doesn't expect that...
2824 if (PL_savestack_ix == mgs->mgs_ss_ix)
2826 I32 popval = SSPOPINT;
2827 assert(popval == SAVEt_DESTRUCTOR_X);
2828 PL_savestack_ix -= 2;
2830 assert(popval == SAVEt_ALLOC);
2832 PL_savestack_ix -= popval;
2838 S_unwind_handler_stack(pTHX_ const void *p)
2841 const U32 flags = *(const U32*)p;
2844 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2845 #if !defined(PERL_IMPLICIT_CONTEXT)
2847 SvREFCNT_dec(PL_sig_sv);
2852 =for apidoc magic_sethint
2854 Triggered by a store to %^H, records the key/value pair to
2855 C<PL_compiling.cop_hints>. It is assumed that hints aren't storing anything
2856 that would need a deep copy. Maybe we should warn if we find a reference.
2861 Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
2864 assert(mg->mg_len == HEf_SVKEY);
2866 /* mg->mg_obj isn't being used. If needed, it would be possible to store
2867 an alternative leaf in there, with PL_compiling.cop_hints being used if
2868 it's NULL. If needed for threads, the alternative could lock a mutex,
2869 or take other more complex action. */
2871 /* Something changed in %^H, so it will need to be restored on scope exit.
2872 Doing this here saves a lot of doing it manually in perl code (and
2873 forgetting to do it, and consequent subtle errors. */
2874 PL_hints |= HINT_LOCALIZE_HH;
2875 PL_compiling.cop_hints
2876 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints,
2877 (SV *)mg->mg_ptr, newSVsv(sv));
2882 =for apidoc magic_sethint
2884 Triggered by a delete from %^H, records the key to C<PL_compiling.cop_hints>.
2889 Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
2892 assert(mg->mg_len == HEf_SVKEY);
2894 PERL_UNUSED_ARG(sv);
2896 PL_hints |= HINT_LOCALIZE_HH;
2897 PL_compiling.cop_hints
2898 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints,
2899 (SV *)mg->mg_ptr, &PL_sv_placeholder);
2905 * c-indentation-style: bsd
2907 * indent-tabs-mode: t
2910 * ex: set ts=8 sts=4 sw=4 noet: