3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "Sam sat on the ground and put his head in his hands. 'I wish I had never
13 * come here, and I don't want to see no more magic,' he said, and fell silent."
17 =head1 Magical Functions
19 "Magic" is special data attached to SV structures in order to give them
20 "magical" properties. When any Perl code tries to read from, or assign to,
21 an SV marked as magical, it calls the 'get' or 'set' function associated
22 with that SV's magic. A get is called prior to reading an SV, in order to
23 give it a chance to update its internal value (get on $. writes the line
24 number of the last read filehandle into to the SV's IV slot), while
25 set is called after an SV has been written to, in order to allow it to make
26 use of its changed value (set on $/ copies the SV's new value to the
27 PL_rs global variable).
29 Magic is implemented as a linked list of MAGIC structures attached to the
30 SV. Each MAGIC struct holds the type of the magic, a pointer to an array
31 of functions that implement the get(), set(), length() etc functions,
32 plus space for some flags and pointers. For example, a tied variable has
33 a MAGIC structure that contains a pointer to the object associated with the
42 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
48 #if defined(HAS_SETGROUPS)
55 # include <sys/pstat.h>
58 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
59 Signal_t Perl_csighandler_va(int sig, ...);
61 Signal_t Perl_csighandler(int sig);
63 /* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
64 #if !defined(HAS_SIGACTION) && defined(VMS)
65 # define FAKE_PERSISTENT_SIGNAL_HANDLERS
67 /* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
68 #if defined(KILL_BY_SIGPRC)
69 # define FAKE_DEFAULT_SIGNAL_HANDLERS
73 /* Missing protos on LynxOS */
74 void setruid(uid_t id);
75 void seteuid(uid_t id);
76 void setrgid(uid_t id);
77 void setegid(uid_t id);
81 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
89 /* MGS is typedef'ed to struct magic_state in perl.h */
92 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
95 assert(SvMAGICAL(sv));
96 /* Turning READONLY off for a copy-on-write scalar (including shared
97 hash keys) is a bad idea. */
99 sv_force_normal_flags(sv, 0);
101 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
103 mgs = SSPTR(mgs_ix, MGS*);
105 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
106 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
110 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
114 =for apidoc mg_magical
116 Turns on the magical status of an SV. See C<sv_magic>.
122 Perl_mg_magical(pTHX_ SV *sv)
126 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
127 const MGVTBL* const vtbl = mg->mg_virtual;
129 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
133 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
142 Do magic after a value is retrieved from the SV. See C<sv_magic>.
148 Perl_mg_get(pTHX_ SV *sv)
150 const I32 mgs_ix = SSNEW(sizeof(MGS));
151 const bool was_temp = (bool)SvTEMP(sv);
153 MAGIC *newmg, *head, *cur, *mg;
154 /* guard against sv having being freed midway by holding a private
157 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
158 cause the SV's buffer to get stolen (and maybe other stuff).
161 sv_2mortal(SvREFCNT_inc_simple_NN(sv));
166 save_magic(mgs_ix, sv);
168 /* We must call svt_get(sv, mg) for each valid entry in the linked
169 list of magic. svt_get() may delete the current entry, add new
170 magic to the head of the list, or upgrade the SV. AMS 20010810 */
172 newmg = cur = head = mg = SvMAGIC(sv);
174 const MGVTBL * const vtbl = mg->mg_virtual;
176 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
177 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
179 /* guard against magic having been deleted - eg FETCH calling
184 /* Don't restore the flags for this entry if it was deleted. */
185 if (mg->mg_flags & MGf_GSKIP)
186 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
189 mg = mg->mg_moremagic;
192 /* Have we finished with the new entries we saw? Start again
193 where we left off (unless there are more new entries). */
201 /* Were any new entries added? */
202 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
209 restore_magic(INT2PTR(void *, (IV)mgs_ix));
211 if (SvREFCNT(sv) == 1) {
212 /* We hold the last reference to this SV, which implies that the
213 SV was deleted as a side effect of the routines we called. */
222 Do magic after a value is assigned to the SV. See C<sv_magic>.
228 Perl_mg_set(pTHX_ SV *sv)
230 const I32 mgs_ix = SSNEW(sizeof(MGS));
234 save_magic(mgs_ix, sv);
236 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
237 const MGVTBL* vtbl = mg->mg_virtual;
238 nextmg = mg->mg_moremagic; /* it may delete itself */
239 if (mg->mg_flags & MGf_GSKIP) {
240 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
241 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
243 if (vtbl && vtbl->svt_set)
244 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
247 restore_magic(INT2PTR(void*, (IV)mgs_ix));
252 =for apidoc mg_length
254 Report on the SV's length. See C<sv_magic>.
260 Perl_mg_length(pTHX_ SV *sv)
265 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
266 const MGVTBL * const vtbl = mg->mg_virtual;
267 if (vtbl && vtbl->svt_len) {
268 const I32 mgs_ix = SSNEW(sizeof(MGS));
269 save_magic(mgs_ix, sv);
270 /* omit MGf_GSKIP -- not changed here */
271 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
272 restore_magic(INT2PTR(void*, (IV)mgs_ix));
278 const U8 *s = (U8*)SvPV_const(sv, len);
279 len = utf8_length((U8*)s, (U8*)s + len);
282 (void)SvPV_const(sv, len);
287 Perl_mg_size(pTHX_ SV *sv)
291 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
292 const MGVTBL* const vtbl = mg->mg_virtual;
293 if (vtbl && vtbl->svt_len) {
294 const I32 mgs_ix = SSNEW(sizeof(MGS));
296 save_magic(mgs_ix, sv);
297 /* omit MGf_GSKIP -- not changed here */
298 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
299 restore_magic(INT2PTR(void*, (IV)mgs_ix));
306 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
310 Perl_croak(aTHX_ "Size magic not implemented");
319 Clear something magical that the SV represents. See C<sv_magic>.
325 Perl_mg_clear(pTHX_ SV *sv)
327 const I32 mgs_ix = SSNEW(sizeof(MGS));
330 save_magic(mgs_ix, sv);
332 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
333 const MGVTBL* const vtbl = mg->mg_virtual;
334 /* omit GSKIP -- never set here */
336 if (vtbl && vtbl->svt_clear)
337 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
340 restore_magic(INT2PTR(void*, (IV)mgs_ix));
347 Finds the magic pointer for type matching the SV. See C<sv_magic>.
353 Perl_mg_find(pTHX_ SV *sv, int type)
358 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
359 if (mg->mg_type == type)
369 Copies the magic from one SV to another. See C<sv_magic>.
375 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
379 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
380 const MGVTBL* const vtbl = mg->mg_virtual;
381 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
382 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
385 const char type = mg->mg_type;
388 (type == PERL_MAGIC_tied)
390 : (type == PERL_MAGIC_regdata && mg->mg_obj)
393 toLOWER(type), key, klen);
402 =for apidoc mg_localize
404 Copy some of the magic from an existing SV to new localized version of
405 that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
406 doesn't (eg taint, pos).
412 Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
415 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
416 const MGVTBL* const vtbl = mg->mg_virtual;
417 switch (mg->mg_type) {
418 /* value magic types: don't copy */
421 case PERL_MAGIC_regex_global:
422 case PERL_MAGIC_nkeys:
423 #ifdef USE_LOCALE_COLLATE
424 case PERL_MAGIC_collxfrm:
427 case PERL_MAGIC_taint:
429 case PERL_MAGIC_vstring:
430 case PERL_MAGIC_utf8:
431 case PERL_MAGIC_substr:
432 case PERL_MAGIC_defelem:
433 case PERL_MAGIC_arylen:
435 case PERL_MAGIC_backref:
439 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
440 (void)CALL_FPTR(vtbl->svt_local)(aTHX_ nsv, mg);
442 sv_magicext(nsv, mg->mg_obj, mg->mg_type, (MGVTBL *)vtbl,
443 mg->mg_ptr, mg->mg_len);
445 /* container types should remain read-only across localization */
446 SvFLAGS(nsv) |= SvREADONLY(sv);
449 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
450 SvFLAGS(nsv) |= SvMAGICAL(sv);
460 Free any magic storage used by the SV. See C<sv_magic>.
466 Perl_mg_free(pTHX_ SV *sv)
470 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
471 const MGVTBL* const vtbl = mg->mg_virtual;
472 moremagic = mg->mg_moremagic;
473 if (vtbl && vtbl->svt_free)
474 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
475 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
476 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
477 Safefree(mg->mg_ptr);
478 else if (mg->mg_len == HEf_SVKEY)
479 SvREFCNT_dec((SV*)mg->mg_ptr);
481 if (mg->mg_flags & MGf_REFCOUNTED)
482 SvREFCNT_dec(mg->mg_obj);
485 SvMAGIC_set(sv, NULL);
492 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
497 register const REGEXP * const rx = PM_GETRE(PL_curpm);
499 if (mg->mg_obj) { /* @+ */
500 /* return the number possible */
503 I32 paren = rx->lastparen;
505 /* return the last filled */
506 while ( paren >= 0 &&
507 rx->startp[paren] == -1 || rx->endp[paren] == -1)
518 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
521 register const REGEXP * const rx = PM_GETRE(PL_curpm);
523 register const I32 paren = mg->mg_len;
528 if (paren <= (I32)rx->nparens &&
529 (s = rx->startp[paren]) != -1 &&
530 (t = rx->endp[paren]) != -1)
533 if (mg->mg_obj) /* @+ */
538 if (i > 0 && RX_MATCH_UTF8(rx)) {
539 const char * const b = rx->subbeg;
541 i = utf8_length((U8*)b, (U8*)(b+i));
552 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
556 Perl_croak(aTHX_ PL_no_modify);
557 NORETURN_FUNCTION_END;
561 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
565 register const REGEXP *rx;
568 switch (*mg->mg_ptr) {
569 case '1': case '2': case '3': case '4':
570 case '5': case '6': case '7': case '8': case '9': case '&':
571 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
573 paren = atoi(mg->mg_ptr); /* $& is in [0] */
575 if (paren <= (I32)rx->nparens &&
576 (s1 = rx->startp[paren]) != -1 &&
577 (t1 = rx->endp[paren]) != -1)
581 if (i > 0 && RX_MATCH_UTF8(rx)) {
582 const char * const s = rx->subbeg + s1;
587 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
591 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
595 if (ckWARN(WARN_UNINITIALIZED))
600 if (ckWARN(WARN_UNINITIALIZED))
605 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
606 paren = rx->lastparen;
611 case '\016': /* ^N */
612 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
613 paren = rx->lastcloseparen;
619 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
620 if (rx->startp[0] != -1) {
631 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
632 if (rx->endp[0] != -1) {
633 i = rx->sublen - rx->endp[0];
644 if (!SvPOK(sv) && SvNIOK(sv)) {
652 #define SvRTRIM(sv) STMT_START { \
654 STRLEN len = SvCUR(sv); \
655 char * const p = SvPVX(sv); \
656 while (len > 0 && isSPACE(p[len-1])) \
658 SvCUR_set(sv, len); \
664 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
667 register char *s = NULL;
670 const char * const remaining = mg->mg_ptr + 1;
671 const char nextchar = *remaining;
673 switch (*mg->mg_ptr) {
674 case '\001': /* ^A */
675 sv_setsv(sv, PL_bodytarget);
677 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
678 if (*(mg->mg_ptr+1) == '\0') {
679 sv_setiv(sv, (IV)PL_minus_c);
681 else if (strEQ(mg->mg_ptr, "\003HILD_ERROR_NATIVE")) {
682 sv_setiv(sv, (IV)STATUS_NATIVE);
686 case '\004': /* ^D */
687 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
688 #if defined(YYDEBUG) && defined(DEBUGGING)
689 PL_yydebug = DEBUG_p_TEST;
692 case '\005': /* ^E */
693 if (nextchar == '\0') {
694 #if defined(MACOS_TRADITIONAL)
698 sv_setnv(sv,(double)gMacPerl_OSErr);
699 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
703 # include <descrip.h>
704 # include <starlet.h>
706 $DESCRIPTOR(msgdsc,msg);
707 sv_setnv(sv,(NV) vaxc$errno);
708 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
709 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
714 if (!(_emx_env & 0x200)) { /* Under DOS */
715 sv_setnv(sv, (NV)errno);
716 sv_setpv(sv, errno ? Strerror(errno) : "");
718 if (errno != errno_isOS2) {
719 const int tmp = _syserrno();
720 if (tmp) /* 2nd call to _syserrno() makes it 0 */
723 sv_setnv(sv, (NV)Perl_rc);
724 sv_setpv(sv, os2error(Perl_rc));
728 const DWORD dwErr = GetLastError();
729 sv_setnv(sv, (NV)dwErr);
731 PerlProc_GetOSError(sv, dwErr);
734 sv_setpvn(sv, "", 0);
739 const int saveerrno = errno;
740 sv_setnv(sv, (NV)errno);
741 sv_setpv(sv, errno ? Strerror(errno) : "");
746 SvNOK_on(sv); /* what a wonderful hack! */
748 else if (strEQ(remaining, "NCODING"))
749 sv_setsv(sv, PL_encoding);
751 case '\006': /* ^F */
752 sv_setiv(sv, (IV)PL_maxsysfd);
754 case '\010': /* ^H */
755 sv_setiv(sv, (IV)PL_hints);
757 case '\011': /* ^I */ /* NOT \t in EBCDIC */
759 sv_setpv(sv, PL_inplace);
761 sv_setsv(sv, &PL_sv_undef);
763 case '\017': /* ^O & ^OPEN */
764 if (nextchar == '\0') {
765 sv_setpv(sv, PL_osname);
768 else if (strEQ(remaining, "PEN")) {
769 if (!PL_compiling.cop_io)
770 sv_setsv(sv, &PL_sv_undef);
772 sv_setsv(sv, PL_compiling.cop_io);
776 case '\020': /* ^P */
777 sv_setiv(sv, (IV)PL_perldb);
779 case '\023': /* ^S */
780 if (nextchar == '\0') {
781 if (PL_lex_state != LEX_NOTPARSING)
784 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
789 case '\024': /* ^T */
790 if (nextchar == '\0') {
792 sv_setnv(sv, PL_basetime);
794 sv_setiv(sv, (IV)PL_basetime);
797 else if (strEQ(remaining, "AINT"))
798 sv_setiv(sv, PL_tainting
799 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
802 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
803 if (strEQ(remaining, "NICODE"))
804 sv_setuv(sv, (UV) PL_unicode);
805 else if (strEQ(remaining, "TF8LOCALE"))
806 sv_setuv(sv, (UV) PL_utf8locale);
807 else if (strEQ(remaining, "TF8CACHE"))
808 sv_setiv(sv, (IV) PL_utf8cache);
810 case '\027': /* ^W & $^WARNING_BITS */
811 if (nextchar == '\0')
812 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
813 else if (strEQ(remaining, "ARNING_BITS")) {
814 if (PL_compiling.cop_warnings == pWARN_NONE) {
815 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
817 else if (PL_compiling.cop_warnings == pWARN_STD) {
820 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
824 else if (PL_compiling.cop_warnings == pWARN_ALL) {
825 /* Get the bit mask for $warnings::Bits{all}, because
826 * it could have been extended by warnings::register */
827 HV * const bits=get_hv("warnings::Bits", FALSE);
829 SV ** const bits_all = hv_fetchs(bits, "all", FALSE);
831 sv_setsv(sv, *bits_all);
834 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
838 sv_setsv(sv, PL_compiling.cop_warnings);
843 case '1': case '2': case '3': case '4':
844 case '5': case '6': case '7': case '8': case '9': case '&':
845 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
849 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
850 * XXX Does the new way break anything?
852 paren = atoi(mg->mg_ptr); /* $& is in [0] */
854 if (paren <= (I32)rx->nparens &&
855 (s1 = rx->startp[paren]) != -1 &&
856 (t1 = rx->endp[paren]) != -1)
865 const int oldtainted = PL_tainted;
868 PL_tainted = oldtainted;
869 if ( (rx->reganch & ROPT_CANY_SEEN)
871 && (!i || is_utf8_string((U8*)s, i)))
872 : (RX_MATCH_UTF8(rx)) )
879 if (RX_MATCH_TAINTED(rx)) {
880 MAGIC* const mg = SvMAGIC(sv);
883 SvMAGIC_set(sv, mg->mg_moremagic);
885 if ((mgt = SvMAGIC(sv))) {
886 mg->mg_moremagic = mgt;
896 sv_setsv(sv,&PL_sv_undef);
899 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
900 paren = rx->lastparen;
904 sv_setsv(sv,&PL_sv_undef);
906 case '\016': /* ^N */
907 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
908 paren = rx->lastcloseparen;
912 sv_setsv(sv,&PL_sv_undef);
915 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
916 if ((s = rx->subbeg) && rx->startp[0] != -1) {
921 sv_setsv(sv,&PL_sv_undef);
924 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
925 if (rx->subbeg && rx->endp[0] != -1) {
926 s = rx->subbeg + rx->endp[0];
927 i = rx->sublen - rx->endp[0];
931 sv_setsv(sv,&PL_sv_undef);
934 if (GvIO(PL_last_in_gv)) {
935 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
940 sv_setiv(sv, (IV)STATUS_CURRENT);
941 #ifdef COMPLEX_STATUS
942 LvTARGOFF(sv) = PL_statusvalue;
943 LvTARGLEN(sv) = PL_statusvalue_vms;
948 if (GvIOp(PL_defoutgv))
949 s = IoTOP_NAME(GvIOp(PL_defoutgv));
953 sv_setpv(sv,GvENAME(PL_defoutgv));
958 if (GvIOp(PL_defoutgv))
959 s = IoFMT_NAME(GvIOp(PL_defoutgv));
961 s = GvENAME(PL_defoutgv);
965 if (GvIOp(PL_defoutgv))
966 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
969 if (GvIOp(PL_defoutgv))
970 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
973 if (GvIOp(PL_defoutgv))
974 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
981 sv_setiv(sv, (IV)CopARYBASE_get(PL_curcop));
984 if (GvIOp(PL_defoutgv))
985 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
991 sv_copypv(sv, PL_ors_sv);
994 sv_setpv(sv,PL_ofmt);
998 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
999 sv_setpv(sv, errno ? Strerror(errno) : "");
1002 const int saveerrno = errno;
1003 sv_setnv(sv, (NV)errno);
1005 if (errno == errno_isOS2 || errno == errno_isOS2_set)
1006 sv_setpv(sv, os2error(Perl_rc));
1009 sv_setpv(sv, errno ? Strerror(errno) : "");
1014 SvNOK_on(sv); /* what a wonderful hack! */
1017 sv_setiv(sv, (IV)PL_uid);
1020 sv_setiv(sv, (IV)PL_euid);
1023 sv_setiv(sv, (IV)PL_gid);
1026 sv_setiv(sv, (IV)PL_egid);
1028 #ifdef HAS_GETGROUPS
1030 Groups_t *gary = NULL;
1031 I32 i, num_groups = getgroups(0, gary);
1032 Newx(gary, num_groups, Groups_t);
1033 num_groups = getgroups(num_groups, gary);
1034 for (i = 0; i < num_groups; i++)
1035 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1038 (void)SvIOK_on(sv); /* what a wonderful hack! */
1043 #ifndef MACOS_TRADITIONAL
1047 #ifdef USE_5005THREADS
1049 sv_setsv(sv, thr->errsv);
1051 #endif /* USE_5005THREADS */
1057 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1059 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1061 if (uf && uf->uf_val)
1062 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1067 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1069 STRLEN len = 0, klen;
1070 const char *s = SvOK(sv) ? SvPV_const(sv,len) : "";
1071 const char * const ptr = MgPV_const(mg,klen);
1072 my_setenv((char *)ptr, (char *)s);
1074 #ifdef DYNAMIC_ENV_FETCH
1075 /* We just undefd an environment var. Is a replacement */
1076 /* waiting in the wings? */
1078 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1080 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1084 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1085 /* And you'll never guess what the dog had */
1086 /* in its mouth... */
1088 MgTAINTEDDIR_off(mg);
1090 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1091 char pathbuf[256], eltbuf[256], *cp, *elt;
1095 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1097 do { /* DCL$PATH may be a search list */
1098 while (1) { /* as may dev portion of any element */
1099 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1100 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1101 cando_by_name(S_IWUSR,0,elt) ) {
1102 MgTAINTEDDIR_on(mg);
1106 if ((cp = strchr(elt, ':')) != NULL)
1108 if (my_trnlnm(elt, eltbuf, j++))
1114 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1117 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1118 const char * const strend = s + len;
1120 while (s < strend) {
1124 #ifdef VMS /* Hmm. How do we get $Config{path_sep} from C? */
1125 const char path_sep = '|';
1127 const char path_sep = ':';
1129 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1130 (char *) s, (char *) strend, ':', &i);
1132 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1134 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1135 MgTAINTEDDIR_on(mg);
1141 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1147 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1149 PERL_UNUSED_ARG(sv);
1150 my_setenv((char *)MgPV_nolen_const(mg),NULL);
1155 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 (char *)SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1176 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1178 PERL_UNUSED_ARG(sv);
1179 PERL_UNUSED_ARG(mg);
1182 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1186 #endif /* !PERL_MICRO */
1190 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1191 static int PL_sig_handlers_initted = 0;
1193 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1194 static int PL_sig_ignoring[SIG_SIZE]; /* which signals we are ignoring */
1196 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1197 static int PL_sig_defaulting[SIG_SIZE];
1201 #ifdef HAS_SIGPROCMASK
1203 restore_sigmask(pTHX_ SV *save_sv)
1205 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1206 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1210 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1212 /* Are we fetching a signal entry? */
1213 const I32 i = whichsig((char *)MgPV_nolen_const(mg));
1216 sv_setsv(sv,PL_psig_ptr[i]);
1218 Sighandler_t sigstate = rsignal_state(i);
1219 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1220 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1223 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1224 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1227 /* cache state so we don't fetch it again */
1228 if(sigstate == (Sighandler_t) SIG_IGN)
1229 sv_setpv(sv,"IGNORE");
1231 sv_setsv(sv,&PL_sv_undef);
1232 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1239 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1241 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1242 * refactoring might be in order.
1244 register const char * const s = MgPV_nolen_const(mg);
1245 PERL_UNUSED_ARG(sv);
1248 if (strEQ(s,"__DIE__"))
1250 else if (strEQ(s,"__WARN__") && PL_warnhook != PERL_WARNHOOK_FATAL)
1253 SV *const to_dec = *svp;
1255 SvREFCNT_dec(to_dec);
1259 /* Are we clearing a signal entry? */
1260 const I32 i = whichsig((char *)s);
1262 #ifdef HAS_SIGPROCMASK
1265 /* Avoid having the signal arrive at a bad time, if possible. */
1268 sigprocmask(SIG_BLOCK, &set, &save);
1270 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1271 SAVEFREESV(save_sv);
1272 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1275 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1276 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1278 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1279 PL_sig_defaulting[i] = 1;
1280 (void)rsignal(i, PL_csighandlerp);
1282 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1284 if(PL_psig_name[i]) {
1285 SvREFCNT_dec(PL_psig_name[i]);
1288 if(PL_psig_ptr[i]) {
1289 SV * const to_dec=PL_psig_ptr[i];
1292 SvREFCNT_dec(to_dec);
1302 S_raise_signal(pTHX_ int sig)
1304 /* Set a flag to say this signal is pending */
1305 PL_psig_pend[sig]++;
1306 /* And one to say _a_ signal is pending */
1311 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1312 Perl_csighandler(int sig)
1314 Perl_csighandler_va(sig);
1318 Perl_csighandler_va(int sig, ...)
1320 Perl_csighandler(int sig)
1323 #ifdef PERL_GET_SIG_CONTEXT
1324 dTHXa(PERL_GET_SIG_CONTEXT);
1328 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1329 (void) rsignal(sig, PL_csighandlerp);
1330 if (PL_sig_ignoring[sig]) return;
1332 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1333 if (PL_sig_defaulting[sig])
1334 #ifdef KILL_BY_SIGPRC
1335 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1350 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1351 /* Call the perl level handler now--
1352 * with risk we may be in malloc() etc. */
1353 (*PL_sighandlerp)(sig);
1355 S_raise_signal(aTHX_ sig);
1358 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1360 Perl_csighandler_init(void)
1363 if (PL_sig_handlers_initted) return;
1365 for (sig = 1; sig < SIG_SIZE; sig++) {
1366 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1368 PL_sig_defaulting[sig] = 1;
1369 (void) rsignal(sig, PL_csighandlerp);
1371 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1372 PL_sig_ignoring[sig] = 0;
1375 PL_sig_handlers_initted = 1;
1380 Perl_despatch_signals(pTHX)
1384 for (sig = 1; sig < SIG_SIZE; sig++) {
1385 if (PL_psig_pend[sig]) {
1386 PERL_BLOCKSIG_ADD(set, sig);
1387 PL_psig_pend[sig] = 0;
1388 PERL_BLOCKSIG_BLOCK(set);
1389 (*PL_sighandlerp)(sig);
1390 PERL_BLOCKSIG_UNBLOCK(set);
1396 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1400 /* Need to be careful with SvREFCNT_dec(), because that can have side
1401 * effects (due to closures). We must make sure that the new disposition
1402 * is in place before it is called.
1406 #ifdef HAS_SIGPROCMASK
1411 register const char *s = MgPV_const(mg,len);
1413 if (strEQ(s,"__DIE__"))
1415 else if (strEQ(s,"__WARN__"))
1418 Perl_croak(aTHX_ "No such hook: %s", s);
1421 if (*svp != PERL_WARNHOOK_FATAL)
1427 i = whichsig((char *)s); /* ...no, a brick */
1429 if (ckWARN(WARN_SIGNAL))
1430 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1433 #ifdef HAS_SIGPROCMASK
1434 /* Avoid having the signal arrive at a bad time, if possible. */
1437 sigprocmask(SIG_BLOCK, &set, &save);
1439 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1440 SAVEFREESV(save_sv);
1441 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1444 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1445 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1447 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1448 PL_sig_ignoring[i] = 0;
1450 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1451 PL_sig_defaulting[i] = 0;
1453 SvREFCNT_dec(PL_psig_name[i]);
1454 to_dec = PL_psig_ptr[i];
1455 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1456 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1457 PL_psig_name[i] = newSVpvn(s, len);
1458 SvREADONLY_on(PL_psig_name[i]);
1460 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1462 (void)rsignal(i, PL_csighandlerp);
1463 #ifdef HAS_SIGPROCMASK
1468 *svp = SvREFCNT_inc_simple_NN(sv);
1470 SvREFCNT_dec(to_dec);
1473 s = SvOK(sv) ? SvPV_force(sv,len) : "DEFAULT";
1474 if (strEQ(s,"IGNORE")) {
1476 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1477 PL_sig_ignoring[i] = 1;
1478 (void)rsignal(i, PL_csighandlerp);
1480 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1484 else if (strEQ(s,"DEFAULT") || !*s) {
1486 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1488 PL_sig_defaulting[i] = 1;
1489 (void)rsignal(i, PL_csighandlerp);
1492 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1497 * We should warn if HINT_STRICT_REFS, but without
1498 * access to a known hint bit in a known OP, we can't
1499 * tell whether HINT_STRICT_REFS is in force or not.
1501 if (!strchr(s,':') && !strchr(s,'\''))
1502 Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"));
1504 (void)rsignal(i, PL_csighandlerp);
1506 *svp = SvREFCNT_inc_simple_NN(sv);
1508 #ifdef HAS_SIGPROCMASK
1513 SvREFCNT_dec(to_dec);
1516 #endif /* !PERL_MICRO */
1519 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1521 PERL_UNUSED_ARG(sv);
1522 PERL_UNUSED_ARG(mg);
1523 PL_sub_generation++;
1528 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1530 PERL_UNUSED_ARG(sv);
1531 PERL_UNUSED_ARG(mg);
1532 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1533 PL_amagic_generation++;
1539 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1541 HV * const hv = (HV*)LvTARG(sv);
1543 PERL_UNUSED_ARG(mg);
1546 (void) hv_iterinit(hv);
1547 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1550 while (hv_iternext(hv))
1555 sv_setiv(sv, (IV)i);
1560 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1562 PERL_UNUSED_ARG(mg);
1564 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1569 /* caller is responsible for stack switching/cleanup */
1571 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1577 PUSHs(SvTIED_obj(sv, mg));
1580 if (mg->mg_len >= 0)
1581 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1582 else if (mg->mg_len == HEf_SVKEY)
1583 PUSHs((SV*)mg->mg_ptr);
1585 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1586 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1594 return call_method(meth, flags);
1598 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1604 PUSHSTACKi(PERLSI_MAGIC);
1606 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1607 sv_setsv(sv, *PL_stack_sp--);
1617 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1620 mg->mg_flags |= MGf_GSKIP;
1621 magic_methpack(sv,mg,"FETCH");
1626 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1630 PUSHSTACKi(PERLSI_MAGIC);
1631 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1638 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1640 return magic_methpack(sv,mg,"DELETE");
1645 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1652 PUSHSTACKi(PERLSI_MAGIC);
1653 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1654 sv = *PL_stack_sp--;
1655 retval = (U32) SvIV(sv)-1;
1664 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1669 PUSHSTACKi(PERLSI_MAGIC);
1671 XPUSHs(SvTIED_obj(sv, mg));
1673 call_method("CLEAR", G_SCALAR|G_DISCARD);
1681 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1684 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1688 PUSHSTACKi(PERLSI_MAGIC);
1691 PUSHs(SvTIED_obj(sv, mg));
1696 if (call_method(meth, G_SCALAR))
1697 sv_setsv(key, *PL_stack_sp--);
1706 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1708 return magic_methpack(sv,mg,"EXISTS");
1712 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1716 SV * const tied = SvTIED_obj((SV*)hv, mg);
1717 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1719 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1721 if (HvEITER_get(hv))
1722 /* we are in an iteration so the hash cannot be empty */
1724 /* no xhv_eiter so now use FIRSTKEY */
1725 key = sv_newmortal();
1726 magic_nextpack((SV*)hv, mg, key);
1727 HvEITER_set(hv, NULL); /* need to reset iterator */
1728 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1731 /* there is a SCALAR method that we can call */
1733 PUSHSTACKi(PERLSI_MAGIC);
1739 if (call_method("SCALAR", G_SCALAR))
1740 retval = *PL_stack_sp--;
1742 retval = &PL_sv_undef;
1749 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1751 GV * const gv = PL_DBline;
1752 const I32 i = SvTRUE(sv);
1753 SV ** const svp = av_fetch(GvAV(gv),
1754 atoi(MgPV_nolen_const(mg)), FALSE);
1755 if (svp && SvIOKp(*svp)) {
1756 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1758 /* set or clear breakpoint in the relevant control op */
1760 o->op_flags |= OPf_SPECIAL;
1762 o->op_flags &= ~OPf_SPECIAL;
1769 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1771 AV *obj = (AV*)mg->mg_obj;
1773 sv_setiv(sv, AvFILL(obj) + CopARYBASE_get(PL_curcop));
1781 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1783 AV *obj = (AV*)mg->mg_obj;
1785 av_fill(obj, SvIV(sv) - CopARYBASE_get(PL_curcop));
1787 if (ckWARN(WARN_MISC))
1788 Perl_warner(aTHX_ packWARN(WARN_MISC),
1789 "Attempt to set length of freed array");
1795 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1797 SV* const lsv = LvTARG(sv);
1798 PERL_UNUSED_ARG(mg);
1800 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1801 MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
1802 if (found && found->mg_len >= 0) {
1803 I32 i = found->mg_len;
1805 sv_pos_b2u(lsv, &i);
1806 sv_setiv(sv, i + CopARYBASE_get(PL_curcop));
1815 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1817 SV* const lsv = LvTARG(sv);
1823 PERL_UNUSED_ARG(mg);
1825 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1826 found = mg_find(lsv, PERL_MAGIC_regex_global);
1832 #ifdef PERL_OLD_COPY_ON_WRITE
1834 sv_force_normal_flags(lsv, 0);
1836 found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
1839 else if (!SvOK(sv)) {
1843 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1845 pos = SvIV(sv) - CopARYBASE_get(PL_curcop);
1848 ulen = sv_len_utf8(lsv);
1858 else if (pos > (SSize_t)len)
1863 sv_pos_u2b(lsv, &p, 0);
1867 found->mg_len = pos;
1868 found->mg_flags &= ~MGf_MINMATCH;
1874 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1876 const U32 wasfake = SvFLAGS(sv) & SVf_FAKE;
1877 PERL_UNUSED_ARG(mg);
1879 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1882 gv_efullname3(sv,((GV*)sv), "*");
1883 SvFLAGS(sv) |= wasfake;
1889 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1892 PERL_UNUSED_ARG(mg);
1896 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
1901 GvGP(sv) = gp_ref(GvGP(gv));
1906 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1909 SV * const lsv = LvTARG(sv);
1910 const char * const tmps = SvPV_const(lsv,len);
1911 I32 offs = LvTARGOFF(sv);
1912 I32 rem = LvTARGLEN(sv);
1913 PERL_UNUSED_ARG(mg);
1916 sv_pos_u2b(lsv, &offs, &rem);
1917 if (offs > (I32)len)
1919 if (rem + offs > (I32)len)
1921 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1928 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1931 const char * const tmps = SvPV_const(sv, len);
1932 SV * const lsv = LvTARG(sv);
1933 I32 lvoff = LvTARGOFF(sv);
1934 I32 lvlen = LvTARGLEN(sv);
1935 PERL_UNUSED_ARG(mg);
1938 sv_utf8_upgrade(lsv);
1939 sv_pos_u2b(lsv, &lvoff, &lvlen);
1940 sv_insert(lsv, lvoff, lvlen, (char *)tmps, len);
1943 else if (lsv && SvUTF8(lsv)) {
1945 sv_pos_u2b(lsv, &lvoff, &lvlen);
1946 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
1947 sv_insert(lsv, lvoff, lvlen, (char *)utf8, len);
1951 sv_insert(lsv, lvoff, lvlen, (char *)tmps, len);
1957 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1959 PERL_UNUSED_ARG(sv);
1960 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
1965 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1967 PERL_UNUSED_ARG(sv);
1968 /* update taint status unless we're restoring at scope exit */
1969 if (PL_localizing != 2) {
1979 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1981 SV * const lsv = LvTARG(sv);
1982 PERL_UNUSED_ARG(mg);
1985 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1993 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1995 PERL_UNUSED_ARG(mg);
1996 do_vecset(sv); /* XXX slurp this routine */
2001 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2004 if (LvTARGLEN(sv)) {
2006 SV * const ahv = LvTARG(sv);
2007 if (SvTYPE(ahv) == SVt_PVHV) {
2008 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
2013 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, FALSE, 0);
2019 AV* const av = (AV*)LvTARG(sv);
2020 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
2021 targ = AvARRAY(av)[LvTARGOFF(sv)];
2023 if (targ && (targ != &PL_sv_undef)) {
2024 /* somebody else defined it for us */
2025 SvREFCNT_dec(LvTARG(sv));
2026 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2028 SvREFCNT_dec(mg->mg_obj);
2030 mg->mg_flags &= ~MGf_REFCOUNTED;
2035 sv_setsv(sv, targ ? targ : &PL_sv_undef);
2040 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2042 PERL_UNUSED_ARG(mg);
2046 sv_setsv(LvTARG(sv), sv);
2047 SvSETMAGIC(LvTARG(sv));
2053 Perl_vivify_defelem(pTHX_ SV *sv)
2058 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2061 SV * const ahv = LvTARG(sv);
2062 if (SvTYPE(ahv) == SVt_PVHV) {
2063 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
2068 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, TRUE, 0);
2072 if (!value || value == &PL_sv_undef)
2073 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
2076 AV* const av = (AV*)LvTARG(sv);
2077 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2078 LvTARG(sv) = NULL; /* array can't be extended */
2080 SV* const * const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2081 if (!svp || (value = *svp) == &PL_sv_undef)
2082 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2085 SvREFCNT_inc_simple_void(value);
2086 SvREFCNT_dec(LvTARG(sv));
2089 SvREFCNT_dec(mg->mg_obj);
2091 mg->mg_flags &= ~MGf_REFCOUNTED;
2095 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2097 AV *const av = (AV*)mg->mg_obj;
2098 SV **svp = AvARRAY(av);
2099 PERL_UNUSED_ARG(sv);
2101 /* Not sure why the av can get freed ahead of its sv, but somehow it does
2102 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
2103 if (svp && !SvIS_FREED(av)) {
2104 SV *const *const last = svp + AvFILLp(av);
2106 while (svp <= last) {
2108 SV *const referrer = *svp;
2109 if (SvWEAKREF(referrer)) {
2110 /* XXX Should we check that it hasn't changed? */
2111 SvRV_set(referrer, 0);
2113 SvWEAKREF_off(referrer);
2116 "panic: magic_killbackrefs (flags=%"UVxf")",
2125 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
2130 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2132 PERL_UNUSED_CONTEXT;
2139 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2141 PERL_UNUSED_ARG(mg);
2142 sv_unmagic(sv, PERL_MAGIC_bm);
2148 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2150 PERL_UNUSED_ARG(mg);
2151 sv_unmagic(sv, PERL_MAGIC_fm);
2157 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2159 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2161 if (uf && uf->uf_set)
2162 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2167 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2169 PERL_UNUSED_ARG(mg);
2170 sv_unmagic(sv, PERL_MAGIC_qr);
2175 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2177 regexp * const re = (regexp *)mg->mg_obj;
2178 PERL_UNUSED_ARG(sv);
2184 #ifdef USE_LOCALE_COLLATE
2186 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2189 * RenE<eacute> Descartes said "I think not."
2190 * and vanished with a faint plop.
2192 PERL_UNUSED_CONTEXT;
2193 PERL_UNUSED_ARG(sv);
2195 Safefree(mg->mg_ptr);
2201 #endif /* USE_LOCALE_COLLATE */
2203 /* Just clear the UTF-8 cache data. */
2205 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2207 PERL_UNUSED_CONTEXT;
2208 PERL_UNUSED_ARG(sv);
2209 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2211 mg->mg_len = -1; /* The mg_len holds the len cache. */
2216 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2218 register const char *s;
2221 switch (*mg->mg_ptr) {
2222 case '\001': /* ^A */
2223 sv_setsv(PL_bodytarget, sv);
2225 case '\003': /* ^C */
2226 PL_minus_c = (bool)SvIV(sv);
2229 case '\004': /* ^D */
2231 s = SvPV_nolen_const(sv);
2232 PL_debug = get_debug_opts_flags((char **)&s, 0) | DEBUG_TOP_FLAG;
2233 DEBUG_x(dump_all());
2235 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2238 case '\005': /* ^E */
2239 if (*(mg->mg_ptr+1) == '\0') {
2240 #ifdef MACOS_TRADITIONAL
2241 gMacPerl_OSErr = SvIV(sv);
2244 set_vaxc_errno(SvIV(sv));
2247 SetLastError( SvIV(sv) );
2250 os2_setsyserrno(SvIV(sv));
2252 /* will anyone ever use this? */
2253 SETERRNO(SvIV(sv), 4);
2259 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2261 SvREFCNT_dec(PL_encoding);
2262 if (SvOK(sv) || SvGMAGICAL(sv)) {
2263 PL_encoding = newSVsv(sv);
2270 case '\006': /* ^F */
2271 PL_maxsysfd = SvIV(sv);
2273 case '\010': /* ^H */
2274 PL_hints = SvIV(sv);
2276 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2277 Safefree(PL_inplace);
2278 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2280 case '\017': /* ^O */
2281 if (*(mg->mg_ptr+1) == '\0') {
2282 Safefree(PL_osname);
2285 TAINT_PROPER("assigning to $^O");
2286 PL_osname = savesvpv(sv);
2289 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2290 if (!PL_compiling.cop_io)
2291 PL_compiling.cop_io = newSVsv(sv);
2293 sv_setsv(PL_compiling.cop_io,sv);
2296 case '\020': /* ^P */
2297 PL_perldb = SvIV(sv);
2298 if (PL_perldb && !PL_DBsingle)
2301 case '\024': /* ^T */
2303 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2305 PL_basetime = (Time_t)SvIV(sv);
2308 case '\025': /* ^UTF8CACHE */
2309 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2310 PL_utf8cache = (signed char) sv_2iv(sv);
2313 case '\027': /* ^W & $^WARNING_BITS */
2314 if (*(mg->mg_ptr+1) == '\0') {
2315 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2317 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2318 | (i ? G_WARN_ON : G_WARN_OFF) ;
2321 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2322 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2323 if (!SvPOK(sv) && PL_localizing) {
2324 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2325 PL_compiling.cop_warnings = pWARN_NONE;
2330 int accumulate = 0 ;
2331 int any_fatals = 0 ;
2332 const char * const ptr = SvPV_const(sv, len) ;
2333 for (i = 0 ; i < len ; ++i) {
2334 accumulate |= ptr[i] ;
2335 any_fatals |= (ptr[i] & 0xAA) ;
2338 PL_compiling.cop_warnings = pWARN_NONE;
2339 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2340 PL_compiling.cop_warnings = pWARN_ALL;
2341 PL_dowarn |= G_WARN_ONCE ;
2344 if (specialWARN(PL_compiling.cop_warnings))
2345 PL_compiling.cop_warnings = newSVsv(sv) ;
2347 sv_setsv(PL_compiling.cop_warnings, sv);
2348 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2349 PL_dowarn |= G_WARN_ONCE ;
2357 if (PL_localizing) {
2358 if (PL_localizing == 1)
2359 SAVESPTR(PL_last_in_gv);
2361 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2362 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2365 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2366 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2367 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2370 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2371 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2372 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2375 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
2378 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2379 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2380 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2383 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
2387 IO * const io = GvIOp(PL_defoutgv);
2390 if ((SvIV(sv)) == 0)
2391 IoFLAGS(io) &= ~IOf_FLUSH;
2393 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2394 PerlIO *ofp = IoOFP(io);
2396 (void)PerlIO_flush(ofp);
2397 IoFLAGS(io) |= IOf_FLUSH;
2403 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2404 PL_multiline = (i != 0);
2407 SvREFCNT_dec(PL_rs);
2408 PL_rs = newSVsv(sv);
2412 SvREFCNT_dec(PL_ors_sv);
2413 if (SvOK(sv) || SvGMAGICAL(sv)) {
2414 PL_ors_sv = newSVsv(sv);
2422 SvREFCNT_dec(PL_ofs_sv);
2423 if (SvOK(sv) || SvGMAGICAL(sv)) {
2424 PL_ofs_sv = newSVsv(sv);
2433 PL_ofmt = savesvpv(sv);
2436 CopARYBASE_set(&PL_compiling, SvIV(sv));
2439 #ifdef COMPLEX_STATUS
2440 if (PL_localizing == 2) {
2441 PL_statusvalue = LvTARGOFF(sv);
2442 PL_statusvalue_vms = LvTARGLEN(sv);
2446 #ifdef VMSISH_STATUS
2448 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2451 STATUS_UNIX_EXIT_SET(SvIV(sv));
2456 # define PERL_VMS_BANG vaxc$errno
2458 # define PERL_VMS_BANG 0
2460 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2461 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2466 if (PL_delaymagic) {
2467 PL_delaymagic |= DM_RUID;
2468 break; /* don't do magic till later */
2471 (void)setruid((Uid_t)PL_uid);
2474 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2476 #ifdef HAS_SETRESUID
2477 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2479 if (PL_uid == PL_euid) { /* special case $< = $> */
2481 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2482 if (PL_uid != 0 && PerlProc_getuid() == 0)
2483 (void)PerlProc_setuid(0);
2485 (void)PerlProc_setuid(PL_uid);
2487 PL_uid = PerlProc_getuid();
2488 Perl_croak(aTHX_ "setruid() not implemented");
2493 PL_uid = PerlProc_getuid();
2494 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2498 if (PL_delaymagic) {
2499 PL_delaymagic |= DM_EUID;
2500 break; /* don't do magic till later */
2503 (void)seteuid((Uid_t)PL_euid);
2506 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2508 #ifdef HAS_SETRESUID
2509 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2511 if (PL_euid == PL_uid) /* special case $> = $< */
2512 PerlProc_setuid(PL_euid);
2514 PL_euid = PerlProc_geteuid();
2515 Perl_croak(aTHX_ "seteuid() not implemented");
2520 PL_euid = PerlProc_geteuid();
2521 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2525 if (PL_delaymagic) {
2526 PL_delaymagic |= DM_RGID;
2527 break; /* don't do magic till later */
2530 (void)setrgid((Gid_t)PL_gid);
2533 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2535 #ifdef HAS_SETRESGID
2536 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2538 if (PL_gid == PL_egid) /* special case $( = $) */
2539 (void)PerlProc_setgid(PL_gid);
2541 PL_gid = PerlProc_getgid();
2542 Perl_croak(aTHX_ "setrgid() not implemented");
2547 PL_gid = PerlProc_getgid();
2548 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2551 #ifdef HAS_SETGROUPS
2553 const char *p = SvPV_const(sv, len);
2554 Groups_t *gary = NULL;
2559 for (i = 0; i < NGROUPS; ++i) {
2560 while (*p && !isSPACE(*p))
2567 Newx(gary, i + 1, Groups_t);
2569 Renew(gary, i + 1, Groups_t);
2573 (void)setgroups(i, gary);
2576 #else /* HAS_SETGROUPS */
2578 #endif /* HAS_SETGROUPS */
2579 if (PL_delaymagic) {
2580 PL_delaymagic |= DM_EGID;
2581 break; /* don't do magic till later */
2584 (void)setegid((Gid_t)PL_egid);
2587 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2589 #ifdef HAS_SETRESGID
2590 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2592 if (PL_egid == PL_gid) /* special case $) = $( */
2593 (void)PerlProc_setgid(PL_egid);
2595 PL_egid = PerlProc_getegid();
2596 Perl_croak(aTHX_ "setegid() not implemented");
2601 PL_egid = PerlProc_getegid();
2602 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2605 PL_chopset = SvPV_force(sv,len);
2607 #ifndef MACOS_TRADITIONAL
2609 LOCK_DOLLARZERO_MUTEX;
2610 #ifdef HAS_SETPROCTITLE
2611 /* The BSDs don't show the argv[] in ps(1) output, they
2612 * show a string from the process struct and provide
2613 * the setproctitle() routine to manipulate that. */
2614 if (PL_origalen != 1) {
2615 s = SvPV_const(sv, len);
2616 # if __FreeBSD_version > 410001
2617 /* The leading "-" removes the "perl: " prefix,
2618 * but not the "(perl) suffix from the ps(1)
2619 * output, because that's what ps(1) shows if the
2620 * argv[] is modified. */
2621 setproctitle("-%s", s);
2622 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2623 /* This doesn't really work if you assume that
2624 * $0 = 'foobar'; will wipe out 'perl' from the $0
2625 * because in ps(1) output the result will be like
2626 * sprintf("perl: %s (perl)", s)
2627 * I guess this is a security feature:
2628 * one (a user process) cannot get rid of the original name.
2630 setproctitle("%s", s);
2633 #elif defined(__hpux) && defined(PSTAT_SETCMD)
2634 if (PL_origalen != 1) {
2636 s = SvPV_const(sv, len);
2637 un.pst_command = (char *)s;
2638 pstat(PSTAT_SETCMD, un, len, 0, 0);
2641 if (PL_origalen > 1) {
2642 /* PL_origalen is set in perl_parse(). */
2643 s = SvPV_force(sv,len);
2644 if (len >= (STRLEN)PL_origalen-1) {
2645 /* Longer than original, will be truncated. We assume that
2646 * PL_origalen bytes are available. */
2647 Copy(s, PL_origargv[0], PL_origalen-1, char);
2650 /* Shorter than original, will be padded. */
2652 /* Special case for Mac OS X: see [perl #38868] */
2655 /* Is the space counterintuitive? Yes.
2656 * (You were expecting \0?)
2657 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2659 const int pad = ' ';
2661 Copy(s, PL_origargv[0], len, char);
2662 PL_origargv[0][len] = 0;
2663 memset(PL_origargv[0] + len + 1,
2664 pad, PL_origalen - len - 1);
2666 PL_origargv[0][PL_origalen-1] = 0;
2667 for (i = 1; i < PL_origargc; i++)
2671 UNLOCK_DOLLARZERO_MUTEX;
2674 #ifdef USE_5005THREADS
2676 sv_setsv(thr->errsv, sv);
2678 #endif /* USE_5005THREADS */
2683 #ifdef USE_5005THREADS
2685 Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg)
2687 DEBUG_S(PerlIO_printf(Perl_debug_log,
2688 "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n",
2689 PTR2UV(thr), PTR2UV(sv)));
2691 Perl_croak(aTHX_ "panic: magic_mutexfree");
2692 MUTEX_DESTROY(MgMUTEXP(mg));
2693 COND_DESTROY(MgCONDP(mg));
2696 #endif /* USE_5005THREADS */
2699 Perl_whichsig(pTHX_ char *sig)
2701 register const char * const *sigv;
2702 PERL_UNUSED_CONTEXT;
2704 for (sigv = PL_sig_name; *sigv; sigv++)
2705 if (strEQ(sig,*sigv))
2706 return PL_sig_num[sigv - PL_sig_name];
2708 if (strEQ(sig,"CHLD"))
2712 if (strEQ(sig,"CLD"))
2718 #if !defined(PERL_IMPLICIT_CONTEXT)
2719 static SV* PL_sig_sv;
2723 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2724 Perl_sighandler(int sig)
2726 Perl_sighandler_va(sig);
2730 Perl_sighandler_va(int sig, ...)
2732 Perl_sighandler(int sig)
2735 #ifdef PERL_GET_SIG_CONTEXT
2736 dTHXa(PERL_GET_SIG_CONTEXT);
2743 SV * const tSv = PL_Sv;
2747 XPV * const tXpv = PL_Xpv;
2749 if (PL_savestack_ix + 15 <= PL_savestack_max)
2751 if (PL_markstack_ptr < PL_markstack_max - 2)
2753 if (PL_retstack_ix < PL_retstack_max - 2)
2755 if (PL_scopestack_ix < PL_scopestack_max - 3)
2758 if (!PL_psig_ptr[sig]) {
2759 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2764 /* Max number of items pushed there is 3*n or 4. We cannot fix
2765 infinity, so we fix 4 (in fact 5): */
2767 PL_savestack_ix += 5; /* Protect save in progress. */
2768 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2771 PL_markstack_ptr++; /* Protect mark. */
2774 PL_retstack[PL_retstack_ix] = NULL;
2777 PL_scopestack_ix += 1;
2778 /* sv_2cv is too complicated, try a simpler variant first: */
2779 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2780 || SvTYPE(cv) != SVt_PVCV) {
2782 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2785 if (!cv || !CvROOT(cv)) {
2786 if (ckWARN(WARN_SIGNAL))
2787 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2788 PL_sig_name[sig], (gv ? GvENAME(gv)
2795 if(PL_psig_name[sig]) {
2796 sv = SvREFCNT_inc_NN(PL_psig_name[sig]);
2798 #if !defined(PERL_IMPLICIT_CONTEXT)
2802 sv = sv_newmortal();
2803 sv_setpv(sv,PL_sig_name[sig]);
2806 PUSHSTACKi(PERLSI_SIGNAL);
2809 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2811 struct sigaction oact;
2813 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2817 va_start(args, sig);
2818 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2821 SV *rv = newRV_noinc((SV*)sih);
2822 /* The siginfo fields signo, code, errno, pid, uid,
2823 * addr, status, and band are defined by POSIX/SUSv3. */
2824 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2825 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
2826 #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. */
2827 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
2828 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
2829 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2830 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2831 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
2832 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
2836 PUSHs(newSVpv((char *)sip, sizeof(*sip)));
2845 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2848 if (SvTRUE(ERRSV)) {
2850 #ifdef HAS_SIGPROCMASK
2851 /* Handler "died", for example to get out of a restart-able read().
2852 * Before we re-do that on its behalf re-enable the signal which was
2853 * blocked by the system when we entered.
2857 sigaddset(&set,sig);
2858 sigprocmask(SIG_UNBLOCK, &set, NULL);
2860 /* Not clear if this will work */
2861 (void)rsignal(sig, SIG_IGN);
2862 (void)rsignal(sig, PL_csighandlerp);
2864 #endif /* !PERL_MICRO */
2865 Perl_die(aTHX_ NULL);
2869 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2875 PL_scopestack_ix -= 1;
2878 PL_op = myop; /* Apparently not needed... */
2880 PL_Sv = tSv; /* Restore global temporaries. */
2887 S_restore_magic(pTHX_ const void *p)
2889 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2890 SV* const sv = mgs->mgs_sv;
2895 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2898 SvFLAGS(sv) |= mgs->mgs_flags;
2901 if (SvGMAGICAL(sv)) {
2902 /* downgrade public flags to private,
2903 and discard any other private flags */
2905 const U32 pubflags = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2907 SvFLAGS(sv) &= ~( pubflags | (SVp_IOK|SVp_NOK|SVp_POK) );
2908 SvFLAGS(sv) |= ( pubflags << PRIVSHIFT );
2913 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2915 /* If we're still on top of the stack, pop us off. (That condition
2916 * will be satisfied if restore_magic was called explicitly, but *not*
2917 * if it's being called via leave_scope.)
2918 * The reason for doing this is that otherwise, things like sv_2cv()
2919 * may leave alloc gunk on the savestack, and some code
2920 * (e.g. sighandler) doesn't expect that...
2922 if (PL_savestack_ix == mgs->mgs_ss_ix)
2924 I32 popval = SSPOPINT;
2925 assert(popval == SAVEt_DESTRUCTOR_X);
2926 PL_savestack_ix -= 2;
2928 assert(popval == SAVEt_ALLOC);
2930 PL_savestack_ix -= popval;
2936 S_unwind_handler_stack(pTHX_ const void *p)
2938 const U32 flags = *(const U32*)p;
2941 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2942 #if !defined(PERL_IMPLICIT_CONTEXT)
2944 SvREFCNT_dec(PL_sig_sv);
2950 * c-indentation-style: bsd
2952 * indent-tabs-mode: t
2955 * ex: set ts=8 sts=4 sw=4 noet: