3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005 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)
87 assert(SvMAGICAL(sv));
88 #ifdef PERL_OLD_COPY_ON_WRITE
89 /* Turning READONLY off for a copy-on-write scalar is a bad idea. */
91 sv_force_normal_flags(sv, 0);
94 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
96 mgs = SSPTR(mgs_ix, MGS*);
98 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
99 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
103 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
107 =for apidoc mg_magical
109 Turns on the magical status of an SV. See C<sv_magic>.
115 Perl_mg_magical(pTHX_ SV *sv)
118 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
119 const MGVTBL* const vtbl = mg->mg_virtual;
121 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
125 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
134 Do magic after a value is retrieved from the SV. See C<sv_magic>.
140 Perl_mg_get(pTHX_ SV *sv)
142 const I32 mgs_ix = SSNEW(sizeof(MGS));
143 const bool was_temp = (bool)SvTEMP(sv);
145 MAGIC *newmg, *head, *cur, *mg;
146 /* guard against sv having being freed midway by holding a private
149 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
150 cause the SV's buffer to get stolen (and maybe other stuff).
153 sv_2mortal(SvREFCNT_inc(sv));
158 save_magic(mgs_ix, sv);
160 /* We must call svt_get(sv, mg) for each valid entry in the linked
161 list of magic. svt_get() may delete the current entry, add new
162 magic to the head of the list, or upgrade the SV. AMS 20010810 */
164 newmg = cur = head = mg = SvMAGIC(sv);
166 const MGVTBL * const vtbl = mg->mg_virtual;
168 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
169 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
171 /* guard against magic having been deleted - eg FETCH calling
176 /* Don't restore the flags for this entry if it was deleted. */
177 if (mg->mg_flags & MGf_GSKIP)
178 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
181 mg = mg->mg_moremagic;
184 /* Have we finished with the new entries we saw? Start again
185 where we left off (unless there are more new entries). */
193 /* Were any new entries added? */
194 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
201 restore_magic(INT2PTR(void *, (IV)mgs_ix));
203 if (SvREFCNT(sv) == 1) {
204 /* We hold the last reference to this SV, which implies that the
205 SV was deleted as a side effect of the routines we called. */
214 Do magic after a value is assigned to the SV. See C<sv_magic>.
220 Perl_mg_set(pTHX_ SV *sv)
222 const I32 mgs_ix = SSNEW(sizeof(MGS));
226 save_magic(mgs_ix, sv);
228 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
229 const MGVTBL* vtbl = mg->mg_virtual;
230 nextmg = mg->mg_moremagic; /* it may delete itself */
231 if (mg->mg_flags & MGf_GSKIP) {
232 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
233 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
235 if (vtbl && vtbl->svt_set)
236 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
239 restore_magic(INT2PTR(void*, (IV)mgs_ix));
244 =for apidoc mg_length
246 Report on the SV's length. See C<sv_magic>.
252 Perl_mg_length(pTHX_ SV *sv)
257 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
258 const MGVTBL * const vtbl = mg->mg_virtual;
259 if (vtbl && vtbl->svt_len) {
260 const I32 mgs_ix = SSNEW(sizeof(MGS));
261 save_magic(mgs_ix, sv);
262 /* omit MGf_GSKIP -- not changed here */
263 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
264 restore_magic(INT2PTR(void*, (IV)mgs_ix));
270 const U8 *s = (U8*)SvPV_const(sv, len);
271 len = Perl_utf8_length(aTHX_ s, s + len);
274 (void)SvPV_const(sv, len);
279 Perl_mg_size(pTHX_ SV *sv)
283 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
284 const MGVTBL* const vtbl = mg->mg_virtual;
285 if (vtbl && vtbl->svt_len) {
286 const I32 mgs_ix = SSNEW(sizeof(MGS));
288 save_magic(mgs_ix, sv);
289 /* omit MGf_GSKIP -- not changed here */
290 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
291 restore_magic(INT2PTR(void*, (IV)mgs_ix));
298 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
302 Perl_croak(aTHX_ "Size magic not implemented");
311 Clear something magical that the SV represents. See C<sv_magic>.
317 Perl_mg_clear(pTHX_ SV *sv)
319 const I32 mgs_ix = SSNEW(sizeof(MGS));
322 save_magic(mgs_ix, sv);
324 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
325 const MGVTBL* const vtbl = mg->mg_virtual;
326 /* omit GSKIP -- never set here */
328 if (vtbl && vtbl->svt_clear)
329 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
332 restore_magic(INT2PTR(void*, (IV)mgs_ix));
339 Finds the magic pointer for type matching the SV. See C<sv_magic>.
345 Perl_mg_find(pTHX_ const SV *sv, int type)
349 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
350 if (mg->mg_type == type)
360 Copies the magic from one SV to another. See C<sv_magic>.
366 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
370 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
371 const MGVTBL* const vtbl = mg->mg_virtual;
372 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
373 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
376 const char type = mg->mg_type;
379 (type == PERL_MAGIC_tied)
381 : (type == PERL_MAGIC_regdata && mg->mg_obj)
384 toLOWER(type), key, klen);
393 =for apidoc mg_localize
395 Copy some of the magic from an existing SV to new localized version of
396 that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
397 doesn't (eg taint, pos).
403 Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
406 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
407 const MGVTBL* const vtbl = mg->mg_virtual;
408 switch (mg->mg_type) {
409 /* value magic types: don't copy */
412 case PERL_MAGIC_regex_global:
413 case PERL_MAGIC_nkeys:
414 #ifdef USE_LOCALE_COLLATE
415 case PERL_MAGIC_collxfrm:
418 case PERL_MAGIC_taint:
420 case PERL_MAGIC_vstring:
421 case PERL_MAGIC_utf8:
422 case PERL_MAGIC_substr:
423 case PERL_MAGIC_defelem:
424 case PERL_MAGIC_arylen:
426 case PERL_MAGIC_backref:
427 case PERL_MAGIC_arylen_p:
428 case PERL_MAGIC_rhash:
429 case PERL_MAGIC_symtab:
433 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy) {
434 /* XXX calling the copy method is probably not correct. DAPM */
435 (void)CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv,
436 mg->mg_ptr, mg->mg_len);
439 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
440 mg->mg_ptr, mg->mg_len);
442 /* container types should remain read-only across localization */
443 SvFLAGS(nsv) |= SvREADONLY(sv);
446 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
447 SvFLAGS(nsv) |= SvMAGICAL(sv);
457 Free any magic storage used by the SV. See C<sv_magic>.
463 Perl_mg_free(pTHX_ SV *sv)
467 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
468 const MGVTBL* const vtbl = mg->mg_virtual;
469 moremagic = mg->mg_moremagic;
470 if (vtbl && vtbl->svt_free)
471 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
472 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
473 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
474 Safefree(mg->mg_ptr);
475 else if (mg->mg_len == HEf_SVKEY)
476 SvREFCNT_dec((SV*)mg->mg_ptr);
478 if (mg->mg_flags & MGf_REFCOUNTED)
479 SvREFCNT_dec(mg->mg_obj);
482 SvMAGIC_set(sv, NULL);
489 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
494 register const REGEXP * const rx = PM_GETRE(PL_curpm);
497 ? rx->nparens /* @+ */
498 : rx->lastparen; /* @- */
506 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
509 register const REGEXP * const rx = PM_GETRE(PL_curpm);
511 register const I32 paren = mg->mg_len;
516 if (paren <= (I32)rx->nparens &&
517 (s = rx->startp[paren]) != -1 &&
518 (t = rx->endp[paren]) != -1)
521 if (mg->mg_obj) /* @+ */
526 if (i > 0 && RX_MATCH_UTF8(rx)) {
527 const char * const b = rx->subbeg;
529 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
540 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
542 PERL_UNUSED_ARG(sv); PERL_UNUSED_ARG(mg);
543 Perl_croak(aTHX_ PL_no_modify);
544 NORETURN_FUNCTION_END;
548 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
552 register const REGEXP *rx;
555 switch (*mg->mg_ptr) {
556 case '1': case '2': case '3': case '4':
557 case '5': case '6': case '7': case '8': case '9': case '&':
558 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
560 paren = atoi(mg->mg_ptr); /* $& is in [0] */
562 if (paren <= (I32)rx->nparens &&
563 (s1 = rx->startp[paren]) != -1 &&
564 (t1 = rx->endp[paren]) != -1)
568 if (i > 0 && RX_MATCH_UTF8(rx)) {
569 const char * const s = rx->subbeg + s1;
574 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
578 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
582 if (ckWARN(WARN_UNINITIALIZED))
587 if (ckWARN(WARN_UNINITIALIZED))
592 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
593 paren = rx->lastparen;
598 case '\016': /* ^N */
599 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
600 paren = rx->lastcloseparen;
606 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
607 if (rx->startp[0] != -1) {
618 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
619 if (rx->endp[0] != -1) {
620 i = rx->sublen - rx->endp[0];
631 if (!SvPOK(sv) && SvNIOK(sv)) {
639 #define SvRTRIM(sv) STMT_START { \
640 STRLEN len = SvCUR(sv); \
641 while (len > 0 && isSPACE(SvPVX(sv)[len-1])) \
643 SvCUR_set(sv, len); \
647 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
651 register char *s = NULL;
654 const char * const remaining = mg->mg_ptr + 1;
655 const char nextchar = *remaining;
657 switch (*mg->mg_ptr) {
658 case '\001': /* ^A */
659 sv_setsv(sv, PL_bodytarget);
661 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
662 if (nextchar == '\0') {
663 sv_setiv(sv, (IV)PL_minus_c);
665 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
666 sv_setiv(sv, (IV)STATUS_NATIVE);
670 case '\004': /* ^D */
671 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
673 case '\005': /* ^E */
674 if (nextchar == '\0') {
675 #ifdef MACOS_TRADITIONAL
679 sv_setnv(sv,(double)gMacPerl_OSErr);
680 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
685 # include <descrip.h>
686 # include <starlet.h>
688 $DESCRIPTOR(msgdsc,msg);
689 sv_setnv(sv,(NV) vaxc$errno);
690 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
691 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
697 if (!(_emx_env & 0x200)) { /* Under DOS */
698 sv_setnv(sv, (NV)errno);
699 sv_setpv(sv, errno ? Strerror(errno) : "");
701 if (errno != errno_isOS2) {
702 const int tmp = _syserrno();
703 if (tmp) /* 2nd call to _syserrno() makes it 0 */
706 sv_setnv(sv, (NV)Perl_rc);
707 sv_setpv(sv, os2error(Perl_rc));
712 DWORD dwErr = GetLastError();
713 sv_setnv(sv, (NV)dwErr);
715 PerlProc_GetOSError(sv, dwErr);
718 sv_setpvn(sv, "", 0);
723 const int saveerrno = errno;
724 sv_setnv(sv, (NV)errno);
725 sv_setpv(sv, errno ? Strerror(errno) : "");
733 SvNOK_on(sv); /* what a wonderful hack! */
735 else if (strEQ(remaining, "NCODING"))
736 sv_setsv(sv, PL_encoding);
738 case '\006': /* ^F */
739 sv_setiv(sv, (IV)PL_maxsysfd);
741 case '\010': /* ^H */
742 sv_setiv(sv, (IV)PL_hints);
744 case '\011': /* ^I */ /* NOT \t in EBCDIC */
746 sv_setpv(sv, PL_inplace);
748 sv_setsv(sv, &PL_sv_undef);
750 case '\017': /* ^O & ^OPEN */
751 if (nextchar == '\0') {
752 sv_setpv(sv, PL_osname);
755 else if (strEQ(remaining, "PEN")) {
756 if (!PL_compiling.cop_io)
757 sv_setsv(sv, &PL_sv_undef);
759 sv_setsv(sv, PL_compiling.cop_io);
763 case '\020': /* ^P */
764 sv_setiv(sv, (IV)PL_perldb);
766 case '\023': /* ^S */
767 if (nextchar == '\0') {
768 if (PL_lex_state != LEX_NOTPARSING)
771 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
776 case '\024': /* ^T */
777 if (nextchar == '\0') {
779 sv_setnv(sv, PL_basetime);
781 sv_setiv(sv, (IV)PL_basetime);
784 else if (strEQ(remaining, "AINT"))
785 sv_setiv(sv, PL_tainting
786 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
789 case '\025': /* $^UNICODE, $^UTF8LOCALE */
790 if (strEQ(remaining, "NICODE"))
791 sv_setuv(sv, (UV) PL_unicode);
792 else if (strEQ(remaining, "TF8LOCALE"))
793 sv_setuv(sv, (UV) PL_utf8locale);
795 case '\027': /* ^W & $^WARNING_BITS */
796 if (nextchar == '\0')
797 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
798 else if (strEQ(remaining, "ARNING_BITS")) {
799 if (PL_compiling.cop_warnings == pWARN_NONE) {
800 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
802 else if (PL_compiling.cop_warnings == pWARN_STD) {
805 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
809 else if (PL_compiling.cop_warnings == pWARN_ALL) {
810 /* Get the bit mask for $warnings::Bits{all}, because
811 * it could have been extended by warnings::register */
813 HV * const bits=get_hv("warnings::Bits", FALSE);
814 if (bits && (bits_all=hv_fetch(bits, "all", 3, FALSE))) {
815 sv_setsv(sv, *bits_all);
818 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
822 sv_setsv(sv, PL_compiling.cop_warnings);
827 case '1': case '2': case '3': case '4':
828 case '5': case '6': case '7': case '8': case '9': case '&':
829 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
833 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
834 * XXX Does the new way break anything?
836 paren = atoi(mg->mg_ptr); /* $& is in [0] */
838 if (paren <= (I32)rx->nparens &&
839 (s1 = rx->startp[paren]) != -1 &&
840 (t1 = rx->endp[paren]) != -1)
849 int oldtainted = PL_tainted;
852 PL_tainted = oldtainted;
853 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
858 if (RX_MATCH_TAINTED(rx)) {
859 MAGIC* const mg = SvMAGIC(sv);
862 SvMAGIC_set(sv, mg->mg_moremagic);
864 if ((mgt = SvMAGIC(sv))) {
865 mg->mg_moremagic = mgt;
875 sv_setsv(sv,&PL_sv_undef);
878 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
879 paren = rx->lastparen;
883 sv_setsv(sv,&PL_sv_undef);
885 case '\016': /* ^N */
886 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
887 paren = rx->lastcloseparen;
891 sv_setsv(sv,&PL_sv_undef);
894 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
895 if ((s = rx->subbeg) && rx->startp[0] != -1) {
900 sv_setsv(sv,&PL_sv_undef);
903 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
904 if (rx->subbeg && rx->endp[0] != -1) {
905 s = rx->subbeg + rx->endp[0];
906 i = rx->sublen - rx->endp[0];
910 sv_setsv(sv,&PL_sv_undef);
913 if (GvIO(PL_last_in_gv)) {
914 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
919 sv_setiv(sv, (IV)STATUS_CURRENT);
920 #ifdef COMPLEX_STATUS
921 LvTARGOFF(sv) = PL_statusvalue;
922 LvTARGLEN(sv) = PL_statusvalue_vms;
927 if (GvIOp(PL_defoutgv))
928 s = IoTOP_NAME(GvIOp(PL_defoutgv));
932 sv_setpv(sv,GvENAME(PL_defoutgv));
937 if (GvIOp(PL_defoutgv))
938 s = IoFMT_NAME(GvIOp(PL_defoutgv));
940 s = GvENAME(PL_defoutgv);
944 if (GvIOp(PL_defoutgv))
945 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
948 if (GvIOp(PL_defoutgv))
949 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
952 if (GvIOp(PL_defoutgv))
953 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
960 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
963 if (GvIOp(PL_defoutgv))
964 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
970 sv_copypv(sv, PL_ors_sv);
974 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
975 sv_setpv(sv, errno ? Strerror(errno) : "");
978 const int saveerrno = errno;
979 sv_setnv(sv, (NV)errno);
981 if (errno == errno_isOS2 || errno == errno_isOS2_set)
982 sv_setpv(sv, os2error(Perl_rc));
985 sv_setpv(sv, errno ? Strerror(errno) : "");
990 SvNOK_on(sv); /* what a wonderful hack! */
993 sv_setiv(sv, (IV)PL_uid);
996 sv_setiv(sv, (IV)PL_euid);
999 sv_setiv(sv, (IV)PL_gid);
1000 #ifdef HAS_GETGROUPS
1001 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_gid);
1005 sv_setiv(sv, (IV)PL_egid);
1006 #ifdef HAS_GETGROUPS
1007 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_egid);
1010 #ifdef HAS_GETGROUPS
1012 Groups_t *gary = NULL;
1013 I32 num_groups = getgroups(0, gary);
1014 Newx(gary, num_groups, Groups_t);
1015 num_groups = getgroups(num_groups, gary);
1016 while (--num_groups >= 0)
1017 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f,
1018 (long unsigned int)gary[num_groups]);
1022 (void)SvIOK_on(sv); /* what a wonderful hack! */
1024 #ifndef MACOS_TRADITIONAL
1033 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1035 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1037 if (uf && uf->uf_val)
1038 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1043 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1050 s = SvPV_const(sv,len);
1051 ptr = MgPV_const(mg,klen);
1054 #ifdef DYNAMIC_ENV_FETCH
1055 /* We just undefd an environment var. Is a replacement */
1056 /* waiting in the wings? */
1059 if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
1060 s = SvPV_const(*valp, len);
1064 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1065 /* And you'll never guess what the dog had */
1066 /* in its mouth... */
1068 MgTAINTEDDIR_off(mg);
1070 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1071 char pathbuf[256], eltbuf[256], *cp, *elt;
1075 strncpy(eltbuf, s, 255);
1078 do { /* DCL$PATH may be a search list */
1079 while (1) { /* as may dev portion of any element */
1080 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1081 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1082 cando_by_name(S_IWUSR,0,elt) ) {
1083 MgTAINTEDDIR_on(mg);
1087 if ((cp = strchr(elt, ':')) != Nullch)
1089 if (my_trnlnm(elt, eltbuf, j++))
1095 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1098 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1099 const char * const strend = s + len;
1101 while (s < strend) {
1105 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1106 s, strend, ':', &i);
1108 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1110 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1111 MgTAINTEDDIR_on(mg);
1117 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1123 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1125 PERL_UNUSED_ARG(sv);
1126 my_setenv(MgPV_nolen_const(mg),Nullch);
1131 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1133 PERL_UNUSED_ARG(mg);
1135 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1137 if (PL_localizing) {
1140 hv_iterinit((HV*)sv);
1141 while ((entry = hv_iternext((HV*)sv))) {
1143 my_setenv(hv_iterkey(entry, &keylen),
1144 SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1152 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1155 PERL_UNUSED_ARG(sv);
1156 PERL_UNUSED_ARG(mg);
1158 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1166 #ifdef HAS_SIGPROCMASK
1168 restore_sigmask(pTHX_ SV *save_sv)
1170 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1171 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1175 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1177 /* Are we fetching a signal entry? */
1178 const I32 i = whichsig(MgPV_nolen_const(mg));
1181 sv_setsv(sv,PL_psig_ptr[i]);
1183 Sighandler_t sigstate;
1184 sigstate = rsignal_state(i);
1185 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1186 if (PL_sig_handlers_initted && PL_sig_ignoring[i]) sigstate = SIG_IGN;
1188 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1189 if (PL_sig_handlers_initted && PL_sig_defaulting[i]) sigstate = SIG_DFL;
1191 /* cache state so we don't fetch it again */
1192 if(sigstate == (Sighandler_t) SIG_IGN)
1193 sv_setpv(sv,"IGNORE");
1195 sv_setsv(sv,&PL_sv_undef);
1196 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1203 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1205 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1206 * refactoring might be in order.
1209 register const char * const s = MgPV_nolen_const(mg);
1210 PERL_UNUSED_ARG(sv);
1213 if (strEQ(s,"__DIE__"))
1215 else if (strEQ(s,"__WARN__"))
1218 Perl_croak(aTHX_ "No such hook: %s", s);
1220 SV * const to_dec = *svp;
1222 SvREFCNT_dec(to_dec);
1226 /* Are we clearing a signal entry? */
1227 const I32 i = whichsig(s);
1229 #ifdef HAS_SIGPROCMASK
1232 /* Avoid having the signal arrive at a bad time, if possible. */
1235 sigprocmask(SIG_BLOCK, &set, &save);
1237 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1238 SAVEFREESV(save_sv);
1239 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1242 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1243 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1245 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1246 PL_sig_defaulting[i] = 1;
1247 (void)rsignal(i, PL_csighandlerp);
1249 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1251 if(PL_psig_name[i]) {
1252 SvREFCNT_dec(PL_psig_name[i]);
1255 if(PL_psig_ptr[i]) {
1256 SV *to_dec=PL_psig_ptr[i];
1259 SvREFCNT_dec(to_dec);
1269 S_raise_signal(pTHX_ int sig)
1271 /* Set a flag to say this signal is pending */
1272 PL_psig_pend[sig]++;
1273 /* And one to say _a_ signal is pending */
1278 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1279 Perl_csighandler(int sig, ...)
1281 Perl_csighandler(int sig)
1284 #ifdef PERL_GET_SIG_CONTEXT
1285 dTHXa(PERL_GET_SIG_CONTEXT);
1289 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1290 (void) rsignal(sig, PL_csighandlerp);
1291 if (PL_sig_ignoring[sig]) return;
1293 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1294 if (PL_sig_defaulting[sig])
1295 #ifdef KILL_BY_SIGPRC
1296 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1301 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1302 /* Call the perl level handler now--
1303 * with risk we may be in malloc() etc. */
1304 (*PL_sighandlerp)(sig);
1306 S_raise_signal(aTHX_ sig);
1309 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1311 Perl_csighandler_init(void)
1314 if (PL_sig_handlers_initted) return;
1316 for (sig = 1; sig < SIG_SIZE; sig++) {
1317 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1319 PL_sig_defaulting[sig] = 1;
1320 (void) rsignal(sig, PL_csighandlerp);
1322 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1323 PL_sig_ignoring[sig] = 0;
1326 PL_sig_handlers_initted = 1;
1331 Perl_despatch_signals(pTHX)
1335 for (sig = 1; sig < SIG_SIZE; sig++) {
1336 if (PL_psig_pend[sig]) {
1337 PERL_BLOCKSIG_ADD(set, sig);
1338 PL_psig_pend[sig] = 0;
1339 PERL_BLOCKSIG_BLOCK(set);
1340 (*PL_sighandlerp)(sig);
1341 PERL_BLOCKSIG_UNBLOCK(set);
1347 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1352 /* Need to be careful with SvREFCNT_dec(), because that can have side
1353 * effects (due to closures). We must make sure that the new disposition
1354 * is in place before it is called.
1358 #ifdef HAS_SIGPROCMASK
1363 register const char *s = MgPV_const(mg,len);
1365 if (strEQ(s,"__DIE__"))
1367 else if (strEQ(s,"__WARN__"))
1370 Perl_croak(aTHX_ "No such hook: %s", s);
1378 i = whichsig(s); /* ...no, a brick */
1380 if (ckWARN(WARN_SIGNAL))
1381 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1384 #ifdef HAS_SIGPROCMASK
1385 /* Avoid having the signal arrive at a bad time, if possible. */
1388 sigprocmask(SIG_BLOCK, &set, &save);
1390 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1391 SAVEFREESV(save_sv);
1392 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1395 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1396 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1398 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1399 PL_sig_ignoring[i] = 0;
1401 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1402 PL_sig_defaulting[i] = 0;
1404 SvREFCNT_dec(PL_psig_name[i]);
1405 to_dec = PL_psig_ptr[i];
1406 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1407 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1408 PL_psig_name[i] = newSVpvn(s, len);
1409 SvREADONLY_on(PL_psig_name[i]);
1411 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1413 (void)rsignal(i, PL_csighandlerp);
1414 #ifdef HAS_SIGPROCMASK
1419 *svp = SvREFCNT_inc(sv);
1421 SvREFCNT_dec(to_dec);
1424 s = SvPV_force(sv,len);
1425 if (strEQ(s,"IGNORE")) {
1427 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1428 PL_sig_ignoring[i] = 1;
1429 (void)rsignal(i, PL_csighandlerp);
1431 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1435 else if (strEQ(s,"DEFAULT") || !*s) {
1437 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1439 PL_sig_defaulting[i] = 1;
1440 (void)rsignal(i, PL_csighandlerp);
1443 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1448 * We should warn if HINT_STRICT_REFS, but without
1449 * access to a known hint bit in a known OP, we can't
1450 * tell whether HINT_STRICT_REFS is in force or not.
1452 if (!strchr(s,':') && !strchr(s,'\''))
1453 sv_insert(sv, 0, 0, "main::", 6);
1455 (void)rsignal(i, PL_csighandlerp);
1457 *svp = SvREFCNT_inc(sv);
1459 #ifdef HAS_SIGPROCMASK
1464 SvREFCNT_dec(to_dec);
1467 #endif /* !PERL_MICRO */
1470 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1472 PERL_UNUSED_ARG(sv);
1473 PERL_UNUSED_ARG(mg);
1474 PL_sub_generation++;
1479 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1481 PERL_UNUSED_ARG(sv);
1482 PERL_UNUSED_ARG(mg);
1483 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1484 PL_amagic_generation++;
1490 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1492 HV * const hv = (HV*)LvTARG(sv);
1494 PERL_UNUSED_ARG(mg);
1497 (void) hv_iterinit(hv);
1498 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1501 while (hv_iternext(hv))
1506 sv_setiv(sv, (IV)i);
1511 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1513 PERL_UNUSED_ARG(mg);
1515 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1520 /* caller is responsible for stack switching/cleanup */
1522 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1528 PUSHs(SvTIED_obj(sv, mg));
1531 if (mg->mg_len >= 0)
1532 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1533 else if (mg->mg_len == HEf_SVKEY)
1534 PUSHs((SV*)mg->mg_ptr);
1536 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1537 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1545 return call_method(meth, flags);
1549 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1555 PUSHSTACKi(PERLSI_MAGIC);
1557 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1558 sv_setsv(sv, *PL_stack_sp--);
1568 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1571 mg->mg_flags |= MGf_GSKIP;
1572 magic_methpack(sv,mg,"FETCH");
1577 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1581 PUSHSTACKi(PERLSI_MAGIC);
1582 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1589 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1591 return magic_methpack(sv,mg,"DELETE");
1596 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1603 PUSHSTACKi(PERLSI_MAGIC);
1604 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1605 sv = *PL_stack_sp--;
1606 retval = (U32) SvIV(sv)-1;
1615 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1620 PUSHSTACKi(PERLSI_MAGIC);
1622 XPUSHs(SvTIED_obj(sv, mg));
1624 call_method("CLEAR", G_SCALAR|G_DISCARD);
1632 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1635 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1639 PUSHSTACKi(PERLSI_MAGIC);
1642 PUSHs(SvTIED_obj(sv, mg));
1647 if (call_method(meth, G_SCALAR))
1648 sv_setsv(key, *PL_stack_sp--);
1657 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1659 return magic_methpack(sv,mg,"EXISTS");
1663 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1666 SV *retval = &PL_sv_undef;
1667 SV * const tied = SvTIED_obj((SV*)hv, mg);
1668 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1670 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1672 if (HvEITER_get(hv))
1673 /* we are in an iteration so the hash cannot be empty */
1675 /* no xhv_eiter so now use FIRSTKEY */
1676 key = sv_newmortal();
1677 magic_nextpack((SV*)hv, mg, key);
1678 HvEITER_set(hv, NULL); /* need to reset iterator */
1679 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1682 /* there is a SCALAR method that we can call */
1684 PUSHSTACKi(PERLSI_MAGIC);
1690 if (call_method("SCALAR", G_SCALAR))
1691 retval = *PL_stack_sp--;
1698 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1700 GV * const gv = PL_DBline;
1701 const I32 i = SvTRUE(sv);
1702 SV ** const svp = av_fetch(GvAV(gv),
1703 atoi(MgPV_nolen_const(mg)), FALSE);
1704 if (svp && SvIOKp(*svp)) {
1705 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1707 /* set or clear breakpoint in the relevant control op */
1709 o->op_flags |= OPf_SPECIAL;
1711 o->op_flags &= ~OPf_SPECIAL;
1718 Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1720 const AV * const obj = (AV*)mg->mg_obj;
1722 sv_setiv(sv, AvFILL(obj) + PL_curcop->cop_arybase);
1730 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1732 AV * const obj = (AV*)mg->mg_obj;
1734 av_fill(obj, SvIV(sv) - PL_curcop->cop_arybase);
1736 if (ckWARN(WARN_MISC))
1737 Perl_warner(aTHX_ packWARN(WARN_MISC),
1738 "Attempt to set length of freed array");
1744 Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1746 PERL_UNUSED_ARG(sv);
1747 /* during global destruction, mg_obj may already have been freed */
1748 if (PL_in_clean_all)
1751 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1754 /* arylen scalar holds a pointer back to the array, but doesn't own a
1755 reference. Hence the we (the array) are about to go away with it
1756 still pointing at us. Clear its pointer, else it would be pointing
1757 at free memory. See the comment in sv_magic about reference loops,
1758 and why it can't own a reference to us. */
1765 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1767 SV* const lsv = LvTARG(sv);
1769 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1770 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1771 if (mg && mg->mg_len >= 0) {
1774 sv_pos_b2u(lsv, &i);
1775 sv_setiv(sv, i + PL_curcop->cop_arybase);
1784 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1786 SV* const lsv = LvTARG(sv);
1793 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1794 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1798 sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1799 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1801 else if (!SvOK(sv)) {
1805 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1807 pos = SvIV(sv) - PL_curcop->cop_arybase;
1810 ulen = sv_len_utf8(lsv);
1820 else if (pos > (SSize_t)len)
1825 sv_pos_u2b(lsv, &p, 0);
1830 mg->mg_flags &= ~MGf_MINMATCH;
1836 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1838 PERL_UNUSED_ARG(mg);
1839 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1841 gv_efullname3(sv,((GV*)sv), "*");
1845 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
1850 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1853 PERL_UNUSED_ARG(mg);
1857 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
1862 GvGP(sv) = gp_ref(GvGP(gv));
1867 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1870 SV * const lsv = LvTARG(sv);
1871 const char * const tmps = SvPV_const(lsv,len);
1872 I32 offs = LvTARGOFF(sv);
1873 I32 rem = LvTARGLEN(sv);
1874 PERL_UNUSED_ARG(mg);
1877 sv_pos_u2b(lsv, &offs, &rem);
1878 if (offs > (I32)len)
1880 if (rem + offs > (I32)len)
1882 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1889 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1892 const char *tmps = SvPV_const(sv, len);
1893 SV * const lsv = LvTARG(sv);
1894 I32 lvoff = LvTARGOFF(sv);
1895 I32 lvlen = LvTARGLEN(sv);
1896 PERL_UNUSED_ARG(mg);
1899 sv_utf8_upgrade(lsv);
1900 sv_pos_u2b(lsv, &lvoff, &lvlen);
1901 sv_insert(lsv, lvoff, lvlen, tmps, len);
1902 LvTARGLEN(sv) = sv_len_utf8(sv);
1905 else if (lsv && SvUTF8(lsv)) {
1906 sv_pos_u2b(lsv, &lvoff, &lvlen);
1907 LvTARGLEN(sv) = len;
1908 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1909 sv_insert(lsv, lvoff, lvlen, tmps, len);
1913 sv_insert(lsv, lvoff, lvlen, tmps, len);
1914 LvTARGLEN(sv) = len;
1922 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1924 PERL_UNUSED_ARG(sv);
1925 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
1930 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1932 PERL_UNUSED_ARG(sv);
1933 /* update taint status unless we're restoring at scope exit */
1934 if (PL_localizing != 2) {
1944 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1946 SV * const lsv = LvTARG(sv);
1947 PERL_UNUSED_ARG(mg);
1954 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1959 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1961 PERL_UNUSED_ARG(mg);
1962 do_vecset(sv); /* XXX slurp this routine */
1967 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1970 if (LvTARGLEN(sv)) {
1972 SV * const ahv = LvTARG(sv);
1973 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1978 AV* const av = (AV*)LvTARG(sv);
1979 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1980 targ = AvARRAY(av)[LvTARGOFF(sv)];
1982 if (targ && targ != &PL_sv_undef) {
1983 /* somebody else defined it for us */
1984 SvREFCNT_dec(LvTARG(sv));
1985 LvTARG(sv) = SvREFCNT_inc(targ);
1987 SvREFCNT_dec(mg->mg_obj);
1988 mg->mg_obj = Nullsv;
1989 mg->mg_flags &= ~MGf_REFCOUNTED;
1994 sv_setsv(sv, targ ? targ : &PL_sv_undef);
1999 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2001 PERL_UNUSED_ARG(mg);
2005 sv_setsv(LvTARG(sv), sv);
2006 SvSETMAGIC(LvTARG(sv));
2012 Perl_vivify_defelem(pTHX_ SV *sv)
2017 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2020 SV * const ahv = LvTARG(sv);
2021 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
2024 if (!value || value == &PL_sv_undef)
2025 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
2028 AV* const av = (AV*)LvTARG(sv);
2029 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2030 LvTARG(sv) = Nullsv; /* array can't be extended */
2032 SV** const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2033 if (!svp || (value = *svp) == &PL_sv_undef)
2034 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2037 (void)SvREFCNT_inc(value);
2038 SvREFCNT_dec(LvTARG(sv));
2041 SvREFCNT_dec(mg->mg_obj);
2042 mg->mg_obj = Nullsv;
2043 mg->mg_flags &= ~MGf_REFCOUNTED;
2047 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2049 AV *const av = (AV*)mg->mg_obj;
2050 SV **svp = AvARRAY(av);
2051 PERL_UNUSED_ARG(sv);
2053 /* Not sure why the av can get freed ahead of its sv, but somehow it does
2054 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
2055 if (svp && !SvIS_FREED(av)) {
2056 SV *const *const last = svp + AvFILLp(av);
2058 while (svp <= last) {
2060 SV *const referrer = *svp;
2061 if (SvWEAKREF(referrer)) {
2062 /* XXX Should we check that it hasn't changed? */
2063 SvRV_set(referrer, 0);
2065 SvWEAKREF_off(referrer);
2066 } else if (SvTYPE(referrer) == SVt_PVGV ||
2067 SvTYPE(referrer) == SVt_PVLV) {
2068 /* You lookin' at me? */
2069 assert(GvSTASH(referrer));
2070 assert(GvSTASH(referrer) == (HV*)sv);
2071 GvSTASH(referrer) = 0;
2074 "panic: magic_killbackrefs (flags=%"UVxf")",
2075 (UV)SvFLAGS(referrer));
2083 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
2088 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2096 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2098 PERL_UNUSED_ARG(mg);
2099 sv_unmagic(sv, PERL_MAGIC_bm);
2105 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2107 PERL_UNUSED_ARG(mg);
2108 sv_unmagic(sv, PERL_MAGIC_fm);
2114 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2116 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2118 if (uf && uf->uf_set)
2119 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2124 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2126 PERL_UNUSED_ARG(mg);
2127 sv_unmagic(sv, PERL_MAGIC_qr);
2132 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2134 regexp * const re = (regexp *)mg->mg_obj;
2135 PERL_UNUSED_ARG(sv);
2141 #ifdef USE_LOCALE_COLLATE
2143 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2146 * RenE<eacute> Descartes said "I think not."
2147 * and vanished with a faint plop.
2149 PERL_UNUSED_ARG(sv);
2151 Safefree(mg->mg_ptr);
2157 #endif /* USE_LOCALE_COLLATE */
2159 /* Just clear the UTF-8 cache data. */
2161 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2163 PERL_UNUSED_ARG(sv);
2164 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2166 mg->mg_len = -1; /* The mg_len holds the len cache. */
2171 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2173 register const char *s;
2176 switch (*mg->mg_ptr) {
2177 case '\001': /* ^A */
2178 sv_setsv(PL_bodytarget, sv);
2180 case '\003': /* ^C */
2181 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2184 case '\004': /* ^D */
2186 s = SvPV_nolen_const(sv);
2187 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2188 DEBUG_x(dump_all());
2190 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2193 case '\005': /* ^E */
2194 if (*(mg->mg_ptr+1) == '\0') {
2195 #ifdef MACOS_TRADITIONAL
2196 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2199 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2202 SetLastError( SvIV(sv) );
2205 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2207 /* will anyone ever use this? */
2208 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2214 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2216 SvREFCNT_dec(PL_encoding);
2217 if (SvOK(sv) || SvGMAGICAL(sv)) {
2218 PL_encoding = newSVsv(sv);
2221 PL_encoding = Nullsv;
2225 case '\006': /* ^F */
2226 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2228 case '\010': /* ^H */
2229 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2231 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2232 Safefree(PL_inplace);
2233 PL_inplace = SvOK(sv) ? savesvpv(sv) : Nullch;
2235 case '\017': /* ^O */
2236 if (*(mg->mg_ptr+1) == '\0') {
2237 Safefree(PL_osname);
2240 TAINT_PROPER("assigning to $^O");
2241 PL_osname = savesvpv(sv);
2244 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2245 if (!PL_compiling.cop_io)
2246 PL_compiling.cop_io = newSVsv(sv);
2248 sv_setsv(PL_compiling.cop_io,sv);
2251 case '\020': /* ^P */
2252 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2253 if (PL_perldb && !PL_DBsingle)
2256 case '\024': /* ^T */
2258 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2260 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2263 case '\027': /* ^W & $^WARNING_BITS */
2264 if (*(mg->mg_ptr+1) == '\0') {
2265 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2266 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2267 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2268 | (i ? G_WARN_ON : G_WARN_OFF) ;
2271 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2272 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2273 if (!SvPOK(sv) && PL_localizing) {
2274 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2275 PL_compiling.cop_warnings = pWARN_NONE;
2280 int accumulate = 0 ;
2281 int any_fatals = 0 ;
2282 const char * const ptr = SvPV_const(sv, len) ;
2283 for (i = 0 ; i < len ; ++i) {
2284 accumulate |= ptr[i] ;
2285 any_fatals |= (ptr[i] & 0xAA) ;
2288 PL_compiling.cop_warnings = pWARN_NONE;
2289 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2290 PL_compiling.cop_warnings = pWARN_ALL;
2291 PL_dowarn |= G_WARN_ONCE ;
2294 if (specialWARN(PL_compiling.cop_warnings))
2295 PL_compiling.cop_warnings = newSVsv(sv) ;
2297 sv_setsv(PL_compiling.cop_warnings, sv);
2298 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2299 PL_dowarn |= G_WARN_ONCE ;
2307 if (PL_localizing) {
2308 if (PL_localizing == 1)
2309 SAVESPTR(PL_last_in_gv);
2311 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2312 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2315 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2316 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2317 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2320 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2321 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2322 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2325 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2328 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2329 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2330 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2333 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2337 IO * const io = GvIOp(PL_defoutgv);
2340 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2341 IoFLAGS(io) &= ~IOf_FLUSH;
2343 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2344 PerlIO *ofp = IoOFP(io);
2346 (void)PerlIO_flush(ofp);
2347 IoFLAGS(io) |= IOf_FLUSH;
2353 SvREFCNT_dec(PL_rs);
2354 PL_rs = newSVsv(sv);
2358 SvREFCNT_dec(PL_ors_sv);
2359 if (SvOK(sv) || SvGMAGICAL(sv)) {
2360 PL_ors_sv = newSVsv(sv);
2368 SvREFCNT_dec(PL_ofs_sv);
2369 if (SvOK(sv) || SvGMAGICAL(sv)) {
2370 PL_ofs_sv = newSVsv(sv);
2377 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2380 #ifdef COMPLEX_STATUS
2381 if (PL_localizing == 2) {
2382 PL_statusvalue = LvTARGOFF(sv);
2383 PL_statusvalue_vms = LvTARGLEN(sv);
2387 #ifdef VMSISH_STATUS
2389 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2392 STATUS_UNIX_EXIT_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2397 # define PERL_VMS_BANG vaxc$errno
2399 # define PERL_VMS_BANG 0
2401 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2402 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2406 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2407 if (PL_delaymagic) {
2408 PL_delaymagic |= DM_RUID;
2409 break; /* don't do magic till later */
2412 (void)setruid((Uid_t)PL_uid);
2415 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2417 #ifdef HAS_SETRESUID
2418 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2420 if (PL_uid == PL_euid) { /* special case $< = $> */
2422 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2423 if (PL_uid != 0 && PerlProc_getuid() == 0)
2424 (void)PerlProc_setuid(0);
2426 (void)PerlProc_setuid(PL_uid);
2428 PL_uid = PerlProc_getuid();
2429 Perl_croak(aTHX_ "setruid() not implemented");
2434 PL_uid = PerlProc_getuid();
2435 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2438 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2439 if (PL_delaymagic) {
2440 PL_delaymagic |= DM_EUID;
2441 break; /* don't do magic till later */
2444 (void)seteuid((Uid_t)PL_euid);
2447 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2449 #ifdef HAS_SETRESUID
2450 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2452 if (PL_euid == PL_uid) /* special case $> = $< */
2453 PerlProc_setuid(PL_euid);
2455 PL_euid = PerlProc_geteuid();
2456 Perl_croak(aTHX_ "seteuid() not implemented");
2461 PL_euid = PerlProc_geteuid();
2462 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2465 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2466 if (PL_delaymagic) {
2467 PL_delaymagic |= DM_RGID;
2468 break; /* don't do magic till later */
2471 (void)setrgid((Gid_t)PL_gid);
2474 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2476 #ifdef HAS_SETRESGID
2477 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2479 if (PL_gid == PL_egid) /* special case $( = $) */
2480 (void)PerlProc_setgid(PL_gid);
2482 PL_gid = PerlProc_getgid();
2483 Perl_croak(aTHX_ "setrgid() not implemented");
2488 PL_gid = PerlProc_getgid();
2489 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2492 #ifdef HAS_SETGROUPS
2494 const char *p = SvPV_const(sv, len);
2495 Groups_t *gary = NULL;
2500 for (i = 0; i < NGROUPS; ++i) {
2501 while (*p && !isSPACE(*p))
2508 Newx(gary, i + 1, Groups_t);
2510 Renew(gary, i + 1, Groups_t);
2514 (void)setgroups(i, gary);
2518 #else /* HAS_SETGROUPS */
2519 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2520 #endif /* HAS_SETGROUPS */
2521 if (PL_delaymagic) {
2522 PL_delaymagic |= DM_EGID;
2523 break; /* don't do magic till later */
2526 (void)setegid((Gid_t)PL_egid);
2529 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2531 #ifdef HAS_SETRESGID
2532 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2534 if (PL_egid == PL_gid) /* special case $) = $( */
2535 (void)PerlProc_setgid(PL_egid);
2537 PL_egid = PerlProc_getegid();
2538 Perl_croak(aTHX_ "setegid() not implemented");
2543 PL_egid = PerlProc_getegid();
2544 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2547 PL_chopset = SvPV_force(sv,len);
2549 #ifndef MACOS_TRADITIONAL
2551 LOCK_DOLLARZERO_MUTEX;
2552 #ifdef HAS_SETPROCTITLE
2553 /* The BSDs don't show the argv[] in ps(1) output, they
2554 * show a string from the process struct and provide
2555 * the setproctitle() routine to manipulate that. */
2557 s = SvPV_const(sv, len);
2558 # if __FreeBSD_version > 410001
2559 /* The leading "-" removes the "perl: " prefix,
2560 * but not the "(perl) suffix from the ps(1)
2561 * output, because that's what ps(1) shows if the
2562 * argv[] is modified. */
2563 setproctitle("-%s", s);
2564 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2565 /* This doesn't really work if you assume that
2566 * $0 = 'foobar'; will wipe out 'perl' from the $0
2567 * because in ps(1) output the result will be like
2568 * sprintf("perl: %s (perl)", s)
2569 * I guess this is a security feature:
2570 * one (a user process) cannot get rid of the original name.
2572 setproctitle("%s", s);
2576 #if defined(__hpux) && defined(PSTAT_SETCMD)
2579 s = SvPV_const(sv, len);
2580 un.pst_command = (char *)s;
2581 pstat(PSTAT_SETCMD, un, len, 0, 0);
2584 /* PL_origalen is set in perl_parse(). */
2585 s = SvPV_force(sv,len);
2586 if (len >= (STRLEN)PL_origalen-1) {
2587 /* Longer than original, will be truncated. We assume that
2588 * PL_origalen bytes are available. */
2589 Copy(s, PL_origargv[0], PL_origalen-1, char);
2592 /* Shorter than original, will be padded. */
2593 Copy(s, PL_origargv[0], len, char);
2594 PL_origargv[0][len] = 0;
2595 memset(PL_origargv[0] + len + 1,
2596 /* Is the space counterintuitive? Yes.
2597 * (You were expecting \0?)
2598 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2601 PL_origalen - len - 1);
2603 PL_origargv[0][PL_origalen-1] = 0;
2604 for (i = 1; i < PL_origargc; i++)
2606 UNLOCK_DOLLARZERO_MUTEX;
2614 Perl_whichsig(pTHX_ const char *sig)
2616 register char* const* sigv;
2618 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
2619 if (strEQ(sig,*sigv))
2620 return PL_sig_num[sigv - (char* const*)PL_sig_name];
2622 if (strEQ(sig,"CHLD"))
2626 if (strEQ(sig,"CLD"))
2633 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2634 Perl_sighandler(int sig, ...)
2636 Perl_sighandler(int sig)
2639 #ifdef PERL_GET_SIG_CONTEXT
2640 dTHXa(PERL_GET_SIG_CONTEXT);
2647 SV * const tSv = PL_Sv;
2651 XPV * const tXpv = PL_Xpv;
2653 if (PL_savestack_ix + 15 <= PL_savestack_max)
2655 if (PL_markstack_ptr < PL_markstack_max - 2)
2657 if (PL_scopestack_ix < PL_scopestack_max - 3)
2660 if (!PL_psig_ptr[sig]) {
2661 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2666 /* Max number of items pushed there is 3*n or 4. We cannot fix
2667 infinity, so we fix 4 (in fact 5): */
2669 PL_savestack_ix += 5; /* Protect save in progress. */
2670 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2673 PL_markstack_ptr++; /* Protect mark. */
2675 PL_scopestack_ix += 1;
2676 /* sv_2cv is too complicated, try a simpler variant first: */
2677 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2678 || SvTYPE(cv) != SVt_PVCV) {
2680 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2683 if (!cv || !CvROOT(cv)) {
2684 if (ckWARN(WARN_SIGNAL))
2685 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2686 PL_sig_name[sig], (gv ? GvENAME(gv)
2693 if(PL_psig_name[sig]) {
2694 sv = SvREFCNT_inc(PL_psig_name[sig]);
2696 #if !defined(PERL_IMPLICIT_CONTEXT)
2700 sv = sv_newmortal();
2701 sv_setpv(sv,PL_sig_name[sig]);
2704 PUSHSTACKi(PERLSI_SIGNAL);
2707 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2709 struct sigaction oact;
2711 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2715 va_start(args, sig);
2716 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2719 SV *rv = newRV_noinc((SV*)sih);
2720 /* The siginfo fields signo, code, errno, pid, uid,
2721 * addr, status, and band are defined by POSIX/SUSv3. */
2722 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2723 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
2724 #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. */
2725 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
2726 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
2727 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2728 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2729 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
2730 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
2734 PUSHs(newSVpv((void*)sip, sizeof(*sip)));
2743 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2746 if (SvTRUE(ERRSV)) {
2748 #ifdef HAS_SIGPROCMASK
2749 /* Handler "died", for example to get out of a restart-able read().
2750 * Before we re-do that on its behalf re-enable the signal which was
2751 * blocked by the system when we entered.
2755 sigaddset(&set,sig);
2756 sigprocmask(SIG_UNBLOCK, &set, NULL);
2758 /* Not clear if this will work */
2759 (void)rsignal(sig, SIG_IGN);
2760 (void)rsignal(sig, PL_csighandlerp);
2762 #endif /* !PERL_MICRO */
2763 Perl_die(aTHX_ Nullch);
2767 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2771 PL_scopestack_ix -= 1;
2774 PL_op = myop; /* Apparently not needed... */
2776 PL_Sv = tSv; /* Restore global temporaries. */
2783 S_restore_magic(pTHX_ const void *p)
2785 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2786 SV* const sv = mgs->mgs_sv;
2791 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2793 #ifdef PERL_OLD_COPY_ON_WRITE
2794 /* While magic was saved (and off) sv_setsv may well have seen
2795 this SV as a prime candidate for COW. */
2797 sv_force_normal_flags(sv, 0);
2801 SvFLAGS(sv) |= mgs->mgs_flags;
2804 if (SvGMAGICAL(sv)) {
2805 /* downgrade public flags to private,
2806 and discard any other private flags */
2808 U32 public = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2810 SvFLAGS(sv) &= ~( public | SVp_IOK|SVp_NOK|SVp_POK );
2811 SvFLAGS(sv) |= ( public << PRIVSHIFT );
2816 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2818 /* If we're still on top of the stack, pop us off. (That condition
2819 * will be satisfied if restore_magic was called explicitly, but *not*
2820 * if it's being called via leave_scope.)
2821 * The reason for doing this is that otherwise, things like sv_2cv()
2822 * may leave alloc gunk on the savestack, and some code
2823 * (e.g. sighandler) doesn't expect that...
2825 if (PL_savestack_ix == mgs->mgs_ss_ix)
2827 I32 popval = SSPOPINT;
2828 assert(popval == SAVEt_DESTRUCTOR_X);
2829 PL_savestack_ix -= 2;
2831 assert(popval == SAVEt_ALLOC);
2833 PL_savestack_ix -= popval;
2839 S_unwind_handler_stack(pTHX_ const void *p)
2842 const U32 flags = *(const U32*)p;
2845 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2846 /* cxstack_ix-- Not needed, die already unwound it. */
2847 #if !defined(PERL_IMPLICIT_CONTEXT)
2849 SvREFCNT_dec(PL_sig_sv);
2855 * c-indentation-style: bsd
2857 * indent-tabs-mode: t
2860 * ex: set ts=8 sts=4 sw=4 noet: