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 (PL_localizing == 2 && !S_is_container_magic(mg))
276 if (vtbl && vtbl->svt_set)
277 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
280 restore_magic(INT2PTR(void*, (IV)mgs_ix));
285 =for apidoc mg_length
287 Report on the SV's length. See C<sv_magic>.
293 Perl_mg_length(pTHX_ SV *sv)
299 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
300 const MGVTBL * const vtbl = mg->mg_virtual;
301 if (vtbl && vtbl->svt_len) {
302 const I32 mgs_ix = SSNEW(sizeof(MGS));
303 save_magic(mgs_ix, sv);
304 /* omit MGf_GSKIP -- not changed here */
305 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
306 restore_magic(INT2PTR(void*, (IV)mgs_ix));
312 const U8 *s = (U8*)SvPV_const(sv, len);
313 len = utf8_length(s, s + len);
316 (void)SvPV_const(sv, len);
321 Perl_mg_size(pTHX_ SV *sv)
325 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
326 const MGVTBL* const vtbl = mg->mg_virtual;
327 if (vtbl && vtbl->svt_len) {
328 const I32 mgs_ix = SSNEW(sizeof(MGS));
330 save_magic(mgs_ix, sv);
331 /* omit MGf_GSKIP -- not changed here */
332 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
333 restore_magic(INT2PTR(void*, (IV)mgs_ix));
340 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
344 Perl_croak(aTHX_ "Size magic not implemented");
353 Clear something magical that the SV represents. See C<sv_magic>.
359 Perl_mg_clear(pTHX_ SV *sv)
361 const I32 mgs_ix = SSNEW(sizeof(MGS));
364 save_magic(mgs_ix, sv);
366 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
367 const MGVTBL* const vtbl = mg->mg_virtual;
368 /* omit GSKIP -- never set here */
370 if (vtbl && vtbl->svt_clear)
371 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
374 restore_magic(INT2PTR(void*, (IV)mgs_ix));
381 Finds the magic pointer for type matching the SV. See C<sv_magic>.
387 Perl_mg_find(pTHX_ const SV *sv, int type)
392 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
393 if (mg->mg_type == type)
403 Copies the magic from one SV to another. See C<sv_magic>.
409 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
413 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
414 const MGVTBL* const vtbl = mg->mg_virtual;
415 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
416 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
419 const char type = mg->mg_type;
420 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
422 (type == PERL_MAGIC_tied)
424 : (type == PERL_MAGIC_regdata && mg->mg_obj)
427 toLOWER(type), key, klen);
436 =for apidoc mg_localize
438 Copy some of the magic from an existing SV to new localized version of
439 that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
440 doesn't (eg taint, pos).
446 Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
450 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
451 const MGVTBL* const vtbl = mg->mg_virtual;
452 if (!S_is_container_magic(mg))
455 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
456 (void)CALL_FPTR(vtbl->svt_local)(aTHX_ nsv, mg);
458 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
459 mg->mg_ptr, mg->mg_len);
461 /* container types should remain read-only across localization */
462 SvFLAGS(nsv) |= SvREADONLY(sv);
465 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
466 SvFLAGS(nsv) |= SvMAGICAL(sv);
476 Free any magic storage used by the SV. See C<sv_magic>.
482 Perl_mg_free(pTHX_ SV *sv)
486 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
487 const MGVTBL* const vtbl = mg->mg_virtual;
488 moremagic = mg->mg_moremagic;
489 if (vtbl && vtbl->svt_free)
490 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
491 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
492 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
493 Safefree(mg->mg_ptr);
494 else if (mg->mg_len == HEf_SVKEY)
495 SvREFCNT_dec((SV*)mg->mg_ptr);
497 if (mg->mg_flags & MGf_REFCOUNTED)
498 SvREFCNT_dec(mg->mg_obj);
501 SvMAGIC_set(sv, NULL);
508 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
514 register const REGEXP * const rx = PM_GETRE(PL_curpm);
516 if (mg->mg_obj) { /* @+ */
517 /* return the number possible */
520 I32 paren = rx->lastparen;
522 /* return the last filled */
524 && (rx->startp[paren] == -1 || rx->endp[paren] == -1) )
535 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
539 register const REGEXP * const rx = PM_GETRE(PL_curpm);
541 register const I32 paren = mg->mg_len;
546 if (paren <= (I32)rx->nparens &&
547 (s = rx->startp[paren]) != -1 &&
548 (t = rx->endp[paren]) != -1)
551 if (mg->mg_obj) /* @+ */
556 if (i > 0 && RX_MATCH_UTF8(rx)) {
557 const char * const b = rx->subbeg;
559 i = utf8_length((U8*)b, (U8*)(b+i));
570 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
574 Perl_croak(aTHX_ PL_no_modify);
575 NORETURN_FUNCTION_END;
579 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
584 register const REGEXP *rx;
587 switch (*mg->mg_ptr) {
588 case '1': case '2': case '3': case '4':
589 case '5': case '6': case '7': case '8': case '9': case '&':
590 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
592 paren = atoi(mg->mg_ptr); /* $& is in [0] */
594 if (paren <= (I32)rx->nparens &&
595 (s1 = rx->startp[paren]) != -1 &&
596 (t1 = rx->endp[paren]) != -1)
600 if (i > 0 && RX_MATCH_UTF8(rx)) {
601 const char * const s = rx->subbeg + s1;
606 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
610 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
614 if (ckWARN(WARN_UNINITIALIZED))
619 if (ckWARN(WARN_UNINITIALIZED))
624 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
625 paren = rx->lastparen;
630 case '\016': /* ^N */
631 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
632 paren = rx->lastcloseparen;
638 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
639 if (rx->startp[0] != -1) {
650 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
651 if (rx->endp[0] != -1) {
652 i = rx->sublen - rx->endp[0];
663 if (!SvPOK(sv) && SvNIOK(sv)) {
671 #define SvRTRIM(sv) STMT_START { \
673 STRLEN len = SvCUR(sv); \
674 char * const p = SvPVX(sv); \
675 while (len > 0 && isSPACE(p[len-1])) \
677 SvCUR_set(sv, len); \
683 Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
685 if (!(CopHINTS_get(c) & (HINT_LEXICAL_IO_IN|HINT_LEXICAL_IO_OUT)))
686 sv_setsv(sv, &PL_sv_undef);
690 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_IN)) {
691 SV *const value = Perl_refcounted_he_fetch(aTHX_
693 0, "open<", 5, 0, 0);
698 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_OUT)) {
699 SV *const value = Perl_refcounted_he_fetch(aTHX_
701 0, "open>", 5, 0, 0);
709 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
713 register char *s = NULL;
715 const char * const remaining = mg->mg_ptr + 1;
716 const char nextchar = *remaining;
718 switch (*mg->mg_ptr) {
719 case '\001': /* ^A */
720 sv_setsv(sv, PL_bodytarget);
722 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
723 if (nextchar == '\0') {
724 sv_setiv(sv, (IV)PL_minus_c);
726 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
727 sv_setiv(sv, (IV)STATUS_NATIVE);
731 case '\004': /* ^D */
732 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
734 case '\005': /* ^E */
735 if (nextchar == '\0') {
736 #if defined(MACOS_TRADITIONAL)
740 sv_setnv(sv,(double)gMacPerl_OSErr);
741 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
745 # include <descrip.h>
746 # include <starlet.h>
748 $DESCRIPTOR(msgdsc,msg);
749 sv_setnv(sv,(NV) vaxc$errno);
750 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
751 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
756 if (!(_emx_env & 0x200)) { /* Under DOS */
757 sv_setnv(sv, (NV)errno);
758 sv_setpv(sv, errno ? Strerror(errno) : "");
760 if (errno != errno_isOS2) {
761 const int tmp = _syserrno();
762 if (tmp) /* 2nd call to _syserrno() makes it 0 */
765 sv_setnv(sv, (NV)Perl_rc);
766 sv_setpv(sv, os2error(Perl_rc));
770 const DWORD dwErr = GetLastError();
771 sv_setnv(sv, (NV)dwErr);
773 PerlProc_GetOSError(sv, dwErr);
776 sv_setpvn(sv, "", 0);
781 const int saveerrno = errno;
782 sv_setnv(sv, (NV)errno);
783 sv_setpv(sv, errno ? Strerror(errno) : "");
788 SvNOK_on(sv); /* what a wonderful hack! */
790 else if (strEQ(remaining, "NCODING"))
791 sv_setsv(sv, PL_encoding);
793 case '\006': /* ^F */
794 sv_setiv(sv, (IV)PL_maxsysfd);
796 case '\010': /* ^H */
797 sv_setiv(sv, (IV)PL_hints);
799 case '\011': /* ^I */ /* NOT \t in EBCDIC */
801 sv_setpv(sv, PL_inplace);
803 sv_setsv(sv, &PL_sv_undef);
805 case '\017': /* ^O & ^OPEN */
806 if (nextchar == '\0') {
807 sv_setpv(sv, PL_osname);
810 else if (strEQ(remaining, "PEN")) {
811 Perl_emulate_cop_io(aTHX_ &PL_compiling, sv);
815 if (nextchar == '\0') { /* ^P */
816 sv_setiv(sv, (IV)PL_perldb);
817 } else if (strEQ(remaining, "REMATCH")) { /* $^PREMATCH */
818 goto do_prematch_fetch;
819 } else if (strEQ(remaining, "OSTMATCH")) { /* $^POSTMATCH */
820 goto do_postmatch_fetch;
823 case '\023': /* ^S */
824 if (nextchar == '\0') {
825 if (PL_lex_state != LEX_NOTPARSING)
828 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
833 case '\024': /* ^T */
834 if (nextchar == '\0') {
836 sv_setnv(sv, PL_basetime);
838 sv_setiv(sv, (IV)PL_basetime);
841 else if (strEQ(remaining, "AINT"))
842 sv_setiv(sv, PL_tainting
843 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
846 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
847 if (strEQ(remaining, "NICODE"))
848 sv_setuv(sv, (UV) PL_unicode);
849 else if (strEQ(remaining, "TF8LOCALE"))
850 sv_setuv(sv, (UV) PL_utf8locale);
851 else if (strEQ(remaining, "TF8CACHE"))
852 sv_setiv(sv, (IV) PL_utf8cache);
854 case '\027': /* ^W & $^WARNING_BITS */
855 if (nextchar == '\0')
856 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
857 else if (strEQ(remaining, "ARNING_BITS")) {
858 if (PL_compiling.cop_warnings == pWARN_NONE) {
859 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
861 else if (PL_compiling.cop_warnings == pWARN_STD) {
864 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
868 else if (PL_compiling.cop_warnings == pWARN_ALL) {
869 /* Get the bit mask for $warnings::Bits{all}, because
870 * it could have been extended by warnings::register */
871 HV * const bits=get_hv("warnings::Bits", FALSE);
873 SV ** const bits_all = hv_fetchs(bits, "all", FALSE);
875 sv_setsv(sv, *bits_all);
878 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
882 sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
883 *PL_compiling.cop_warnings);
888 case '\015': /* $^MATCH */
889 if (strEQ(remaining, "ATCH")) {
890 case '1': case '2': case '3': case '4':
891 case '5': case '6': case '7': case '8': case '9': case '&':
892 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
894 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
895 * XXX Does the new way break anything?
897 paren = atoi(mg->mg_ptr); /* $& is in [0] */
898 CALLREG_NUMBUF(rx,paren,sv);
901 sv_setsv(sv,&PL_sv_undef);
905 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
907 CALLREG_NUMBUF(rx,rx->lastparen,sv);
911 sv_setsv(sv,&PL_sv_undef);
913 case '\016': /* ^N */
914 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
915 if (rx->lastcloseparen) {
916 CALLREG_NUMBUF(rx,rx->lastcloseparen,sv);
921 sv_setsv(sv,&PL_sv_undef);
925 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
926 CALLREG_NUMBUF(rx,-2,sv);
929 sv_setsv(sv,&PL_sv_undef);
933 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
934 CALLREG_NUMBUF(rx,-1,sv);
937 sv_setsv(sv,&PL_sv_undef);
940 if (GvIO(PL_last_in_gv)) {
941 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
946 sv_setiv(sv, (IV)STATUS_CURRENT);
947 #ifdef COMPLEX_STATUS
948 LvTARGOFF(sv) = PL_statusvalue;
949 LvTARGLEN(sv) = PL_statusvalue_vms;
954 if (GvIOp(PL_defoutgv))
955 s = IoTOP_NAME(GvIOp(PL_defoutgv));
959 sv_setpv(sv,GvENAME(PL_defoutgv));
964 if (GvIOp(PL_defoutgv))
965 s = IoFMT_NAME(GvIOp(PL_defoutgv));
967 s = GvENAME(PL_defoutgv);
971 if (GvIOp(PL_defoutgv))
972 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
975 if (GvIOp(PL_defoutgv))
976 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
979 if (GvIOp(PL_defoutgv))
980 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
987 sv_setiv(sv, (IV)CopARYBASE_get(PL_curcop));
990 if (GvIOp(PL_defoutgv))
991 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
997 sv_copypv(sv, PL_ors_sv);
1001 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
1002 sv_setpv(sv, errno ? Strerror(errno) : "");
1005 const int saveerrno = errno;
1006 sv_setnv(sv, (NV)errno);
1008 if (errno == errno_isOS2 || errno == errno_isOS2_set)
1009 sv_setpv(sv, os2error(Perl_rc));
1012 sv_setpv(sv, errno ? Strerror(errno) : "");
1017 SvNOK_on(sv); /* what a wonderful hack! */
1020 sv_setiv(sv, (IV)PL_uid);
1023 sv_setiv(sv, (IV)PL_euid);
1026 sv_setiv(sv, (IV)PL_gid);
1029 sv_setiv(sv, (IV)PL_egid);
1031 #ifdef HAS_GETGROUPS
1033 Groups_t *gary = NULL;
1034 I32 i, num_groups = getgroups(0, gary);
1035 Newx(gary, num_groups, Groups_t);
1036 num_groups = getgroups(num_groups, gary);
1037 for (i = 0; i < num_groups; i++)
1038 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1041 (void)SvIOK_on(sv); /* what a wonderful hack! */
1044 #ifndef MACOS_TRADITIONAL
1053 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1055 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1057 if (uf && uf->uf_val)
1058 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1063 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1066 STRLEN len = 0, klen;
1067 const char *s = SvOK(sv) ? SvPV_const(sv,len) : "";
1068 const char * const ptr = MgPV_const(mg,klen);
1071 #ifdef DYNAMIC_ENV_FETCH
1072 /* We just undefd an environment var. Is a replacement */
1073 /* waiting in the wings? */
1075 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1077 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1081 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1082 /* And you'll never guess what the dog had */
1083 /* in its mouth... */
1085 MgTAINTEDDIR_off(mg);
1087 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1088 char pathbuf[256], eltbuf[256], *cp, *elt;
1092 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1094 do { /* DCL$PATH may be a search list */
1095 while (1) { /* as may dev portion of any element */
1096 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1097 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1098 cando_by_name(S_IWUSR,0,elt) ) {
1099 MgTAINTEDDIR_on(mg);
1103 if ((cp = strchr(elt, ':')) != NULL)
1105 if (my_trnlnm(elt, eltbuf, j++))
1111 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1114 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1115 const char * const strend = s + len;
1117 while (s < strend) {
1121 #ifdef VMS /* Hmm. How do we get $Config{path_sep} from C? */
1122 const char path_sep = '|';
1124 const char path_sep = ':';
1126 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1127 s, strend, path_sep, &i);
1129 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1131 || !strchr(tmpbuf, ':') /* no colon thus no device name -- assume relative path */
1133 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1135 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1136 MgTAINTEDDIR_on(mg);
1142 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1148 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1150 PERL_UNUSED_ARG(sv);
1151 my_setenv(MgPV_nolen_const(mg),NULL);
1156 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1159 PERL_UNUSED_ARG(mg);
1161 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1163 if (PL_localizing) {
1166 hv_iterinit((HV*)sv);
1167 while ((entry = hv_iternext((HV*)sv))) {
1169 my_setenv(hv_iterkey(entry, &keylen),
1170 SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1178 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1181 PERL_UNUSED_ARG(sv);
1182 PERL_UNUSED_ARG(mg);
1184 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1192 #ifdef HAS_SIGPROCMASK
1194 restore_sigmask(pTHX_ SV *save_sv)
1196 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1197 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1201 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1204 /* Are we fetching a signal entry? */
1205 const I32 i = whichsig(MgPV_nolen_const(mg));
1208 sv_setsv(sv,PL_psig_ptr[i]);
1210 Sighandler_t sigstate = rsignal_state(i);
1211 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1212 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1215 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1216 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1219 /* cache state so we don't fetch it again */
1220 if(sigstate == (Sighandler_t) SIG_IGN)
1221 sv_setpvs(sv,"IGNORE");
1223 sv_setsv(sv,&PL_sv_undef);
1224 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1231 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1233 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1234 * refactoring might be in order.
1237 register const char * const s = MgPV_nolen_const(mg);
1238 PERL_UNUSED_ARG(sv);
1241 if (strEQ(s,"__DIE__"))
1243 else if (strEQ(s,"__WARN__") && PL_warnhook != PERL_WARNHOOK_FATAL)
1246 SV *const to_dec = *svp;
1248 SvREFCNT_dec(to_dec);
1252 /* Are we clearing a signal entry? */
1253 const I32 i = whichsig(s);
1255 #ifdef HAS_SIGPROCMASK
1258 /* Avoid having the signal arrive at a bad time, if possible. */
1261 sigprocmask(SIG_BLOCK, &set, &save);
1263 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1264 SAVEFREESV(save_sv);
1265 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1268 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1269 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1271 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1272 PL_sig_defaulting[i] = 1;
1273 (void)rsignal(i, PL_csighandlerp);
1275 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1277 if(PL_psig_name[i]) {
1278 SvREFCNT_dec(PL_psig_name[i]);
1281 if(PL_psig_ptr[i]) {
1282 SV * const to_dec=PL_psig_ptr[i];
1285 SvREFCNT_dec(to_dec);
1295 * The signal handling nomenclature has gotten a bit confusing since the advent of
1296 * safe signals. S_raise_signal only raises signals by analogy with what the
1297 * underlying system's signal mechanism does. It might be more proper to say that
1298 * it defers signals that have already been raised and caught.
1300 * PL_sig_pending and PL_psig_pend likewise do not track signals that are pending
1301 * in the sense of being on the system's signal queue in between raising and delivery.
1302 * They are only pending on Perl's deferral list, i.e., they track deferred signals
1303 * awaiting delivery after the current Perl opcode completes and say nothing about
1304 * signals raised but not yet caught in the underlying signal implementation.
1307 #ifndef SIG_PENDING_DIE_COUNT
1308 # define SIG_PENDING_DIE_COUNT 120
1312 S_raise_signal(pTHX_ int sig)
1315 /* Set a flag to say this signal is pending */
1316 PL_psig_pend[sig]++;
1317 /* And one to say _a_ signal is pending */
1318 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1319 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1320 (unsigned long)SIG_PENDING_DIE_COUNT);
1324 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1325 Perl_csighandler(int sig, ...)
1327 Perl_csighandler(int sig)
1330 #ifdef PERL_GET_SIG_CONTEXT
1331 dTHXa(PERL_GET_SIG_CONTEXT);
1335 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1336 (void) rsignal(sig, PL_csighandlerp);
1337 if (PL_sig_ignoring[sig]) return;
1339 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1340 if (PL_sig_defaulting[sig])
1341 #ifdef KILL_BY_SIGPRC
1342 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1357 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1358 /* Call the perl level handler now--
1359 * with risk we may be in malloc() etc. */
1360 (*PL_sighandlerp)(sig);
1362 S_raise_signal(aTHX_ sig);
1365 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1367 Perl_csighandler_init(void)
1370 if (PL_sig_handlers_initted) return;
1372 for (sig = 1; sig < SIG_SIZE; sig++) {
1373 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1375 PL_sig_defaulting[sig] = 1;
1376 (void) rsignal(sig, PL_csighandlerp);
1378 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1379 PL_sig_ignoring[sig] = 0;
1382 PL_sig_handlers_initted = 1;
1387 Perl_despatch_signals(pTHX)
1392 for (sig = 1; sig < SIG_SIZE; sig++) {
1393 if (PL_psig_pend[sig]) {
1394 PERL_BLOCKSIG_ADD(set, sig);
1395 PL_psig_pend[sig] = 0;
1396 PERL_BLOCKSIG_BLOCK(set);
1397 (*PL_sighandlerp)(sig);
1398 PERL_BLOCKSIG_UNBLOCK(set);
1404 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1409 /* Need to be careful with SvREFCNT_dec(), because that can have side
1410 * effects (due to closures). We must make sure that the new disposition
1411 * is in place before it is called.
1415 #ifdef HAS_SIGPROCMASK
1420 register const char *s = MgPV_const(mg,len);
1422 if (strEQ(s,"__DIE__"))
1424 else if (strEQ(s,"__WARN__"))
1427 Perl_croak(aTHX_ "No such hook: %s", s);
1430 if (*svp != PERL_WARNHOOK_FATAL)
1436 i = whichsig(s); /* ...no, a brick */
1438 if (ckWARN(WARN_SIGNAL))
1439 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1442 #ifdef HAS_SIGPROCMASK
1443 /* Avoid having the signal arrive at a bad time, if possible. */
1446 sigprocmask(SIG_BLOCK, &set, &save);
1448 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1449 SAVEFREESV(save_sv);
1450 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1453 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1454 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1456 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1457 PL_sig_ignoring[i] = 0;
1459 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1460 PL_sig_defaulting[i] = 0;
1462 SvREFCNT_dec(PL_psig_name[i]);
1463 to_dec = PL_psig_ptr[i];
1464 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1465 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1466 PL_psig_name[i] = newSVpvn(s, len);
1467 SvREADONLY_on(PL_psig_name[i]);
1469 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1471 (void)rsignal(i, PL_csighandlerp);
1472 #ifdef HAS_SIGPROCMASK
1477 *svp = SvREFCNT_inc_simple_NN(sv);
1479 SvREFCNT_dec(to_dec);
1482 s = SvOK(sv) ? SvPV_force(sv,len) : "DEFAULT";
1483 if (strEQ(s,"IGNORE")) {
1485 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1486 PL_sig_ignoring[i] = 1;
1487 (void)rsignal(i, PL_csighandlerp);
1489 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1493 else if (strEQ(s,"DEFAULT") || !*s) {
1495 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1497 PL_sig_defaulting[i] = 1;
1498 (void)rsignal(i, PL_csighandlerp);
1501 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1506 * We should warn if HINT_STRICT_REFS, but without
1507 * access to a known hint bit in a known OP, we can't
1508 * tell whether HINT_STRICT_REFS is in force or not.
1510 if (!strchr(s,':') && !strchr(s,'\''))
1511 Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"));
1513 (void)rsignal(i, PL_csighandlerp);
1515 *svp = SvREFCNT_inc_simple_NN(sv);
1517 #ifdef HAS_SIGPROCMASK
1522 SvREFCNT_dec(to_dec);
1525 #endif /* !PERL_MICRO */
1528 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1531 PERL_UNUSED_ARG(sv);
1532 PERL_UNUSED_ARG(mg);
1533 PL_sub_generation++;
1538 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1541 PERL_UNUSED_ARG(sv);
1542 PERL_UNUSED_ARG(mg);
1543 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1544 PL_amagic_generation++;
1550 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1552 HV * const hv = (HV*)LvTARG(sv);
1554 PERL_UNUSED_ARG(mg);
1557 (void) hv_iterinit(hv);
1558 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1561 while (hv_iternext(hv))
1566 sv_setiv(sv, (IV)i);
1571 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1573 PERL_UNUSED_ARG(mg);
1575 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1580 /* caller is responsible for stack switching/cleanup */
1582 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1589 PUSHs(SvTIED_obj(sv, mg));
1592 if (mg->mg_len >= 0)
1593 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1594 else if (mg->mg_len == HEf_SVKEY)
1595 PUSHs((SV*)mg->mg_ptr);
1597 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1598 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1606 return call_method(meth, flags);
1610 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1616 PUSHSTACKi(PERLSI_MAGIC);
1618 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1619 sv_setsv(sv, *PL_stack_sp--);
1629 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1632 mg->mg_flags |= MGf_GSKIP;
1633 magic_methpack(sv,mg,"FETCH");
1638 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1642 PUSHSTACKi(PERLSI_MAGIC);
1643 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1650 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1652 return magic_methpack(sv,mg,"DELETE");
1657 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1664 PUSHSTACKi(PERLSI_MAGIC);
1665 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1666 sv = *PL_stack_sp--;
1667 retval = (U32) SvIV(sv)-1;
1676 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1681 PUSHSTACKi(PERLSI_MAGIC);
1683 XPUSHs(SvTIED_obj(sv, mg));
1685 call_method("CLEAR", G_SCALAR|G_DISCARD);
1693 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1696 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1700 PUSHSTACKi(PERLSI_MAGIC);
1703 PUSHs(SvTIED_obj(sv, mg));
1708 if (call_method(meth, G_SCALAR))
1709 sv_setsv(key, *PL_stack_sp--);
1718 Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
1720 return magic_methpack(sv,mg,"EXISTS");
1724 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1728 SV * const tied = SvTIED_obj((SV*)hv, mg);
1729 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1731 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1733 if (HvEITER_get(hv))
1734 /* we are in an iteration so the hash cannot be empty */
1736 /* no xhv_eiter so now use FIRSTKEY */
1737 key = sv_newmortal();
1738 magic_nextpack((SV*)hv, mg, key);
1739 HvEITER_set(hv, NULL); /* need to reset iterator */
1740 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1743 /* there is a SCALAR method that we can call */
1745 PUSHSTACKi(PERLSI_MAGIC);
1751 if (call_method("SCALAR", G_SCALAR))
1752 retval = *PL_stack_sp--;
1754 retval = &PL_sv_undef;
1761 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1764 GV * const gv = PL_DBline;
1765 const I32 i = SvTRUE(sv);
1766 SV ** const svp = av_fetch(GvAV(gv),
1767 atoi(MgPV_nolen_const(mg)), FALSE);
1768 if (svp && SvIOKp(*svp)) {
1769 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1771 /* set or clear breakpoint in the relevant control op */
1773 o->op_flags |= OPf_SPECIAL;
1775 o->op_flags &= ~OPf_SPECIAL;
1782 Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1785 const AV * const obj = (AV*)mg->mg_obj;
1787 sv_setiv(sv, AvFILL(obj) + CopARYBASE_get(PL_curcop));
1795 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1798 AV * const obj = (AV*)mg->mg_obj;
1800 av_fill(obj, SvIV(sv) - CopARYBASE_get(PL_curcop));
1802 if (ckWARN(WARN_MISC))
1803 Perl_warner(aTHX_ packWARN(WARN_MISC),
1804 "Attempt to set length of freed array");
1810 Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1813 PERL_UNUSED_ARG(sv);
1814 /* during global destruction, mg_obj may already have been freed */
1815 if (PL_in_clean_all)
1818 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1821 /* arylen scalar holds a pointer back to the array, but doesn't own a
1822 reference. Hence the we (the array) are about to go away with it
1823 still pointing at us. Clear its pointer, else it would be pointing
1824 at free memory. See the comment in sv_magic about reference loops,
1825 and why it can't own a reference to us. */
1832 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1835 SV* const lsv = LvTARG(sv);
1836 PERL_UNUSED_ARG(mg);
1838 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1839 MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
1840 if (found && found->mg_len >= 0) {
1841 I32 i = found->mg_len;
1843 sv_pos_b2u(lsv, &i);
1844 sv_setiv(sv, i + CopARYBASE_get(PL_curcop));
1853 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1856 SV* const lsv = LvTARG(sv);
1862 PERL_UNUSED_ARG(mg);
1864 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1865 found = mg_find(lsv, PERL_MAGIC_regex_global);
1871 #ifdef PERL_OLD_COPY_ON_WRITE
1873 sv_force_normal_flags(lsv, 0);
1875 found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
1878 else if (!SvOK(sv)) {
1882 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1884 pos = SvIV(sv) - CopARYBASE_get(PL_curcop);
1887 ulen = sv_len_utf8(lsv);
1897 else if (pos > (SSize_t)len)
1902 sv_pos_u2b(lsv, &p, 0);
1906 found->mg_len = pos;
1907 found->mg_flags &= ~MGf_MINMATCH;
1913 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1916 PERL_UNUSED_ARG(mg);
1920 if (isGV_with_GP(sv)) {
1921 /* We're actually already a typeglob, so don't need the stuff below.
1925 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
1930 GvGP(sv) = gp_ref(GvGP(gv));
1935 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1938 SV * const lsv = LvTARG(sv);
1939 const char * const tmps = SvPV_const(lsv,len);
1940 I32 offs = LvTARGOFF(sv);
1941 I32 rem = LvTARGLEN(sv);
1942 PERL_UNUSED_ARG(mg);
1945 sv_pos_u2b(lsv, &offs, &rem);
1946 if (offs > (I32)len)
1948 if (rem + offs > (I32)len)
1950 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1957 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1961 const char * const tmps = SvPV_const(sv, len);
1962 SV * const lsv = LvTARG(sv);
1963 I32 lvoff = LvTARGOFF(sv);
1964 I32 lvlen = LvTARGLEN(sv);
1965 PERL_UNUSED_ARG(mg);
1968 sv_utf8_upgrade(lsv);
1969 sv_pos_u2b(lsv, &lvoff, &lvlen);
1970 sv_insert(lsv, lvoff, lvlen, tmps, len);
1971 LvTARGLEN(sv) = sv_len_utf8(sv);
1974 else if (lsv && SvUTF8(lsv)) {
1976 sv_pos_u2b(lsv, &lvoff, &lvlen);
1977 LvTARGLEN(sv) = len;
1978 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
1979 sv_insert(lsv, lvoff, lvlen, utf8, len);
1983 sv_insert(lsv, lvoff, lvlen, tmps, len);
1984 LvTARGLEN(sv) = len;
1992 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1995 PERL_UNUSED_ARG(sv);
1996 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
2001 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
2004 PERL_UNUSED_ARG(sv);
2005 /* update taint status unless we're restoring at scope exit */
2006 if (PL_localizing != 2) {
2016 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
2018 SV * const lsv = LvTARG(sv);
2019 PERL_UNUSED_ARG(mg);
2022 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
2030 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
2032 PERL_UNUSED_ARG(mg);
2033 do_vecset(sv); /* XXX slurp this routine */
2038 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2042 if (LvTARGLEN(sv)) {
2044 SV * const ahv = LvTARG(sv);
2045 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
2050 AV* const av = (AV*)LvTARG(sv);
2051 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
2052 targ = AvARRAY(av)[LvTARGOFF(sv)];
2054 if (targ && (targ != &PL_sv_undef)) {
2055 /* somebody else defined it for us */
2056 SvREFCNT_dec(LvTARG(sv));
2057 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2059 SvREFCNT_dec(mg->mg_obj);
2061 mg->mg_flags &= ~MGf_REFCOUNTED;
2066 sv_setsv(sv, targ ? targ : &PL_sv_undef);
2071 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2073 PERL_UNUSED_ARG(mg);
2077 sv_setsv(LvTARG(sv), sv);
2078 SvSETMAGIC(LvTARG(sv));
2084 Perl_vivify_defelem(pTHX_ SV *sv)
2090 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2093 SV * const ahv = LvTARG(sv);
2094 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
2097 if (!value || value == &PL_sv_undef)
2098 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
2101 AV* const av = (AV*)LvTARG(sv);
2102 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2103 LvTARG(sv) = NULL; /* array can't be extended */
2105 SV* const * const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2106 if (!svp || (value = *svp) == &PL_sv_undef)
2107 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2110 SvREFCNT_inc_simple_void(value);
2111 SvREFCNT_dec(LvTARG(sv));
2114 SvREFCNT_dec(mg->mg_obj);
2116 mg->mg_flags &= ~MGf_REFCOUNTED;
2120 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2122 return Perl_sv_kill_backrefs(aTHX_ sv, (AV*)mg->mg_obj);
2126 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2128 PERL_UNUSED_CONTEXT;
2135 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2137 PERL_UNUSED_ARG(mg);
2138 sv_unmagic(sv, PERL_MAGIC_bm);
2145 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2147 PERL_UNUSED_ARG(mg);
2148 sv_unmagic(sv, PERL_MAGIC_fm);
2154 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2156 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2158 if (uf && uf->uf_set)
2159 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2164 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2166 PERL_UNUSED_ARG(mg);
2167 sv_unmagic(sv, PERL_MAGIC_qr);
2172 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2175 regexp * const re = (regexp *)mg->mg_obj;
2176 PERL_UNUSED_ARG(sv);
2182 #ifdef USE_LOCALE_COLLATE
2184 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2187 * RenE<eacute> Descartes said "I think not."
2188 * and vanished with a faint plop.
2190 PERL_UNUSED_CONTEXT;
2191 PERL_UNUSED_ARG(sv);
2193 Safefree(mg->mg_ptr);
2199 #endif /* USE_LOCALE_COLLATE */
2201 /* Just clear the UTF-8 cache data. */
2203 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2205 PERL_UNUSED_CONTEXT;
2206 PERL_UNUSED_ARG(sv);
2207 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2209 mg->mg_len = -1; /* The mg_len holds the len cache. */
2214 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2217 register const char *s;
2220 switch (*mg->mg_ptr) {
2221 case '\001': /* ^A */
2222 sv_setsv(PL_bodytarget, sv);
2224 case '\003': /* ^C */
2225 PL_minus_c = (bool)SvIV(sv);
2228 case '\004': /* ^D */
2230 s = SvPV_nolen_const(sv);
2231 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2232 DEBUG_x(dump_all());
2234 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2237 case '\005': /* ^E */
2238 if (*(mg->mg_ptr+1) == '\0') {
2239 #ifdef MACOS_TRADITIONAL
2240 gMacPerl_OSErr = SvIV(sv);
2243 set_vaxc_errno(SvIV(sv));
2246 SetLastError( SvIV(sv) );
2249 os2_setsyserrno(SvIV(sv));
2251 /* will anyone ever use this? */
2252 SETERRNO(SvIV(sv), 4);
2258 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2260 SvREFCNT_dec(PL_encoding);
2261 if (SvOK(sv) || SvGMAGICAL(sv)) {
2262 PL_encoding = newSVsv(sv);
2269 case '\006': /* ^F */
2270 PL_maxsysfd = SvIV(sv);
2272 case '\010': /* ^H */
2273 PL_hints = SvIV(sv);
2275 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2276 Safefree(PL_inplace);
2277 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2279 case '\017': /* ^O */
2280 if (*(mg->mg_ptr+1) == '\0') {
2281 Safefree(PL_osname);
2284 TAINT_PROPER("assigning to $^O");
2285 PL_osname = savesvpv(sv);
2288 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2290 const char *const start = SvPV(sv, len);
2291 const char *out = (const char*)memchr(start, '\0', len);
2293 struct refcounted_he *tmp_he;
2296 PL_compiling.cop_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2298 |= HINT_LOCALIZE_HH | HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2300 /* Opening for input is more common than opening for output, so
2301 ensure that hints for input are sooner on linked list. */
2302 tmp = sv_2mortal(out ? newSVpvn(out + 1, start + len - out - 1)
2304 SvFLAGS(tmp) |= SvUTF8(sv);
2307 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2308 sv_2mortal(newSVpvs("open>")), tmp);
2310 /* The UTF-8 setting is carried over */
2311 sv_setpvn(tmp, start, out ? (STRLEN)(out - start) : len);
2313 PL_compiling.cop_hints_hash
2314 = Perl_refcounted_he_new(aTHX_ tmp_he,
2315 sv_2mortal(newSVpvs("open<")), tmp);
2318 case '\020': /* ^P */
2319 PL_perldb = SvIV(sv);
2320 if (PL_perldb && !PL_DBsingle)
2323 case '\024': /* ^T */
2325 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2327 PL_basetime = (Time_t)SvIV(sv);
2330 case '\025': /* ^UTF8CACHE */
2331 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2332 PL_utf8cache = (signed char) sv_2iv(sv);
2335 case '\027': /* ^W & $^WARNING_BITS */
2336 if (*(mg->mg_ptr+1) == '\0') {
2337 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2339 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2340 | (i ? G_WARN_ON : G_WARN_OFF) ;
2343 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2344 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2345 if (!SvPOK(sv) && PL_localizing) {
2346 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2347 PL_compiling.cop_warnings = pWARN_NONE;
2352 int accumulate = 0 ;
2353 int any_fatals = 0 ;
2354 const char * const ptr = SvPV_const(sv, len) ;
2355 for (i = 0 ; i < len ; ++i) {
2356 accumulate |= ptr[i] ;
2357 any_fatals |= (ptr[i] & 0xAA) ;
2360 if (!specialWARN(PL_compiling.cop_warnings))
2361 PerlMemShared_free(PL_compiling.cop_warnings);
2362 PL_compiling.cop_warnings = pWARN_NONE;
2364 /* Yuck. I can't see how to abstract this: */
2365 else if (isWARN_on(((STRLEN *)SvPV_nolen_const(sv)) - 1,
2366 WARN_ALL) && !any_fatals) {
2367 if (!specialWARN(PL_compiling.cop_warnings))
2368 PerlMemShared_free(PL_compiling.cop_warnings);
2369 PL_compiling.cop_warnings = pWARN_ALL;
2370 PL_dowarn |= G_WARN_ONCE ;
2374 const char *const p = SvPV_const(sv, len);
2376 PL_compiling.cop_warnings
2377 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
2380 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2381 PL_dowarn |= G_WARN_ONCE ;
2389 if (PL_localizing) {
2390 if (PL_localizing == 1)
2391 SAVESPTR(PL_last_in_gv);
2393 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2394 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2397 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2398 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2399 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2402 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2403 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2404 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2407 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
2410 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2411 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2412 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2415 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
2419 IO * const io = GvIOp(PL_defoutgv);
2422 if ((SvIV(sv)) == 0)
2423 IoFLAGS(io) &= ~IOf_FLUSH;
2425 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2426 PerlIO *ofp = IoOFP(io);
2428 (void)PerlIO_flush(ofp);
2429 IoFLAGS(io) |= IOf_FLUSH;
2435 SvREFCNT_dec(PL_rs);
2436 PL_rs = newSVsv(sv);
2440 SvREFCNT_dec(PL_ors_sv);
2441 if (SvOK(sv) || SvGMAGICAL(sv)) {
2442 PL_ors_sv = newSVsv(sv);
2450 SvREFCNT_dec(PL_ofs_sv);
2451 if (SvOK(sv) || SvGMAGICAL(sv)) {
2452 PL_ofs_sv = newSVsv(sv);
2459 CopARYBASE_set(&PL_compiling, SvIV(sv));
2462 #ifdef COMPLEX_STATUS
2463 if (PL_localizing == 2) {
2464 PL_statusvalue = LvTARGOFF(sv);
2465 PL_statusvalue_vms = LvTARGLEN(sv);
2469 #ifdef VMSISH_STATUS
2471 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2474 STATUS_UNIX_EXIT_SET(SvIV(sv));
2479 # define PERL_VMS_BANG vaxc$errno
2481 # define PERL_VMS_BANG 0
2483 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2484 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2489 if (PL_delaymagic) {
2490 PL_delaymagic |= DM_RUID;
2491 break; /* don't do magic till later */
2494 (void)setruid((Uid_t)PL_uid);
2497 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2499 #ifdef HAS_SETRESUID
2500 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2502 if (PL_uid == PL_euid) { /* special case $< = $> */
2504 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2505 if (PL_uid != 0 && PerlProc_getuid() == 0)
2506 (void)PerlProc_setuid(0);
2508 (void)PerlProc_setuid(PL_uid);
2510 PL_uid = PerlProc_getuid();
2511 Perl_croak(aTHX_ "setruid() not implemented");
2516 PL_uid = PerlProc_getuid();
2517 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2521 if (PL_delaymagic) {
2522 PL_delaymagic |= DM_EUID;
2523 break; /* don't do magic till later */
2526 (void)seteuid((Uid_t)PL_euid);
2529 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2531 #ifdef HAS_SETRESUID
2532 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2534 if (PL_euid == PL_uid) /* special case $> = $< */
2535 PerlProc_setuid(PL_euid);
2537 PL_euid = PerlProc_geteuid();
2538 Perl_croak(aTHX_ "seteuid() not implemented");
2543 PL_euid = PerlProc_geteuid();
2544 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2548 if (PL_delaymagic) {
2549 PL_delaymagic |= DM_RGID;
2550 break; /* don't do magic till later */
2553 (void)setrgid((Gid_t)PL_gid);
2556 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2558 #ifdef HAS_SETRESGID
2559 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2561 if (PL_gid == PL_egid) /* special case $( = $) */
2562 (void)PerlProc_setgid(PL_gid);
2564 PL_gid = PerlProc_getgid();
2565 Perl_croak(aTHX_ "setrgid() not implemented");
2570 PL_gid = PerlProc_getgid();
2571 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2574 #ifdef HAS_SETGROUPS
2576 const char *p = SvPV_const(sv, len);
2577 Groups_t *gary = NULL;
2582 for (i = 0; i < NGROUPS; ++i) {
2583 while (*p && !isSPACE(*p))
2590 Newx(gary, i + 1, Groups_t);
2592 Renew(gary, i + 1, Groups_t);
2596 (void)setgroups(i, gary);
2599 #else /* HAS_SETGROUPS */
2601 #endif /* HAS_SETGROUPS */
2602 if (PL_delaymagic) {
2603 PL_delaymagic |= DM_EGID;
2604 break; /* don't do magic till later */
2607 (void)setegid((Gid_t)PL_egid);
2610 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2612 #ifdef HAS_SETRESGID
2613 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2615 if (PL_egid == PL_gid) /* special case $) = $( */
2616 (void)PerlProc_setgid(PL_egid);
2618 PL_egid = PerlProc_getegid();
2619 Perl_croak(aTHX_ "setegid() not implemented");
2624 PL_egid = PerlProc_getegid();
2625 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2628 PL_chopset = SvPV_force(sv,len);
2630 #ifndef MACOS_TRADITIONAL
2632 LOCK_DOLLARZERO_MUTEX;
2633 #ifdef HAS_SETPROCTITLE
2634 /* The BSDs don't show the argv[] in ps(1) output, they
2635 * show a string from the process struct and provide
2636 * the setproctitle() routine to manipulate that. */
2637 if (PL_origalen != 1) {
2638 s = SvPV_const(sv, len);
2639 # if __FreeBSD_version > 410001
2640 /* The leading "-" removes the "perl: " prefix,
2641 * but not the "(perl) suffix from the ps(1)
2642 * output, because that's what ps(1) shows if the
2643 * argv[] is modified. */
2644 setproctitle("-%s", s);
2645 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2646 /* This doesn't really work if you assume that
2647 * $0 = 'foobar'; will wipe out 'perl' from the $0
2648 * because in ps(1) output the result will be like
2649 * sprintf("perl: %s (perl)", s)
2650 * I guess this is a security feature:
2651 * one (a user process) cannot get rid of the original name.
2653 setproctitle("%s", s);
2656 #elif defined(__hpux) && defined(PSTAT_SETCMD)
2657 if (PL_origalen != 1) {
2659 s = SvPV_const(sv, len);
2660 un.pst_command = (char *)s;
2661 pstat(PSTAT_SETCMD, un, len, 0, 0);
2664 if (PL_origalen > 1) {
2665 /* PL_origalen is set in perl_parse(). */
2666 s = SvPV_force(sv,len);
2667 if (len >= (STRLEN)PL_origalen-1) {
2668 /* Longer than original, will be truncated. We assume that
2669 * PL_origalen bytes are available. */
2670 Copy(s, PL_origargv[0], PL_origalen-1, char);
2673 /* Shorter than original, will be padded. */
2675 /* Special case for Mac OS X: see [perl #38868] */
2678 /* Is the space counterintuitive? Yes.
2679 * (You were expecting \0?)
2680 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2682 const int pad = ' ';
2684 Copy(s, PL_origargv[0], len, char);
2685 PL_origargv[0][len] = 0;
2686 memset(PL_origargv[0] + len + 1,
2687 pad, PL_origalen - len - 1);
2689 PL_origargv[0][PL_origalen-1] = 0;
2690 for (i = 1; i < PL_origargc; i++)
2694 UNLOCK_DOLLARZERO_MUTEX;
2702 Perl_whichsig(pTHX_ const char *sig)
2704 register char* const* sigv;
2705 PERL_UNUSED_CONTEXT;
2707 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
2708 if (strEQ(sig,*sigv))
2709 return PL_sig_num[sigv - (char* const*)PL_sig_name];
2711 if (strEQ(sig,"CHLD"))
2715 if (strEQ(sig,"CLD"))
2722 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2723 Perl_sighandler(int sig, ...)
2725 Perl_sighandler(int sig)
2728 #ifdef PERL_GET_SIG_CONTEXT
2729 dTHXa(PERL_GET_SIG_CONTEXT);
2736 SV * const tSv = PL_Sv;
2740 XPV * const tXpv = PL_Xpv;
2742 if (PL_savestack_ix + 15 <= PL_savestack_max)
2744 if (PL_markstack_ptr < PL_markstack_max - 2)
2746 if (PL_scopestack_ix < PL_scopestack_max - 3)
2749 if (!PL_psig_ptr[sig]) {
2750 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2755 /* Max number of items pushed there is 3*n or 4. We cannot fix
2756 infinity, so we fix 4 (in fact 5): */
2758 PL_savestack_ix += 5; /* Protect save in progress. */
2759 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2762 PL_markstack_ptr++; /* Protect mark. */
2764 PL_scopestack_ix += 1;
2765 /* sv_2cv is too complicated, try a simpler variant first: */
2766 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2767 || SvTYPE(cv) != SVt_PVCV) {
2769 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2772 if (!cv || !CvROOT(cv)) {
2773 if (ckWARN(WARN_SIGNAL))
2774 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2775 PL_sig_name[sig], (gv ? GvENAME(gv)
2782 if(PL_psig_name[sig]) {
2783 sv = SvREFCNT_inc_NN(PL_psig_name[sig]);
2785 #if !defined(PERL_IMPLICIT_CONTEXT)
2789 sv = sv_newmortal();
2790 sv_setpv(sv,PL_sig_name[sig]);
2793 PUSHSTACKi(PERLSI_SIGNAL);
2796 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2798 struct sigaction oact;
2800 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2804 va_start(args, sig);
2805 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2808 SV *rv = newRV_noinc((SV*)sih);
2809 /* The siginfo fields signo, code, errno, pid, uid,
2810 * addr, status, and band are defined by POSIX/SUSv3. */
2811 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2812 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
2813 #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. */
2814 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
2815 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
2816 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2817 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2818 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
2819 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
2823 PUSHs(newSVpv((char *)sip, sizeof(*sip)));
2832 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2835 if (SvTRUE(ERRSV)) {
2837 #ifdef HAS_SIGPROCMASK
2838 /* Handler "died", for example to get out of a restart-able read().
2839 * Before we re-do that on its behalf re-enable the signal which was
2840 * blocked by the system when we entered.
2844 sigaddset(&set,sig);
2845 sigprocmask(SIG_UNBLOCK, &set, NULL);
2847 /* Not clear if this will work */
2848 (void)rsignal(sig, SIG_IGN);
2849 (void)rsignal(sig, PL_csighandlerp);
2851 #endif /* !PERL_MICRO */
2852 Perl_die(aTHX_ NULL);
2856 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2860 PL_scopestack_ix -= 1;
2863 PL_op = myop; /* Apparently not needed... */
2865 PL_Sv = tSv; /* Restore global temporaries. */
2872 S_restore_magic(pTHX_ const void *p)
2875 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2876 SV* const sv = mgs->mgs_sv;
2881 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2883 #ifdef PERL_OLD_COPY_ON_WRITE
2884 /* While magic was saved (and off) sv_setsv may well have seen
2885 this SV as a prime candidate for COW. */
2887 sv_force_normal_flags(sv, 0);
2891 SvFLAGS(sv) |= mgs->mgs_flags;
2894 if (SvGMAGICAL(sv)) {
2895 /* downgrade public flags to private,
2896 and discard any other private flags */
2898 const U32 pubflags = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2900 SvFLAGS(sv) &= ~( pubflags | (SVp_IOK|SVp_NOK|SVp_POK) );
2901 SvFLAGS(sv) |= ( pubflags << PRIVSHIFT );
2906 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2908 /* If we're still on top of the stack, pop us off. (That condition
2909 * will be satisfied if restore_magic was called explicitly, but *not*
2910 * if it's being called via leave_scope.)
2911 * The reason for doing this is that otherwise, things like sv_2cv()
2912 * may leave alloc gunk on the savestack, and some code
2913 * (e.g. sighandler) doesn't expect that...
2915 if (PL_savestack_ix == mgs->mgs_ss_ix)
2917 I32 popval = SSPOPINT;
2918 assert(popval == SAVEt_DESTRUCTOR_X);
2919 PL_savestack_ix -= 2;
2921 assert(popval == SAVEt_ALLOC);
2923 PL_savestack_ix -= popval;
2929 S_unwind_handler_stack(pTHX_ const void *p)
2932 const U32 flags = *(const U32*)p;
2935 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2936 #if !defined(PERL_IMPLICIT_CONTEXT)
2938 SvREFCNT_dec(PL_sig_sv);
2943 =for apidoc magic_sethint
2945 Triggered by a store to %^H, records the key/value pair to
2946 C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
2947 anything that would need a deep copy. Maybe we should warn if we find a
2953 Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
2956 assert(mg->mg_len == HEf_SVKEY);
2958 /* mg->mg_obj isn't being used. If needed, it would be possible to store
2959 an alternative leaf in there, with PL_compiling.cop_hints being used if
2960 it's NULL. If needed for threads, the alternative could lock a mutex,
2961 or take other more complex action. */
2963 /* Something changed in %^H, so it will need to be restored on scope exit.
2964 Doing this here saves a lot of doing it manually in perl code (and
2965 forgetting to do it, and consequent subtle errors. */
2966 PL_hints |= HINT_LOCALIZE_HH;
2967 PL_compiling.cop_hints_hash
2968 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2969 (SV *)mg->mg_ptr, sv);
2974 =for apidoc magic_sethint
2976 Triggered by a delete from %^H, records the key to
2977 C<PL_compiling.cop_hints_hash>.
2982 Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
2985 PERL_UNUSED_ARG(sv);
2987 assert(mg->mg_len == HEf_SVKEY);
2989 PERL_UNUSED_ARG(sv);
2991 PL_hints |= HINT_LOCALIZE_HH;
2992 PL_compiling.cop_hints_hash
2993 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2994 (SV *)mg->mg_ptr, &PL_sv_placeholder);
3000 * c-indentation-style: bsd
3002 * indent-tabs-mode: t
3005 * ex: set ts=8 sts=4 sw=4 noet: