3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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 if (!(SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK))) {
104 /* No public flags are set, so promote any private flags to public. */
105 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
110 =for apidoc mg_magical
112 Turns on the magical status of an SV. See C<sv_magic>.
118 Perl_mg_magical(pTHX_ SV *sv)
122 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
123 const MGVTBL* const vtbl = mg->mg_virtual;
125 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
129 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
136 /* is this container magic (%ENV, $1 etc), or value magic (pos, taint etc)? */
139 S_is_container_magic(const MAGIC *mg)
141 switch (mg->mg_type) {
144 case PERL_MAGIC_regex_global:
145 case PERL_MAGIC_nkeys:
146 #ifdef USE_LOCALE_COLLATE
147 case PERL_MAGIC_collxfrm:
150 case PERL_MAGIC_taint:
152 case PERL_MAGIC_vstring:
153 case PERL_MAGIC_utf8:
154 case PERL_MAGIC_substr:
155 case PERL_MAGIC_defelem:
156 case PERL_MAGIC_arylen:
158 case PERL_MAGIC_backref:
159 case PERL_MAGIC_arylen_p:
160 case PERL_MAGIC_rhash:
161 case PERL_MAGIC_symtab:
171 Do magic after a value is retrieved from the SV. See C<sv_magic>.
177 Perl_mg_get(pTHX_ SV *sv)
180 const I32 mgs_ix = SSNEW(sizeof(MGS));
181 const bool was_temp = (bool)SvTEMP(sv);
183 MAGIC *newmg, *head, *cur, *mg;
184 /* guard against sv having being freed midway by holding a private
187 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
188 cause the SV's buffer to get stolen (and maybe other stuff).
191 sv_2mortal(SvREFCNT_inc_simple_NN(sv));
196 save_magic(mgs_ix, sv);
198 /* We must call svt_get(sv, mg) for each valid entry in the linked
199 list of magic. svt_get() may delete the current entry, add new
200 magic to the head of the list, or upgrade the SV. AMS 20010810 */
202 newmg = cur = head = mg = SvMAGIC(sv);
204 const MGVTBL * const vtbl = mg->mg_virtual;
206 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
207 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
209 /* guard against magic having been deleted - eg FETCH calling
214 /* Don't restore the flags for this entry if it was deleted. */
215 if (mg->mg_flags & MGf_GSKIP)
216 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
219 mg = mg->mg_moremagic;
222 /* Have we finished with the new entries we saw? Start again
223 where we left off (unless there are more new entries). */
231 /* Were any new entries added? */
232 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
239 restore_magic(INT2PTR(void *, (IV)mgs_ix));
241 if (SvREFCNT(sv) == 1) {
242 /* We hold the last reference to this SV, which implies that the
243 SV was deleted as a side effect of the routines we called. */
252 Do magic after a value is assigned to the SV. See C<sv_magic>.
258 Perl_mg_set(pTHX_ SV *sv)
261 const I32 mgs_ix = SSNEW(sizeof(MGS));
265 save_magic(mgs_ix, sv);
267 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
268 const MGVTBL* vtbl = mg->mg_virtual;
269 nextmg = mg->mg_moremagic; /* it may delete itself */
270 if (mg->mg_flags & MGf_GSKIP) {
271 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
272 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
274 if (vtbl && vtbl->svt_set)
275 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
278 restore_magic(INT2PTR(void*, (IV)mgs_ix));
283 =for apidoc mg_length
285 Report on the SV's length. See C<sv_magic>.
291 Perl_mg_length(pTHX_ SV *sv)
297 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
298 const MGVTBL * const vtbl = mg->mg_virtual;
299 if (vtbl && vtbl->svt_len) {
300 const I32 mgs_ix = SSNEW(sizeof(MGS));
301 save_magic(mgs_ix, sv);
302 /* omit MGf_GSKIP -- not changed here */
303 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
304 restore_magic(INT2PTR(void*, (IV)mgs_ix));
310 const U8 *s = (U8*)SvPV_const(sv, len);
311 len = utf8_length(s, s + len);
314 (void)SvPV_const(sv, len);
319 Perl_mg_size(pTHX_ SV *sv)
323 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
324 const MGVTBL* const vtbl = mg->mg_virtual;
325 if (vtbl && vtbl->svt_len) {
326 const I32 mgs_ix = SSNEW(sizeof(MGS));
328 save_magic(mgs_ix, sv);
329 /* omit MGf_GSKIP -- not changed here */
330 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
331 restore_magic(INT2PTR(void*, (IV)mgs_ix));
338 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
342 Perl_croak(aTHX_ "Size magic not implemented");
351 Clear something magical that the SV represents. See C<sv_magic>.
357 Perl_mg_clear(pTHX_ SV *sv)
359 const I32 mgs_ix = SSNEW(sizeof(MGS));
362 save_magic(mgs_ix, sv);
364 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
365 const MGVTBL* const vtbl = mg->mg_virtual;
366 /* omit GSKIP -- never set here */
368 if (vtbl && vtbl->svt_clear)
369 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
372 restore_magic(INT2PTR(void*, (IV)mgs_ix));
379 Finds the magic pointer for type matching the SV. See C<sv_magic>.
385 Perl_mg_find(pTHX_ const SV *sv, int type)
390 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
391 if (mg->mg_type == type)
401 Copies the magic from one SV to another. See C<sv_magic>.
407 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
411 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
412 const MGVTBL* const vtbl = mg->mg_virtual;
413 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
414 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
417 const char type = mg->mg_type;
418 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
420 (type == PERL_MAGIC_tied)
422 : (type == PERL_MAGIC_regdata && mg->mg_obj)
425 toLOWER(type), key, klen);
434 =for apidoc mg_localize
436 Copy some of the magic from an existing SV to new localized version of
437 that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
438 doesn't (eg taint, pos).
444 Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
448 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
449 const MGVTBL* const vtbl = mg->mg_virtual;
450 if (!S_is_container_magic(mg))
453 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
454 (void)CALL_FPTR(vtbl->svt_local)(aTHX_ nsv, mg);
456 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
457 mg->mg_ptr, mg->mg_len);
459 /* container types should remain read-only across localization */
460 SvFLAGS(nsv) |= SvREADONLY(sv);
463 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
464 SvFLAGS(nsv) |= SvMAGICAL(sv);
474 Free any magic storage used by the SV. See C<sv_magic>.
480 Perl_mg_free(pTHX_ SV *sv)
484 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
485 const MGVTBL* const vtbl = mg->mg_virtual;
486 moremagic = mg->mg_moremagic;
487 if (vtbl && vtbl->svt_free)
488 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
489 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
490 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
491 Safefree(mg->mg_ptr);
492 else if (mg->mg_len == HEf_SVKEY)
493 SvREFCNT_dec((SV*)mg->mg_ptr);
495 if (mg->mg_flags & MGf_REFCOUNTED)
496 SvREFCNT_dec(mg->mg_obj);
499 SvMAGIC_set(sv, NULL);
506 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
512 register const REGEXP * const rx = PM_GETRE(PL_curpm);
514 if (mg->mg_obj) { /* @+ */
515 /* return the number possible */
518 I32 paren = rx->lastparen;
520 /* return the last filled */
522 && (rx->startp[paren] == -1 || rx->endp[paren] == -1) )
533 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
537 register const REGEXP * const rx = PM_GETRE(PL_curpm);
539 register const I32 paren = mg->mg_len;
544 if (paren <= (I32)rx->nparens &&
545 (s = rx->startp[paren]) != -1 &&
546 (t = rx->endp[paren]) != -1)
549 if (mg->mg_obj) /* @+ */
554 if (i > 0 && RX_MATCH_UTF8(rx)) {
555 const char * const b = rx->subbeg;
557 i = utf8_length((U8*)b, (U8*)(b+i));
568 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
572 Perl_croak(aTHX_ PL_no_modify);
573 NORETURN_FUNCTION_END;
577 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
582 register const REGEXP *rx;
585 switch (*mg->mg_ptr) {
586 case '1': case '2': case '3': case '4':
587 case '5': case '6': case '7': case '8': case '9': case '&':
588 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
590 paren = atoi(mg->mg_ptr); /* $& is in [0] */
592 if (paren <= (I32)rx->nparens &&
593 (s1 = rx->startp[paren]) != -1 &&
594 (t1 = rx->endp[paren]) != -1)
598 if (i > 0 && RX_MATCH_UTF8(rx)) {
599 const char * const s = rx->subbeg + s1;
604 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
608 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
612 if (ckWARN(WARN_UNINITIALIZED))
617 if (ckWARN(WARN_UNINITIALIZED))
622 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
623 paren = rx->lastparen;
628 case '\016': /* ^N */
629 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
630 paren = rx->lastcloseparen;
636 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
637 if (rx->startp[0] != -1) {
648 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
649 if (rx->endp[0] != -1) {
650 i = rx->sublen - rx->endp[0];
661 if (!SvPOK(sv) && SvNIOK(sv)) {
669 #define SvRTRIM(sv) STMT_START { \
671 STRLEN len = SvCUR(sv); \
672 char * const p = SvPVX(sv); \
673 while (len > 0 && isSPACE(p[len-1])) \
675 SvCUR_set(sv, len); \
681 Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
683 if (!(CopHINTS_get(c) & (HINT_LEXICAL_IO_IN|HINT_LEXICAL_IO_OUT)))
684 sv_setsv(sv, &PL_sv_undef);
688 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_IN)) {
689 SV *const value = Perl_refcounted_he_fetch(aTHX_
691 0, "open<", 5, 0, 0);
696 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_OUT)) {
697 SV *const value = Perl_refcounted_he_fetch(aTHX_
699 0, "open>", 5, 0, 0);
707 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
711 register char *s = NULL;
713 const char * const remaining = mg->mg_ptr + 1;
714 const char nextchar = *remaining;
716 switch (*mg->mg_ptr) {
717 case '\001': /* ^A */
718 sv_setsv(sv, PL_bodytarget);
720 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
721 if (nextchar == '\0') {
722 sv_setiv(sv, (IV)PL_minus_c);
724 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
725 sv_setiv(sv, (IV)STATUS_NATIVE);
729 case '\004': /* ^D */
730 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
732 case '\005': /* ^E */
733 if (nextchar == '\0') {
734 #if defined(MACOS_TRADITIONAL)
738 sv_setnv(sv,(double)gMacPerl_OSErr);
739 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
743 # include <descrip.h>
744 # include <starlet.h>
746 $DESCRIPTOR(msgdsc,msg);
747 sv_setnv(sv,(NV) vaxc$errno);
748 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
749 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
754 if (!(_emx_env & 0x200)) { /* Under DOS */
755 sv_setnv(sv, (NV)errno);
756 sv_setpv(sv, errno ? Strerror(errno) : "");
758 if (errno != errno_isOS2) {
759 const int tmp = _syserrno();
760 if (tmp) /* 2nd call to _syserrno() makes it 0 */
763 sv_setnv(sv, (NV)Perl_rc);
764 sv_setpv(sv, os2error(Perl_rc));
768 const DWORD dwErr = GetLastError();
769 sv_setnv(sv, (NV)dwErr);
771 PerlProc_GetOSError(sv, dwErr);
774 sv_setpvn(sv, "", 0);
779 const int saveerrno = errno;
780 sv_setnv(sv, (NV)errno);
781 sv_setpv(sv, errno ? Strerror(errno) : "");
786 SvNOK_on(sv); /* what a wonderful hack! */
788 else if (strEQ(remaining, "NCODING"))
789 sv_setsv(sv, PL_encoding);
791 case '\006': /* ^F */
792 sv_setiv(sv, (IV)PL_maxsysfd);
794 case '\010': /* ^H */
795 sv_setiv(sv, (IV)PL_hints);
797 case '\011': /* ^I */ /* NOT \t in EBCDIC */
799 sv_setpv(sv, PL_inplace);
801 sv_setsv(sv, &PL_sv_undef);
803 case '\017': /* ^O & ^OPEN */
804 if (nextchar == '\0') {
805 sv_setpv(sv, PL_osname);
808 else if (strEQ(remaining, "PEN")) {
809 Perl_emulate_cop_io(aTHX_ &PL_compiling, sv);
813 if (nextchar == '\0') { /* ^P */
814 sv_setiv(sv, (IV)PL_perldb);
815 } else if (strEQ(remaining, "REMATCH")) { /* $^PREMATCH */
816 goto do_prematch_fetch;
817 } else if (strEQ(remaining, "OSTMATCH")) { /* $^POSTMATCH */
818 goto do_postmatch_fetch;
821 case '\023': /* ^S */
822 if (nextchar == '\0') {
823 if (PL_lex_state != LEX_NOTPARSING)
826 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
831 case '\024': /* ^T */
832 if (nextchar == '\0') {
834 sv_setnv(sv, PL_basetime);
836 sv_setiv(sv, (IV)PL_basetime);
839 else if (strEQ(remaining, "AINT"))
840 sv_setiv(sv, PL_tainting
841 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
844 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
845 if (strEQ(remaining, "NICODE"))
846 sv_setuv(sv, (UV) PL_unicode);
847 else if (strEQ(remaining, "TF8LOCALE"))
848 sv_setuv(sv, (UV) PL_utf8locale);
849 else if (strEQ(remaining, "TF8CACHE"))
850 sv_setiv(sv, (IV) PL_utf8cache);
852 case '\027': /* ^W & $^WARNING_BITS */
853 if (nextchar == '\0')
854 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
855 else if (strEQ(remaining, "ARNING_BITS")) {
856 if (PL_compiling.cop_warnings == pWARN_NONE) {
857 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
859 else if (PL_compiling.cop_warnings == pWARN_STD) {
862 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
866 else if (PL_compiling.cop_warnings == pWARN_ALL) {
867 /* Get the bit mask for $warnings::Bits{all}, because
868 * it could have been extended by warnings::register */
869 HV * const bits=get_hv("warnings::Bits", FALSE);
871 SV ** const bits_all = hv_fetchs(bits, "all", FALSE);
873 sv_setsv(sv, *bits_all);
876 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
880 sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
881 *PL_compiling.cop_warnings);
886 case '\015': /* $^MATCH */
887 if (strEQ(remaining, "ATCH")) {
888 case '1': case '2': case '3': case '4':
889 case '5': case '6': case '7': case '8': case '9': case '&':
890 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
892 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
893 * XXX Does the new way break anything?
895 paren = atoi(mg->mg_ptr); /* $& is in [0] */
896 CALLREG_NUMBUF(rx,paren,sv);
899 sv_setsv(sv,&PL_sv_undef);
903 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
905 CALLREG_NUMBUF(rx,rx->lastparen,sv);
909 sv_setsv(sv,&PL_sv_undef);
911 case '\016': /* ^N */
912 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
913 if (rx->lastcloseparen) {
914 CALLREG_NUMBUF(rx,rx->lastcloseparen,sv);
919 sv_setsv(sv,&PL_sv_undef);
923 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
924 CALLREG_NUMBUF(rx,-2,sv);
927 sv_setsv(sv,&PL_sv_undef);
931 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
932 CALLREG_NUMBUF(rx,-1,sv);
935 sv_setsv(sv,&PL_sv_undef);
938 if (GvIO(PL_last_in_gv)) {
939 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
944 sv_setiv(sv, (IV)STATUS_CURRENT);
945 #ifdef COMPLEX_STATUS
946 LvTARGOFF(sv) = PL_statusvalue;
947 LvTARGLEN(sv) = PL_statusvalue_vms;
952 if (GvIOp(PL_defoutgv))
953 s = IoTOP_NAME(GvIOp(PL_defoutgv));
957 sv_setpv(sv,GvENAME(PL_defoutgv));
962 if (GvIOp(PL_defoutgv))
963 s = IoFMT_NAME(GvIOp(PL_defoutgv));
965 s = GvENAME(PL_defoutgv);
969 if (GvIOp(PL_defoutgv))
970 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
973 if (GvIOp(PL_defoutgv))
974 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
977 if (GvIOp(PL_defoutgv))
978 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
985 sv_setiv(sv, (IV)CopARYBASE_get(PL_curcop));
988 if (GvIOp(PL_defoutgv))
989 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
995 sv_copypv(sv, PL_ors_sv);
999 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
1000 sv_setpv(sv, errno ? Strerror(errno) : "");
1003 const int saveerrno = errno;
1004 sv_setnv(sv, (NV)errno);
1006 if (errno == errno_isOS2 || errno == errno_isOS2_set)
1007 sv_setpv(sv, os2error(Perl_rc));
1010 sv_setpv(sv, errno ? Strerror(errno) : "");
1015 SvNOK_on(sv); /* what a wonderful hack! */
1018 sv_setiv(sv, (IV)PL_uid);
1021 sv_setiv(sv, (IV)PL_euid);
1024 sv_setiv(sv, (IV)PL_gid);
1027 sv_setiv(sv, (IV)PL_egid);
1029 #ifdef HAS_GETGROUPS
1031 Groups_t *gary = NULL;
1032 I32 i, num_groups = getgroups(0, gary);
1033 Newx(gary, num_groups, Groups_t);
1034 num_groups = getgroups(num_groups, gary);
1035 for (i = 0; i < num_groups; i++)
1036 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1039 (void)SvIOK_on(sv); /* what a wonderful hack! */
1042 #ifndef MACOS_TRADITIONAL
1051 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1053 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1055 if (uf && uf->uf_val)
1056 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1061 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1064 STRLEN len = 0, klen;
1065 const char *s = SvOK(sv) ? SvPV_const(sv,len) : "";
1066 const char * const ptr = MgPV_const(mg,klen);
1069 #ifdef DYNAMIC_ENV_FETCH
1070 /* We just undefd an environment var. Is a replacement */
1071 /* waiting in the wings? */
1073 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1075 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1079 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1080 /* And you'll never guess what the dog had */
1081 /* in its mouth... */
1083 MgTAINTEDDIR_off(mg);
1085 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1086 char pathbuf[256], eltbuf[256], *cp, *elt;
1090 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1092 do { /* DCL$PATH may be a search list */
1093 while (1) { /* as may dev portion of any element */
1094 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1095 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1096 cando_by_name(S_IWUSR,0,elt) ) {
1097 MgTAINTEDDIR_on(mg);
1101 if ((cp = strchr(elt, ':')) != NULL)
1103 if (my_trnlnm(elt, eltbuf, j++))
1109 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1112 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1113 const char * const strend = s + len;
1115 while (s < strend) {
1119 #ifdef VMS /* Hmm. How do we get $Config{path_sep} from C? */
1120 const char path_sep = '|';
1122 const char path_sep = ':';
1124 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1125 s, strend, path_sep, &i);
1127 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1129 || !strchr(tmpbuf, ':') /* no colon thus no device name -- assume relative path */
1131 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1133 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1134 MgTAINTEDDIR_on(mg);
1140 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1146 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1148 PERL_UNUSED_ARG(sv);
1149 my_setenv(MgPV_nolen_const(mg),NULL);
1154 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1157 PERL_UNUSED_ARG(mg);
1159 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1161 if (PL_localizing) {
1164 hv_iterinit((HV*)sv);
1165 while ((entry = hv_iternext((HV*)sv))) {
1167 my_setenv(hv_iterkey(entry, &keylen),
1168 SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1176 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1179 PERL_UNUSED_ARG(sv);
1180 PERL_UNUSED_ARG(mg);
1182 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1190 #ifdef HAS_SIGPROCMASK
1192 restore_sigmask(pTHX_ SV *save_sv)
1194 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1195 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1199 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1202 /* Are we fetching a signal entry? */
1203 const I32 i = whichsig(MgPV_nolen_const(mg));
1206 sv_setsv(sv,PL_psig_ptr[i]);
1208 Sighandler_t sigstate = rsignal_state(i);
1209 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1210 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1213 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1214 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1217 /* cache state so we don't fetch it again */
1218 if(sigstate == (Sighandler_t) SIG_IGN)
1219 sv_setpvs(sv,"IGNORE");
1221 sv_setsv(sv,&PL_sv_undef);
1222 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1229 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1231 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1232 * refactoring might be in order.
1235 register const char * const s = MgPV_nolen_const(mg);
1236 PERL_UNUSED_ARG(sv);
1239 if (strEQ(s,"__DIE__"))
1241 else if (strEQ(s,"__WARN__") && PL_warnhook != PERL_WARNHOOK_FATAL)
1244 SV *const to_dec = *svp;
1246 SvREFCNT_dec(to_dec);
1250 /* Are we clearing a signal entry? */
1251 const I32 i = whichsig(s);
1253 #ifdef HAS_SIGPROCMASK
1256 /* Avoid having the signal arrive at a bad time, if possible. */
1259 sigprocmask(SIG_BLOCK, &set, &save);
1261 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1262 SAVEFREESV(save_sv);
1263 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1266 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1267 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1269 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1270 PL_sig_defaulting[i] = 1;
1271 (void)rsignal(i, PL_csighandlerp);
1273 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1275 if(PL_psig_name[i]) {
1276 SvREFCNT_dec(PL_psig_name[i]);
1279 if(PL_psig_ptr[i]) {
1280 SV * const to_dec=PL_psig_ptr[i];
1283 SvREFCNT_dec(to_dec);
1293 * The signal handling nomenclature has gotten a bit confusing since the advent of
1294 * safe signals. S_raise_signal only raises signals by analogy with what the
1295 * underlying system's signal mechanism does. It might be more proper to say that
1296 * it defers signals that have already been raised and caught.
1298 * PL_sig_pending and PL_psig_pend likewise do not track signals that are pending
1299 * in the sense of being on the system's signal queue in between raising and delivery.
1300 * They are only pending on Perl's deferral list, i.e., they track deferred signals
1301 * awaiting delivery after the current Perl opcode completes and say nothing about
1302 * signals raised but not yet caught in the underlying signal implementation.
1305 #ifndef SIG_PENDING_DIE_COUNT
1306 # define SIG_PENDING_DIE_COUNT 120
1310 S_raise_signal(pTHX_ int sig)
1313 /* Set a flag to say this signal is pending */
1314 PL_psig_pend[sig]++;
1315 /* And one to say _a_ signal is pending */
1316 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1317 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1318 (unsigned long)SIG_PENDING_DIE_COUNT);
1322 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1323 Perl_csighandler(int sig, ...)
1325 Perl_csighandler(int sig)
1328 #ifdef PERL_GET_SIG_CONTEXT
1329 dTHXa(PERL_GET_SIG_CONTEXT);
1333 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1334 (void) rsignal(sig, PL_csighandlerp);
1335 if (PL_sig_ignoring[sig]) return;
1337 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1338 if (PL_sig_defaulting[sig])
1339 #ifdef KILL_BY_SIGPRC
1340 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1355 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1356 /* Call the perl level handler now--
1357 * with risk we may be in malloc() etc. */
1358 (*PL_sighandlerp)(sig);
1360 S_raise_signal(aTHX_ sig);
1363 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1365 Perl_csighandler_init(void)
1368 if (PL_sig_handlers_initted) return;
1370 for (sig = 1; sig < SIG_SIZE; sig++) {
1371 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1373 PL_sig_defaulting[sig] = 1;
1374 (void) rsignal(sig, PL_csighandlerp);
1376 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1377 PL_sig_ignoring[sig] = 0;
1380 PL_sig_handlers_initted = 1;
1385 Perl_despatch_signals(pTHX)
1390 for (sig = 1; sig < SIG_SIZE; sig++) {
1391 if (PL_psig_pend[sig]) {
1392 PERL_BLOCKSIG_ADD(set, sig);
1393 PL_psig_pend[sig] = 0;
1394 PERL_BLOCKSIG_BLOCK(set);
1395 (*PL_sighandlerp)(sig);
1396 PERL_BLOCKSIG_UNBLOCK(set);
1402 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1407 /* Need to be careful with SvREFCNT_dec(), because that can have side
1408 * effects (due to closures). We must make sure that the new disposition
1409 * is in place before it is called.
1413 #ifdef HAS_SIGPROCMASK
1418 register const char *s = MgPV_const(mg,len);
1420 if (strEQ(s,"__DIE__"))
1422 else if (strEQ(s,"__WARN__"))
1425 Perl_croak(aTHX_ "No such hook: %s", s);
1428 if (*svp != PERL_WARNHOOK_FATAL)
1434 i = whichsig(s); /* ...no, a brick */
1436 if (ckWARN(WARN_SIGNAL))
1437 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1440 #ifdef HAS_SIGPROCMASK
1441 /* Avoid having the signal arrive at a bad time, if possible. */
1444 sigprocmask(SIG_BLOCK, &set, &save);
1446 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1447 SAVEFREESV(save_sv);
1448 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1451 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1452 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1454 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1455 PL_sig_ignoring[i] = 0;
1457 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1458 PL_sig_defaulting[i] = 0;
1460 SvREFCNT_dec(PL_psig_name[i]);
1461 to_dec = PL_psig_ptr[i];
1462 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1463 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1464 PL_psig_name[i] = newSVpvn(s, len);
1465 SvREADONLY_on(PL_psig_name[i]);
1467 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1469 (void)rsignal(i, PL_csighandlerp);
1470 #ifdef HAS_SIGPROCMASK
1475 *svp = SvREFCNT_inc_simple_NN(sv);
1477 SvREFCNT_dec(to_dec);
1480 s = SvOK(sv) ? SvPV_force(sv,len) : "DEFAULT";
1481 if (strEQ(s,"IGNORE")) {
1483 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1484 PL_sig_ignoring[i] = 1;
1485 (void)rsignal(i, PL_csighandlerp);
1487 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1491 else if (strEQ(s,"DEFAULT") || !*s) {
1493 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1495 PL_sig_defaulting[i] = 1;
1496 (void)rsignal(i, PL_csighandlerp);
1499 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1504 * We should warn if HINT_STRICT_REFS, but without
1505 * access to a known hint bit in a known OP, we can't
1506 * tell whether HINT_STRICT_REFS is in force or not.
1508 if (!strchr(s,':') && !strchr(s,'\''))
1509 Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"));
1511 (void)rsignal(i, PL_csighandlerp);
1513 *svp = SvREFCNT_inc_simple_NN(sv);
1515 #ifdef HAS_SIGPROCMASK
1520 SvREFCNT_dec(to_dec);
1523 #endif /* !PERL_MICRO */
1526 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1529 PERL_UNUSED_ARG(sv);
1530 PERL_UNUSED_ARG(mg);
1531 PL_sub_generation++;
1536 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1539 PERL_UNUSED_ARG(sv);
1540 PERL_UNUSED_ARG(mg);
1541 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1542 PL_amagic_generation++;
1548 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1550 HV * const hv = (HV*)LvTARG(sv);
1552 PERL_UNUSED_ARG(mg);
1555 (void) hv_iterinit(hv);
1556 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1559 while (hv_iternext(hv))
1564 sv_setiv(sv, (IV)i);
1569 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1571 PERL_UNUSED_ARG(mg);
1573 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1578 /* caller is responsible for stack switching/cleanup */
1580 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1587 PUSHs(SvTIED_obj(sv, mg));
1590 if (mg->mg_len >= 0)
1591 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1592 else if (mg->mg_len == HEf_SVKEY)
1593 PUSHs((SV*)mg->mg_ptr);
1595 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1596 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1604 return call_method(meth, flags);
1608 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1614 PUSHSTACKi(PERLSI_MAGIC);
1616 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1617 sv_setsv(sv, *PL_stack_sp--);
1627 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1630 mg->mg_flags |= MGf_GSKIP;
1631 magic_methpack(sv,mg,"FETCH");
1636 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1640 PUSHSTACKi(PERLSI_MAGIC);
1641 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1648 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1650 return magic_methpack(sv,mg,"DELETE");
1655 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1662 PUSHSTACKi(PERLSI_MAGIC);
1663 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1664 sv = *PL_stack_sp--;
1665 retval = (U32) SvIV(sv)-1;
1674 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1679 PUSHSTACKi(PERLSI_MAGIC);
1681 XPUSHs(SvTIED_obj(sv, mg));
1683 call_method("CLEAR", G_SCALAR|G_DISCARD);
1691 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1694 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1698 PUSHSTACKi(PERLSI_MAGIC);
1701 PUSHs(SvTIED_obj(sv, mg));
1706 if (call_method(meth, G_SCALAR))
1707 sv_setsv(key, *PL_stack_sp--);
1716 Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
1718 return magic_methpack(sv,mg,"EXISTS");
1722 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1726 SV * const tied = SvTIED_obj((SV*)hv, mg);
1727 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1729 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1731 if (HvEITER_get(hv))
1732 /* we are in an iteration so the hash cannot be empty */
1734 /* no xhv_eiter so now use FIRSTKEY */
1735 key = sv_newmortal();
1736 magic_nextpack((SV*)hv, mg, key);
1737 HvEITER_set(hv, NULL); /* need to reset iterator */
1738 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1741 /* there is a SCALAR method that we can call */
1743 PUSHSTACKi(PERLSI_MAGIC);
1749 if (call_method("SCALAR", G_SCALAR))
1750 retval = *PL_stack_sp--;
1752 retval = &PL_sv_undef;
1759 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1762 GV * const gv = PL_DBline;
1763 const I32 i = SvTRUE(sv);
1764 SV ** const svp = av_fetch(GvAV(gv),
1765 atoi(MgPV_nolen_const(mg)), FALSE);
1766 if (svp && SvIOKp(*svp)) {
1767 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1769 /* set or clear breakpoint in the relevant control op */
1771 o->op_flags |= OPf_SPECIAL;
1773 o->op_flags &= ~OPf_SPECIAL;
1780 Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1783 const AV * const obj = (AV*)mg->mg_obj;
1785 sv_setiv(sv, AvFILL(obj) + CopARYBASE_get(PL_curcop));
1793 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1796 AV * const obj = (AV*)mg->mg_obj;
1798 av_fill(obj, SvIV(sv) - CopARYBASE_get(PL_curcop));
1800 if (ckWARN(WARN_MISC))
1801 Perl_warner(aTHX_ packWARN(WARN_MISC),
1802 "Attempt to set length of freed array");
1808 Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1811 PERL_UNUSED_ARG(sv);
1812 /* during global destruction, mg_obj may already have been freed */
1813 if (PL_in_clean_all)
1816 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1819 /* arylen scalar holds a pointer back to the array, but doesn't own a
1820 reference. Hence the we (the array) are about to go away with it
1821 still pointing at us. Clear its pointer, else it would be pointing
1822 at free memory. See the comment in sv_magic about reference loops,
1823 and why it can't own a reference to us. */
1830 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1833 SV* const lsv = LvTARG(sv);
1834 PERL_UNUSED_ARG(mg);
1836 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1837 MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
1838 if (found && found->mg_len >= 0) {
1839 I32 i = found->mg_len;
1841 sv_pos_b2u(lsv, &i);
1842 sv_setiv(sv, i + CopARYBASE_get(PL_curcop));
1851 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1854 SV* const lsv = LvTARG(sv);
1860 PERL_UNUSED_ARG(mg);
1862 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1863 found = mg_find(lsv, PERL_MAGIC_regex_global);
1869 #ifdef PERL_OLD_COPY_ON_WRITE
1871 sv_force_normal_flags(lsv, 0);
1873 found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
1876 else if (!SvOK(sv)) {
1880 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1882 pos = SvIV(sv) - CopARYBASE_get(PL_curcop);
1885 ulen = sv_len_utf8(lsv);
1895 else if (pos > (SSize_t)len)
1900 sv_pos_u2b(lsv, &p, 0);
1904 found->mg_len = pos;
1905 found->mg_flags &= ~MGf_MINMATCH;
1911 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1914 PERL_UNUSED_ARG(mg);
1918 if (isGV_with_GP(sv)) {
1919 /* We're actually already a typeglob, so don't need the stuff below.
1923 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
1928 GvGP(sv) = gp_ref(GvGP(gv));
1933 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1936 SV * const lsv = LvTARG(sv);
1937 const char * const tmps = SvPV_const(lsv,len);
1938 I32 offs = LvTARGOFF(sv);
1939 I32 rem = LvTARGLEN(sv);
1940 PERL_UNUSED_ARG(mg);
1943 sv_pos_u2b(lsv, &offs, &rem);
1944 if (offs > (I32)len)
1946 if (rem + offs > (I32)len)
1948 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1955 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1959 const char * const tmps = SvPV_const(sv, len);
1960 SV * const lsv = LvTARG(sv);
1961 I32 lvoff = LvTARGOFF(sv);
1962 I32 lvlen = LvTARGLEN(sv);
1963 PERL_UNUSED_ARG(mg);
1966 sv_utf8_upgrade(lsv);
1967 sv_pos_u2b(lsv, &lvoff, &lvlen);
1968 sv_insert(lsv, lvoff, lvlen, tmps, len);
1969 LvTARGLEN(sv) = sv_len_utf8(sv);
1972 else if (lsv && SvUTF8(lsv)) {
1974 sv_pos_u2b(lsv, &lvoff, &lvlen);
1975 LvTARGLEN(sv) = len;
1976 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
1977 sv_insert(lsv, lvoff, lvlen, utf8, len);
1981 sv_insert(lsv, lvoff, lvlen, tmps, len);
1982 LvTARGLEN(sv) = len;
1990 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1993 PERL_UNUSED_ARG(sv);
1994 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
1999 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
2002 PERL_UNUSED_ARG(sv);
2003 /* update taint status unless we're restoring at scope exit */
2004 if (PL_localizing != 2) {
2014 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
2016 SV * const lsv = LvTARG(sv);
2017 PERL_UNUSED_ARG(mg);
2020 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
2028 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
2030 PERL_UNUSED_ARG(mg);
2031 do_vecset(sv); /* XXX slurp this routine */
2036 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2040 if (LvTARGLEN(sv)) {
2042 SV * const ahv = LvTARG(sv);
2043 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
2048 AV* const av = (AV*)LvTARG(sv);
2049 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
2050 targ = AvARRAY(av)[LvTARGOFF(sv)];
2052 if (targ && (targ != &PL_sv_undef)) {
2053 /* somebody else defined it for us */
2054 SvREFCNT_dec(LvTARG(sv));
2055 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2057 SvREFCNT_dec(mg->mg_obj);
2059 mg->mg_flags &= ~MGf_REFCOUNTED;
2064 sv_setsv(sv, targ ? targ : &PL_sv_undef);
2069 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2071 PERL_UNUSED_ARG(mg);
2075 sv_setsv(LvTARG(sv), sv);
2076 SvSETMAGIC(LvTARG(sv));
2082 Perl_vivify_defelem(pTHX_ SV *sv)
2088 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2091 SV * const ahv = LvTARG(sv);
2092 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
2095 if (!value || value == &PL_sv_undef)
2096 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
2099 AV* const av = (AV*)LvTARG(sv);
2100 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2101 LvTARG(sv) = NULL; /* array can't be extended */
2103 SV* const * const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2104 if (!svp || (value = *svp) == &PL_sv_undef)
2105 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2108 SvREFCNT_inc_simple_void(value);
2109 SvREFCNT_dec(LvTARG(sv));
2112 SvREFCNT_dec(mg->mg_obj);
2114 mg->mg_flags &= ~MGf_REFCOUNTED;
2118 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2120 return Perl_sv_kill_backrefs(aTHX_ sv, (AV*)mg->mg_obj);
2124 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2126 PERL_UNUSED_CONTEXT;
2133 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2135 PERL_UNUSED_ARG(mg);
2136 sv_unmagic(sv, PERL_MAGIC_bm);
2143 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2145 PERL_UNUSED_ARG(mg);
2146 sv_unmagic(sv, PERL_MAGIC_fm);
2152 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2154 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2156 if (uf && uf->uf_set)
2157 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2162 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2164 PERL_UNUSED_ARG(mg);
2165 sv_unmagic(sv, PERL_MAGIC_qr);
2170 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2173 regexp * const re = (regexp *)mg->mg_obj;
2174 PERL_UNUSED_ARG(sv);
2180 #ifdef USE_LOCALE_COLLATE
2182 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2185 * RenE<eacute> Descartes said "I think not."
2186 * and vanished with a faint plop.
2188 PERL_UNUSED_CONTEXT;
2189 PERL_UNUSED_ARG(sv);
2191 Safefree(mg->mg_ptr);
2197 #endif /* USE_LOCALE_COLLATE */
2199 /* Just clear the UTF-8 cache data. */
2201 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2203 PERL_UNUSED_CONTEXT;
2204 PERL_UNUSED_ARG(sv);
2205 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2207 mg->mg_len = -1; /* The mg_len holds the len cache. */
2212 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2215 register const char *s;
2218 switch (*mg->mg_ptr) {
2219 case '\001': /* ^A */
2220 sv_setsv(PL_bodytarget, sv);
2222 case '\003': /* ^C */
2223 PL_minus_c = (bool)SvIV(sv);
2226 case '\004': /* ^D */
2228 s = SvPV_nolen_const(sv);
2229 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2230 DEBUG_x(dump_all());
2232 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2235 case '\005': /* ^E */
2236 if (*(mg->mg_ptr+1) == '\0') {
2237 #ifdef MACOS_TRADITIONAL
2238 gMacPerl_OSErr = SvIV(sv);
2241 set_vaxc_errno(SvIV(sv));
2244 SetLastError( SvIV(sv) );
2247 os2_setsyserrno(SvIV(sv));
2249 /* will anyone ever use this? */
2250 SETERRNO(SvIV(sv), 4);
2256 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2258 SvREFCNT_dec(PL_encoding);
2259 if (SvOK(sv) || SvGMAGICAL(sv)) {
2260 PL_encoding = newSVsv(sv);
2267 case '\006': /* ^F */
2268 PL_maxsysfd = SvIV(sv);
2270 case '\010': /* ^H */
2271 PL_hints = SvIV(sv);
2273 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2274 Safefree(PL_inplace);
2275 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2277 case '\017': /* ^O */
2278 if (*(mg->mg_ptr+1) == '\0') {
2279 Safefree(PL_osname);
2282 TAINT_PROPER("assigning to $^O");
2283 PL_osname = savesvpv(sv);
2286 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2288 const char *const start = SvPV(sv, len);
2289 const char *out = (const char*)memchr(start, '\0', len);
2291 struct refcounted_he *tmp_he;
2294 PL_compiling.cop_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2296 |= HINT_LOCALIZE_HH | HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2298 /* Opening for input is more common than opening for output, so
2299 ensure that hints for input are sooner on linked list. */
2300 tmp = sv_2mortal(out ? newSVpvn(out + 1, start + len - out - 1)
2302 SvFLAGS(tmp) |= SvUTF8(sv);
2305 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2306 sv_2mortal(newSVpvs("open>")), tmp);
2308 /* The UTF-8 setting is carried over */
2309 sv_setpvn(tmp, start, out ? (STRLEN)(out - start) : len);
2311 PL_compiling.cop_hints_hash
2312 = Perl_refcounted_he_new(aTHX_ tmp_he,
2313 sv_2mortal(newSVpvs("open<")), tmp);
2316 case '\020': /* ^P */
2317 PL_perldb = SvIV(sv);
2318 if (PL_perldb && !PL_DBsingle)
2321 case '\024': /* ^T */
2323 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2325 PL_basetime = (Time_t)SvIV(sv);
2328 case '\025': /* ^UTF8CACHE */
2329 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2330 PL_utf8cache = (signed char) sv_2iv(sv);
2333 case '\027': /* ^W & $^WARNING_BITS */
2334 if (*(mg->mg_ptr+1) == '\0') {
2335 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2337 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2338 | (i ? G_WARN_ON : G_WARN_OFF) ;
2341 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2342 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2343 if (!SvPOK(sv) && PL_localizing) {
2344 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2345 PL_compiling.cop_warnings = pWARN_NONE;
2350 int accumulate = 0 ;
2351 int any_fatals = 0 ;
2352 const char * const ptr = SvPV_const(sv, len) ;
2353 for (i = 0 ; i < len ; ++i) {
2354 accumulate |= ptr[i] ;
2355 any_fatals |= (ptr[i] & 0xAA) ;
2358 if (!specialWARN(PL_compiling.cop_warnings))
2359 PerlMemShared_free(PL_compiling.cop_warnings);
2360 PL_compiling.cop_warnings = pWARN_NONE;
2362 /* Yuck. I can't see how to abstract this: */
2363 else if (isWARN_on(((STRLEN *)SvPV_nolen_const(sv)) - 1,
2364 WARN_ALL) && !any_fatals) {
2365 if (!specialWARN(PL_compiling.cop_warnings))
2366 PerlMemShared_free(PL_compiling.cop_warnings);
2367 PL_compiling.cop_warnings = pWARN_ALL;
2368 PL_dowarn |= G_WARN_ONCE ;
2372 const char *const p = SvPV_const(sv, len);
2374 PL_compiling.cop_warnings
2375 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
2378 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2379 PL_dowarn |= G_WARN_ONCE ;
2387 if (PL_localizing) {
2388 if (PL_localizing == 1)
2389 SAVESPTR(PL_last_in_gv);
2391 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2392 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2395 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2396 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2397 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2400 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2401 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2402 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2405 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
2408 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2409 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2410 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2413 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
2417 IO * const io = GvIOp(PL_defoutgv);
2420 if ((SvIV(sv)) == 0)
2421 IoFLAGS(io) &= ~IOf_FLUSH;
2423 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2424 PerlIO *ofp = IoOFP(io);
2426 (void)PerlIO_flush(ofp);
2427 IoFLAGS(io) |= IOf_FLUSH;
2433 SvREFCNT_dec(PL_rs);
2434 PL_rs = newSVsv(sv);
2438 SvREFCNT_dec(PL_ors_sv);
2439 if (SvOK(sv) || SvGMAGICAL(sv)) {
2440 PL_ors_sv = newSVsv(sv);
2448 SvREFCNT_dec(PL_ofs_sv);
2449 if (SvOK(sv) || SvGMAGICAL(sv)) {
2450 PL_ofs_sv = newSVsv(sv);
2457 CopARYBASE_set(&PL_compiling, SvIV(sv));
2460 #ifdef COMPLEX_STATUS
2461 if (PL_localizing == 2) {
2462 PL_statusvalue = LvTARGOFF(sv);
2463 PL_statusvalue_vms = LvTARGLEN(sv);
2467 #ifdef VMSISH_STATUS
2469 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2472 STATUS_UNIX_EXIT_SET(SvIV(sv));
2477 # define PERL_VMS_BANG vaxc$errno
2479 # define PERL_VMS_BANG 0
2481 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2482 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2487 if (PL_delaymagic) {
2488 PL_delaymagic |= DM_RUID;
2489 break; /* don't do magic till later */
2492 (void)setruid((Uid_t)PL_uid);
2495 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2497 #ifdef HAS_SETRESUID
2498 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2500 if (PL_uid == PL_euid) { /* special case $< = $> */
2502 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2503 if (PL_uid != 0 && PerlProc_getuid() == 0)
2504 (void)PerlProc_setuid(0);
2506 (void)PerlProc_setuid(PL_uid);
2508 PL_uid = PerlProc_getuid();
2509 Perl_croak(aTHX_ "setruid() not implemented");
2514 PL_uid = PerlProc_getuid();
2515 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2519 if (PL_delaymagic) {
2520 PL_delaymagic |= DM_EUID;
2521 break; /* don't do magic till later */
2524 (void)seteuid((Uid_t)PL_euid);
2527 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2529 #ifdef HAS_SETRESUID
2530 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2532 if (PL_euid == PL_uid) /* special case $> = $< */
2533 PerlProc_setuid(PL_euid);
2535 PL_euid = PerlProc_geteuid();
2536 Perl_croak(aTHX_ "seteuid() not implemented");
2541 PL_euid = PerlProc_geteuid();
2542 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2546 if (PL_delaymagic) {
2547 PL_delaymagic |= DM_RGID;
2548 break; /* don't do magic till later */
2551 (void)setrgid((Gid_t)PL_gid);
2554 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2556 #ifdef HAS_SETRESGID
2557 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2559 if (PL_gid == PL_egid) /* special case $( = $) */
2560 (void)PerlProc_setgid(PL_gid);
2562 PL_gid = PerlProc_getgid();
2563 Perl_croak(aTHX_ "setrgid() not implemented");
2568 PL_gid = PerlProc_getgid();
2569 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2572 #ifdef HAS_SETGROUPS
2574 const char *p = SvPV_const(sv, len);
2575 Groups_t *gary = NULL;
2580 for (i = 0; i < NGROUPS; ++i) {
2581 while (*p && !isSPACE(*p))
2588 Newx(gary, i + 1, Groups_t);
2590 Renew(gary, i + 1, Groups_t);
2594 (void)setgroups(i, gary);
2597 #else /* HAS_SETGROUPS */
2599 #endif /* HAS_SETGROUPS */
2600 if (PL_delaymagic) {
2601 PL_delaymagic |= DM_EGID;
2602 break; /* don't do magic till later */
2605 (void)setegid((Gid_t)PL_egid);
2608 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2610 #ifdef HAS_SETRESGID
2611 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2613 if (PL_egid == PL_gid) /* special case $) = $( */
2614 (void)PerlProc_setgid(PL_egid);
2616 PL_egid = PerlProc_getegid();
2617 Perl_croak(aTHX_ "setegid() not implemented");
2622 PL_egid = PerlProc_getegid();
2623 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2626 PL_chopset = SvPV_force(sv,len);
2628 #ifndef MACOS_TRADITIONAL
2630 LOCK_DOLLARZERO_MUTEX;
2631 #ifdef HAS_SETPROCTITLE
2632 /* The BSDs don't show the argv[] in ps(1) output, they
2633 * show a string from the process struct and provide
2634 * the setproctitle() routine to manipulate that. */
2635 if (PL_origalen != 1) {
2636 s = SvPV_const(sv, len);
2637 # if __FreeBSD_version > 410001
2638 /* The leading "-" removes the "perl: " prefix,
2639 * but not the "(perl) suffix from the ps(1)
2640 * output, because that's what ps(1) shows if the
2641 * argv[] is modified. */
2642 setproctitle("-%s", s);
2643 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2644 /* This doesn't really work if you assume that
2645 * $0 = 'foobar'; will wipe out 'perl' from the $0
2646 * because in ps(1) output the result will be like
2647 * sprintf("perl: %s (perl)", s)
2648 * I guess this is a security feature:
2649 * one (a user process) cannot get rid of the original name.
2651 setproctitle("%s", s);
2654 #elif defined(__hpux) && defined(PSTAT_SETCMD)
2655 if (PL_origalen != 1) {
2657 s = SvPV_const(sv, len);
2658 un.pst_command = (char *)s;
2659 pstat(PSTAT_SETCMD, un, len, 0, 0);
2662 if (PL_origalen > 1) {
2663 /* PL_origalen is set in perl_parse(). */
2664 s = SvPV_force(sv,len);
2665 if (len >= (STRLEN)PL_origalen-1) {
2666 /* Longer than original, will be truncated. We assume that
2667 * PL_origalen bytes are available. */
2668 Copy(s, PL_origargv[0], PL_origalen-1, char);
2671 /* Shorter than original, will be padded. */
2673 /* Special case for Mac OS X: see [perl #38868] */
2676 /* Is the space counterintuitive? Yes.
2677 * (You were expecting \0?)
2678 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2680 const int pad = ' ';
2682 Copy(s, PL_origargv[0], len, char);
2683 PL_origargv[0][len] = 0;
2684 memset(PL_origargv[0] + len + 1,
2685 pad, PL_origalen - len - 1);
2687 PL_origargv[0][PL_origalen-1] = 0;
2688 for (i = 1; i < PL_origargc; i++)
2692 UNLOCK_DOLLARZERO_MUTEX;
2700 Perl_whichsig(pTHX_ const char *sig)
2702 register char* const* sigv;
2703 PERL_UNUSED_CONTEXT;
2705 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
2706 if (strEQ(sig,*sigv))
2707 return PL_sig_num[sigv - (char* const*)PL_sig_name];
2709 if (strEQ(sig,"CHLD"))
2713 if (strEQ(sig,"CLD"))
2720 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2721 Perl_sighandler(int sig, ...)
2723 Perl_sighandler(int sig)
2726 #ifdef PERL_GET_SIG_CONTEXT
2727 dTHXa(PERL_GET_SIG_CONTEXT);
2734 SV * const tSv = PL_Sv;
2738 XPV * const tXpv = PL_Xpv;
2740 if (PL_savestack_ix + 15 <= PL_savestack_max)
2742 if (PL_markstack_ptr < PL_markstack_max - 2)
2744 if (PL_scopestack_ix < PL_scopestack_max - 3)
2747 if (!PL_psig_ptr[sig]) {
2748 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2753 /* Max number of items pushed there is 3*n or 4. We cannot fix
2754 infinity, so we fix 4 (in fact 5): */
2756 PL_savestack_ix += 5; /* Protect save in progress. */
2757 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2760 PL_markstack_ptr++; /* Protect mark. */
2762 PL_scopestack_ix += 1;
2763 /* sv_2cv is too complicated, try a simpler variant first: */
2764 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2765 || SvTYPE(cv) != SVt_PVCV) {
2767 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2770 if (!cv || !CvROOT(cv)) {
2771 if (ckWARN(WARN_SIGNAL))
2772 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2773 PL_sig_name[sig], (gv ? GvENAME(gv)
2780 if(PL_psig_name[sig]) {
2781 sv = SvREFCNT_inc_NN(PL_psig_name[sig]);
2783 #if !defined(PERL_IMPLICIT_CONTEXT)
2787 sv = sv_newmortal();
2788 sv_setpv(sv,PL_sig_name[sig]);
2791 PUSHSTACKi(PERLSI_SIGNAL);
2794 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2796 struct sigaction oact;
2798 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2802 va_start(args, sig);
2803 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2806 SV *rv = newRV_noinc((SV*)sih);
2807 /* The siginfo fields signo, code, errno, pid, uid,
2808 * addr, status, and band are defined by POSIX/SUSv3. */
2809 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2810 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
2811 #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. */
2812 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
2813 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
2814 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2815 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2816 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
2817 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
2821 PUSHs(newSVpv((char *)sip, sizeof(*sip)));
2830 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2833 if (SvTRUE(ERRSV)) {
2835 #ifdef HAS_SIGPROCMASK
2836 /* Handler "died", for example to get out of a restart-able read().
2837 * Before we re-do that on its behalf re-enable the signal which was
2838 * blocked by the system when we entered.
2842 sigaddset(&set,sig);
2843 sigprocmask(SIG_UNBLOCK, &set, NULL);
2845 /* Not clear if this will work */
2846 (void)rsignal(sig, SIG_IGN);
2847 (void)rsignal(sig, PL_csighandlerp);
2849 #endif /* !PERL_MICRO */
2850 Perl_die(aTHX_ NULL);
2854 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2858 PL_scopestack_ix -= 1;
2861 PL_op = myop; /* Apparently not needed... */
2863 PL_Sv = tSv; /* Restore global temporaries. */
2870 S_restore_magic(pTHX_ const void *p)
2873 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2874 SV* const sv = mgs->mgs_sv;
2879 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2881 #ifdef PERL_OLD_COPY_ON_WRITE
2882 /* While magic was saved (and off) sv_setsv may well have seen
2883 this SV as a prime candidate for COW. */
2885 sv_force_normal_flags(sv, 0);
2889 SvFLAGS(sv) |= mgs->mgs_flags;
2892 if (SvGMAGICAL(sv)) {
2893 /* downgrade public flags to private,
2894 and discard any other private flags */
2896 const U32 pubflags = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2898 SvFLAGS(sv) &= ~( pubflags | (SVp_IOK|SVp_NOK|SVp_POK) );
2899 SvFLAGS(sv) |= ( pubflags << PRIVSHIFT );
2904 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2906 /* If we're still on top of the stack, pop us off. (That condition
2907 * will be satisfied if restore_magic was called explicitly, but *not*
2908 * if it's being called via leave_scope.)
2909 * The reason for doing this is that otherwise, things like sv_2cv()
2910 * may leave alloc gunk on the savestack, and some code
2911 * (e.g. sighandler) doesn't expect that...
2913 if (PL_savestack_ix == mgs->mgs_ss_ix)
2915 I32 popval = SSPOPINT;
2916 assert(popval == SAVEt_DESTRUCTOR_X);
2917 PL_savestack_ix -= 2;
2919 assert(popval == SAVEt_ALLOC);
2921 PL_savestack_ix -= popval;
2927 S_unwind_handler_stack(pTHX_ const void *p)
2930 const U32 flags = *(const U32*)p;
2933 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2934 #if !defined(PERL_IMPLICIT_CONTEXT)
2936 SvREFCNT_dec(PL_sig_sv);
2941 =for apidoc magic_sethint
2943 Triggered by a store to %^H, records the key/value pair to
2944 C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
2945 anything that would need a deep copy. Maybe we should warn if we find a
2951 Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
2954 assert(mg->mg_len == HEf_SVKEY);
2956 /* mg->mg_obj isn't being used. If needed, it would be possible to store
2957 an alternative leaf in there, with PL_compiling.cop_hints being used if
2958 it's NULL. If needed for threads, the alternative could lock a mutex,
2959 or take other more complex action. */
2961 /* Something changed in %^H, so it will need to be restored on scope exit.
2962 Doing this here saves a lot of doing it manually in perl code (and
2963 forgetting to do it, and consequent subtle errors. */
2964 PL_hints |= HINT_LOCALIZE_HH;
2965 PL_compiling.cop_hints_hash
2966 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2967 (SV *)mg->mg_ptr, sv);
2972 =for apidoc magic_sethint
2974 Triggered by a delete from %^H, records the key to
2975 C<PL_compiling.cop_hints_hash>.
2980 Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
2983 PERL_UNUSED_ARG(sv);
2985 assert(mg->mg_len == HEf_SVKEY);
2987 PERL_UNUSED_ARG(sv);
2989 PL_hints |= HINT_LOCALIZE_HH;
2990 PL_compiling.cop_hints_hash
2991 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2992 (SV *)mg->mg_ptr, &PL_sv_placeholder);
2998 * c-indentation-style: bsd
3000 * indent-tabs-mode: t
3003 * ex: set ts=8 sts=4 sw=4 noet: