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)
52 # include <sys/pstat.h>
55 Signal_t Perl_csighandler(int sig);
57 /* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
58 #if !defined(HAS_SIGACTION) && defined(VMS)
59 # define FAKE_PERSISTENT_SIGNAL_HANDLERS
61 /* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
62 #if defined(KILL_BY_SIGPRC)
63 # define FAKE_DEFAULT_SIGNAL_HANDLERS
66 static void restore_magic(pTHX_ const void *p);
67 static void unwind_handler_stack(pTHX_ const void *p);
70 /* Missing protos on LynxOS */
71 void setruid(uid_t id);
72 void seteuid(uid_t id);
73 void setrgid(uid_t id);
74 void setegid(uid_t id);
78 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
86 /* MGS is typedef'ed to struct magic_state in perl.h */
89 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
92 assert(SvMAGICAL(sv));
94 SAVEDESTRUCTOR_X(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(aTHX_ 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(aTHX_ 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(aTHX_ INT2PTR(void*, (IV)mgs_ix));
270 U8 *s = (U8*)SvPV(sv, len);
271 len = Perl_utf8_length(aTHX_ s, s + 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(aTHX_ 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(aTHX_ INT2PTR(void*, (IV)mgs_ix));
339 Finds the magic pointer for type matching the SV. See C<sv_magic>.
345 Perl_mg_find(pTHX_ 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);
375 else if (isUPPER(mg->mg_type)) {
377 mg->mg_type == PERL_MAGIC_tied ? SvTIED_obj(sv, mg) :
378 (mg->mg_type == PERL_MAGIC_regdata && mg->mg_obj)
380 toLOWER(mg->mg_type), key, klen);
390 Free any magic storage used by the SV. See C<sv_magic>.
396 Perl_mg_free(pTHX_ SV *sv)
400 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
401 const MGVTBL* const vtbl = mg->mg_virtual;
402 moremagic = mg->mg_moremagic;
403 if (vtbl && vtbl->svt_free)
404 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
405 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
406 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
407 Safefree(mg->mg_ptr);
408 else if (mg->mg_len == HEf_SVKEY)
409 SvREFCNT_dec((SV*)mg->mg_ptr);
411 if (mg->mg_flags & MGf_REFCOUNTED)
412 SvREFCNT_dec(mg->mg_obj);
415 SvMAGIC_set(sv, NULL);
422 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
424 register const REGEXP *rx;
427 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
428 if (mg->mg_obj) /* @+ */
431 return rx->lastparen;
438 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
442 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
443 register const I32 paren = mg->mg_len;
448 if (paren <= (I32)rx->nparens &&
449 (s = rx->startp[paren]) != -1 &&
450 (t = rx->endp[paren]) != -1)
453 if (mg->mg_obj) /* @+ */
458 if (i > 0 && RX_MATCH_UTF8(rx)) {
459 char *b = rx->subbeg;
461 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
471 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
474 Perl_croak(aTHX_ PL_no_modify);
477 /* No __attribute__, so the compiler doesn't know that croak never returns
484 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
488 register const REGEXP *rx;
491 switch (*mg->mg_ptr) {
492 case '1': case '2': case '3': case '4':
493 case '5': case '6': case '7': case '8': case '9': case '&':
494 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
496 paren = atoi(mg->mg_ptr); /* $& is in [0] */
498 if (paren <= (I32)rx->nparens &&
499 (s1 = rx->startp[paren]) != -1 &&
500 (t1 = rx->endp[paren]) != -1)
504 if (i > 0 && RX_MATCH_UTF8(rx)) {
505 char *s = rx->subbeg + s1;
506 char *send = rx->subbeg + t1;
509 if (is_utf8_string((U8*)s, i))
510 i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send);
513 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
517 if (ckWARN(WARN_UNINITIALIZED))
522 if (ckWARN(WARN_UNINITIALIZED))
527 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
528 paren = rx->lastparen;
533 case '\016': /* ^N */
534 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
535 paren = rx->lastcloseparen;
541 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
542 if (rx->startp[0] != -1) {
553 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
554 if (rx->endp[0] != -1) {
555 i = rx->sublen - rx->endp[0];
566 if (!SvPOK(sv) && SvNIOK(sv)) {
576 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
579 register char *s = NULL;
583 switch (*mg->mg_ptr) {
584 case '\001': /* ^A */
585 sv_setsv(sv, PL_bodytarget);
587 case '\003': /* ^C */
588 sv_setiv(sv, (IV)PL_minus_c);
591 case '\004': /* ^D */
592 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
593 #if defined(YYDEBUG) && defined(DEBUGGING)
594 PL_yydebug = DEBUG_p_TEST;
597 case '\005': /* ^E */
598 if (*(mg->mg_ptr+1) == '\0') {
599 #ifdef MACOS_TRADITIONAL
603 sv_setnv(sv,(double)gMacPerl_OSErr);
604 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
609 # include <descrip.h>
610 # include <starlet.h>
612 $DESCRIPTOR(msgdsc,msg);
613 sv_setnv(sv,(NV) vaxc$errno);
614 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
615 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
621 if (!(_emx_env & 0x200)) { /* Under DOS */
622 sv_setnv(sv, (NV)errno);
623 sv_setpv(sv, errno ? Strerror(errno) : "");
625 if (errno != errno_isOS2) {
626 int tmp = _syserrno();
627 if (tmp) /* 2nd call to _syserrno() makes it 0 */
630 sv_setnv(sv, (NV)Perl_rc);
631 sv_setpv(sv, os2error(Perl_rc));
636 DWORD dwErr = GetLastError();
637 sv_setnv(sv, (NV)dwErr);
640 PerlProc_GetOSError(sv, dwErr);
643 sv_setpvn(sv, "", 0);
648 int saveerrno = errno;
649 sv_setnv(sv, (NV)errno);
650 sv_setpv(sv, errno ? Strerror(errno) : "");
657 SvNOK_on(sv); /* what a wonderful hack! */
659 else if (strEQ(mg->mg_ptr+1, "NCODING"))
660 sv_setsv(sv, PL_encoding);
662 case '\006': /* ^F */
663 sv_setiv(sv, (IV)PL_maxsysfd);
665 case '\010': /* ^H */
666 sv_setiv(sv, (IV)PL_hints);
668 case '\011': /* ^I */ /* NOT \t in EBCDIC */
670 sv_setpv(sv, PL_inplace);
672 sv_setsv(sv, &PL_sv_undef);
674 case '\017': /* ^O & ^OPEN */
675 if (*(mg->mg_ptr+1) == '\0') {
676 sv_setpv(sv, PL_osname);
679 else if (strEQ(mg->mg_ptr, "\017PEN")) {
680 if (!PL_compiling.cop_io)
681 sv_setsv(sv, &PL_sv_undef);
683 sv_setsv(sv, PL_compiling.cop_io);
687 case '\020': /* ^P */
688 sv_setiv(sv, (IV)PL_perldb);
690 case '\023': /* ^S */
691 if (*(mg->mg_ptr+1) == '\0') {
692 if (PL_lex_state != LEX_NOTPARSING)
695 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
700 case '\024': /* ^T */
701 if (*(mg->mg_ptr+1) == '\0') {
703 sv_setnv(sv, PL_basetime);
705 sv_setiv(sv, (IV)PL_basetime);
708 else if (strEQ(mg->mg_ptr, "\024AINT"))
709 sv_setiv(sv, PL_tainting
710 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
713 case '\025': /* $^UNICODE, $^UTF8LOCALE */
714 if (strEQ(mg->mg_ptr, "\025NICODE"))
715 sv_setuv(sv, (UV) PL_unicode);
716 else if (strEQ(mg->mg_ptr, "\025TF8LOCALE"))
717 sv_setuv(sv, (UV) PL_utf8locale);
719 case '\027': /* ^W & $^WARNING_BITS */
720 if (*(mg->mg_ptr+1) == '\0')
721 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
722 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
723 if (PL_compiling.cop_warnings == pWARN_NONE ||
724 PL_compiling.cop_warnings == pWARN_STD)
726 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
728 else if (PL_compiling.cop_warnings == pWARN_ALL) {
729 /* Get the bit mask for $warnings::Bits{all}, because
730 * it could have been extended by warnings::register */
732 HV *bits=get_hv("warnings::Bits", FALSE);
733 if (bits && (bits_all=hv_fetch(bits, "all", 3, FALSE))) {
734 sv_setsv(sv, *bits_all);
737 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
741 sv_setsv(sv, PL_compiling.cop_warnings);
746 case '1': case '2': case '3': case '4':
747 case '5': case '6': case '7': case '8': case '9': case '&':
748 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
752 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
753 * XXX Does the new way break anything?
755 paren = atoi(mg->mg_ptr); /* $& is in [0] */
757 if (paren <= (I32)rx->nparens &&
758 (s1 = rx->startp[paren]) != -1 &&
759 (t1 = rx->endp[paren]) != -1)
769 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
774 if (RX_MATCH_TAINTED(rx)) {
775 MAGIC* mg = SvMAGIC(sv);
778 SvMAGIC_set(sv, mg->mg_moremagic);
780 if ((mgt = SvMAGIC(sv))) {
781 mg->mg_moremagic = mgt;
791 sv_setsv(sv,&PL_sv_undef);
794 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
795 paren = rx->lastparen;
799 sv_setsv(sv,&PL_sv_undef);
801 case '\016': /* ^N */
802 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
803 paren = rx->lastcloseparen;
807 sv_setsv(sv,&PL_sv_undef);
810 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
811 if ((s = rx->subbeg) && rx->startp[0] != -1) {
816 sv_setsv(sv,&PL_sv_undef);
819 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
820 if (rx->subbeg && rx->endp[0] != -1) {
821 s = rx->subbeg + rx->endp[0];
822 i = rx->sublen - rx->endp[0];
826 sv_setsv(sv,&PL_sv_undef);
830 if (GvIO(PL_last_in_gv)) {
831 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
837 sv_setiv(sv, (IV)STATUS_CURRENT);
838 #ifdef COMPLEX_STATUS
839 LvTARGOFF(sv) = PL_statusvalue;
840 LvTARGLEN(sv) = PL_statusvalue_vms;
845 if (GvIOp(PL_defoutgv))
846 s = IoTOP_NAME(GvIOp(PL_defoutgv));
850 sv_setpv(sv,GvENAME(PL_defoutgv));
855 if (GvIOp(PL_defoutgv))
856 s = IoFMT_NAME(GvIOp(PL_defoutgv));
858 s = GvENAME(PL_defoutgv);
863 if (GvIOp(PL_defoutgv))
864 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
867 if (GvIOp(PL_defoutgv))
868 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
871 if (GvIOp(PL_defoutgv))
872 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
880 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
883 if (GvIOp(PL_defoutgv))
884 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
890 sv_copypv(sv, PL_ors_sv);
893 sv_setpv(sv,PL_ofmt);
897 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
898 sv_setpv(sv, errno ? Strerror(errno) : "");
901 int saveerrno = errno;
902 sv_setnv(sv, (NV)errno);
904 if (errno == errno_isOS2 || errno == errno_isOS2_set)
905 sv_setpv(sv, os2error(Perl_rc));
908 sv_setpv(sv, errno ? Strerror(errno) : "");
912 SvNOK_on(sv); /* what a wonderful hack! */
915 sv_setiv(sv, (IV)PL_uid);
918 sv_setiv(sv, (IV)PL_euid);
921 sv_setiv(sv, (IV)PL_gid);
923 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_gid);
927 sv_setiv(sv, (IV)PL_egid);
929 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_egid);
934 Groups_t gary[NGROUPS];
935 i = getgroups(NGROUPS,gary);
937 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, gary[i]);
940 (void)SvIOK_on(sv); /* what a wonderful hack! */
944 #ifndef MACOS_TRADITIONAL
948 #ifdef USE_5005THREADS
950 sv_setsv(sv, thr->errsv);
952 #endif /* USE_5005THREADS */
958 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
960 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
962 if (uf && uf->uf_val)
963 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
968 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
978 #ifdef DYNAMIC_ENV_FETCH
979 /* We just undefd an environment var. Is a replacement */
980 /* waiting in the wings? */
983 if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
984 s = SvPV(*valp, len);
988 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
989 /* And you'll never guess what the dog had */
990 /* in its mouth... */
992 MgTAINTEDDIR_off(mg);
994 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
995 char pathbuf[256], eltbuf[256], *cp, *elt = s;
999 do { /* DCL$PATH may be a search list */
1000 while (1) { /* as may dev portion of any element */
1001 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1002 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1003 cando_by_name(S_IWUSR,0,elt) ) {
1004 MgTAINTEDDIR_on(mg);
1008 if ((cp = strchr(elt, ':')) != Nullch)
1010 if (my_trnlnm(elt, eltbuf, j++))
1016 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1019 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1020 char *strend = s + len;
1022 while (s < strend) {
1026 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1027 s, strend, ':', &i);
1029 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1031 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1032 MgTAINTEDDIR_on(mg);
1038 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1044 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1048 my_setenv(MgPV(mg,n_a),Nullch);
1053 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1056 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1058 if (PL_localizing) {
1061 magic_clear_all_env(sv,mg);
1062 hv_iterinit((HV*)sv);
1063 while ((entry = hv_iternext((HV*)sv))) {
1065 my_setenv(hv_iterkey(entry, &keylen),
1066 SvPV(hv_iterval((HV*)sv, entry), n_a));
1074 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1077 #if defined(VMS) || defined(EPOC)
1078 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1080 # if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
1083 # ifdef USE_ENVIRON_ARRAY
1084 # if defined(USE_ITHREADS)
1085 /* only the parent thread can clobber the process environment */
1086 if (PL_curinterp == aTHX)
1089 # ifndef PERL_USE_SAFE_PUTENV
1090 if (!PL_use_safe_putenv) {
1093 if (environ == PL_origenviron)
1094 environ = (char**)safesysmalloc(sizeof(char*));
1096 for (i = 0; environ[i]; i++)
1097 safesysfree(environ[i]);
1099 # endif /* PERL_USE_SAFE_PUTENV */
1101 environ[0] = Nullch;
1103 # endif /* USE_ENVIRON_ARRAY */
1104 # endif /* PERL_IMPLICIT_SYS || WIN32 */
1105 #endif /* VMS || EPOC */
1106 #endif /* !PERL_MICRO */
1112 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1113 static int sig_handlers_initted = 0;
1115 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1116 static int sig_ignoring[SIG_SIZE]; /* which signals we are ignoring */
1118 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1119 static int sig_defaulting[SIG_SIZE];
1123 #ifdef HAS_SIGPROCMASK
1125 restore_sigmask(pTHX_ SV *save_sv)
1127 sigset_t *ossetp = (sigset_t *) SvPV_nolen( save_sv );
1128 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1132 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1136 /* Are we fetching a signal entry? */
1137 i = whichsig(MgPV(mg,n_a));
1140 sv_setsv(sv,PL_psig_ptr[i]);
1142 Sighandler_t sigstate;
1143 sigstate = rsignal_state(i);
1144 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1145 if (sig_handlers_initted && sig_ignoring[i]) sigstate = SIG_IGN;
1147 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1148 if (sig_handlers_initted && sig_defaulting[i]) sigstate = SIG_DFL;
1150 /* cache state so we don't fetch it again */
1151 if(sigstate == SIG_IGN)
1152 sv_setpv(sv,"IGNORE");
1154 sv_setsv(sv,&PL_sv_undef);
1155 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1162 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1164 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1165 * refactoring might be in order.
1168 register char *s = MgPV(mg,n_a);
1172 if (strEQ(s,"__DIE__"))
1174 else if (strEQ(s,"__WARN__"))
1177 Perl_croak(aTHX_ "No such hook: %s", s);
1181 SvREFCNT_dec(to_dec);
1186 /* Are we clearing a signal entry? */
1189 #ifdef HAS_SIGPROCMASK
1192 /* Avoid having the signal arrive at a bad time, if possible. */
1195 sigprocmask(SIG_BLOCK, &set, &save);
1197 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1198 SAVEFREESV(save_sv);
1199 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1202 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1203 if (!sig_handlers_initted) Perl_csighandler_init();
1205 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1206 sig_defaulting[i] = 1;
1207 (void)rsignal(i, PL_csighandlerp);
1209 (void)rsignal(i, SIG_DFL);
1211 if(PL_psig_name[i]) {
1212 SvREFCNT_dec(PL_psig_name[i]);
1215 if(PL_psig_ptr[i]) {
1216 SV *to_dec=PL_psig_ptr[i];
1219 SvREFCNT_dec(to_dec);
1229 S_raise_signal(pTHX_ int sig)
1231 /* Set a flag to say this signal is pending */
1232 PL_psig_pend[sig]++;
1233 /* And one to say _a_ signal is pending */
1238 Perl_csighandler(int sig)
1240 #ifdef PERL_GET_SIG_CONTEXT
1241 dTHXa(PERL_GET_SIG_CONTEXT);
1245 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1246 (void) rsignal(sig, PL_csighandlerp);
1247 if (sig_ignoring[sig]) return;
1249 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1250 if (sig_defaulting[sig])
1251 #ifdef KILL_BY_SIGPRC
1252 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1257 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1258 /* Call the perl level handler now--
1259 * with risk we may be in malloc() etc. */
1260 (*PL_sighandlerp)(sig);
1262 S_raise_signal(aTHX_ sig);
1265 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1267 Perl_csighandler_init(void)
1270 if (sig_handlers_initted) return;
1272 for (sig = 1; sig < SIG_SIZE; sig++) {
1273 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1275 sig_defaulting[sig] = 1;
1276 (void) rsignal(sig, PL_csighandlerp);
1278 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1279 sig_ignoring[sig] = 0;
1282 sig_handlers_initted = 1;
1287 Perl_despatch_signals(pTHX)
1291 for (sig = 1; sig < SIG_SIZE; sig++) {
1292 if (PL_psig_pend[sig]) {
1293 PERL_BLOCKSIG_ADD(set, sig);
1294 PL_psig_pend[sig] = 0;
1295 PERL_BLOCKSIG_BLOCK(set);
1296 (*PL_sighandlerp)(sig);
1297 PERL_BLOCKSIG_UNBLOCK(set);
1303 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1307 /* Need to be careful with SvREFCNT_dec(), because that can have side
1308 * effects (due to closures). We must make sure that the new disposition
1309 * is in place before it is called.
1313 #ifdef HAS_SIGPROCMASK
1318 register char *s = MgPV(mg,len);
1320 if (strEQ(s,"__DIE__"))
1322 else if (strEQ(s,"__WARN__"))
1325 Perl_croak(aTHX_ "No such hook: %s", s);
1333 i = whichsig(s); /* ...no, a brick */
1335 if (ckWARN(WARN_SIGNAL))
1336 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1339 #ifdef HAS_SIGPROCMASK
1340 /* Avoid having the signal arrive at a bad time, if possible. */
1343 sigprocmask(SIG_BLOCK, &set, &save);
1345 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1346 SAVEFREESV(save_sv);
1347 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1350 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1351 if (!sig_handlers_initted) Perl_csighandler_init();
1353 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1354 sig_ignoring[i] = 0;
1356 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1357 sig_defaulting[i] = 0;
1359 SvREFCNT_dec(PL_psig_name[i]);
1360 to_dec = PL_psig_ptr[i];
1361 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1362 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1363 PL_psig_name[i] = newSVpvn(s, len);
1364 SvREADONLY_on(PL_psig_name[i]);
1366 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1368 (void)rsignal(i, PL_csighandlerp);
1369 #ifdef HAS_SIGPROCMASK
1374 *svp = SvREFCNT_inc(sv);
1376 SvREFCNT_dec(to_dec);
1379 s = SvPV_force(sv,len);
1380 if (strEQ(s,"IGNORE")) {
1382 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1383 sig_ignoring[i] = 1;
1384 (void)rsignal(i, PL_csighandlerp);
1386 (void)rsignal(i, SIG_IGN);
1390 else if (strEQ(s,"DEFAULT") || !*s) {
1392 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1394 sig_defaulting[i] = 1;
1395 (void)rsignal(i, PL_csighandlerp);
1398 (void)rsignal(i, SIG_DFL);
1403 * We should warn if HINT_STRICT_REFS, but without
1404 * access to a known hint bit in a known OP, we can't
1405 * tell whether HINT_STRICT_REFS is in force or not.
1407 if (!strchr(s,':') && !strchr(s,'\''))
1408 sv_insert(sv, 0, 0, "main::", 6);
1410 (void)rsignal(i, PL_csighandlerp);
1412 *svp = SvREFCNT_inc(sv);
1414 #ifdef HAS_SIGPROCMASK
1419 SvREFCNT_dec(to_dec);
1422 #endif /* !PERL_MICRO */
1425 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1429 PL_sub_generation++;
1434 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1438 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1439 PL_amagic_generation++;
1445 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1447 HV * const hv = (HV*)LvTARG(sv);
1452 (void) hv_iterinit(hv);
1453 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1456 while (hv_iternext(hv))
1461 sv_setiv(sv, (IV)i);
1466 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1470 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1475 /* caller is responsible for stack switching/cleanup */
1477 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1483 PUSHs(SvTIED_obj(sv, mg));
1486 if (mg->mg_len >= 0)
1487 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1488 else if (mg->mg_len == HEf_SVKEY)
1489 PUSHs((SV*)mg->mg_ptr);
1491 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1492 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1500 return call_method(meth, flags);
1504 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1510 PUSHSTACKi(PERLSI_MAGIC);
1512 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1513 sv_setsv(sv, *PL_stack_sp--);
1523 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1526 mg->mg_flags |= MGf_GSKIP;
1527 magic_methpack(sv,mg,"FETCH");
1532 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1536 PUSHSTACKi(PERLSI_MAGIC);
1537 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1544 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1546 return magic_methpack(sv,mg,"DELETE");
1551 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1558 PUSHSTACKi(PERLSI_MAGIC);
1559 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1560 sv = *PL_stack_sp--;
1561 retval = (U32) SvIV(sv)-1;
1570 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1575 PUSHSTACKi(PERLSI_MAGIC);
1577 XPUSHs(SvTIED_obj(sv, mg));
1579 call_method("CLEAR", G_SCALAR|G_DISCARD);
1587 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1590 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1594 PUSHSTACKi(PERLSI_MAGIC);
1597 PUSHs(SvTIED_obj(sv, mg));
1602 if (call_method(meth, G_SCALAR))
1603 sv_setsv(key, *PL_stack_sp--);
1612 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1614 return magic_methpack(sv,mg,"EXISTS");
1618 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1621 SV *retval = &PL_sv_undef;
1622 SV *tied = SvTIED_obj((SV*)hv, mg);
1623 HV *pkg = SvSTASH((SV*)SvRV(tied));
1625 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1628 /* we are in an iteration so the hash cannot be empty */
1630 /* no xhv_eiter so now use FIRSTKEY */
1631 key = sv_newmortal();
1632 magic_nextpack((SV*)hv, mg, key);
1633 HvEITER(hv) = NULL; /* need to reset iterator */
1634 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1637 /* there is a SCALAR method that we can call */
1639 PUSHSTACKi(PERLSI_MAGIC);
1645 if (call_method("SCALAR", G_SCALAR))
1646 retval = *PL_stack_sp--;
1653 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1663 svp = av_fetch(GvAV(gv),
1664 atoi(MgPV(mg,n_a)), FALSE);
1665 if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp)))) {
1666 /* set or clear breakpoint in the relevant control op */
1668 o->op_flags |= OPf_SPECIAL;
1670 o->op_flags &= ~OPf_SPECIAL;
1676 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1678 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
1683 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1685 av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
1690 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1692 SV* lsv = LvTARG(sv);
1694 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1695 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1696 if (mg && mg->mg_len >= 0) {
1699 sv_pos_b2u(lsv, &i);
1700 sv_setiv(sv, i + PL_curcop->cop_arybase);
1709 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1711 SV* lsv = LvTARG(sv);
1718 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1719 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1723 sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1724 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1726 else if (!SvOK(sv)) {
1730 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1732 pos = SvIV(sv) - PL_curcop->cop_arybase;
1735 ulen = sv_len_utf8(lsv);
1745 else if (pos > (SSize_t)len)
1750 sv_pos_u2b(lsv, &p, 0);
1755 mg->mg_flags &= ~MGf_MINMATCH;
1761 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1764 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1766 gv_efullname3(sv,((GV*)sv), "*");
1770 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
1775 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1785 if (*s == '*' && s[1])
1787 gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1792 GvGP(sv) = gp_ref(GvGP(gv));
1797 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1800 SV * const lsv = LvTARG(sv);
1801 const char * const tmps = SvPV(lsv,len);
1802 I32 offs = LvTARGOFF(sv);
1803 I32 rem = LvTARGLEN(sv);
1807 sv_pos_u2b(lsv, &offs, &rem);
1808 if (offs > (I32)len)
1810 if (rem + offs > (I32)len)
1812 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1819 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1822 char *tmps = SvPV(sv, len);
1823 SV * const lsv = LvTARG(sv);
1824 I32 lvoff = LvTARGOFF(sv);
1825 I32 lvlen = LvTARGLEN(sv);
1829 sv_utf8_upgrade(lsv);
1830 sv_pos_u2b(lsv, &lvoff, &lvlen);
1831 sv_insert(lsv, lvoff, lvlen, tmps, len);
1834 else if (lsv && SvUTF8(lsv)) {
1835 sv_pos_u2b(lsv, &lvoff, &lvlen);
1836 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1837 sv_insert(lsv, lvoff, lvlen, tmps, len);
1841 sv_insert(lsv, lvoff, lvlen, tmps, len);
1847 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1849 TAINT_IF((mg->mg_len & 1) ||
1850 ((mg->mg_len & 2) && mg->mg_obj == sv)); /* kludge */
1855 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1858 if (PL_localizing) {
1859 if (PL_localizing == 1)
1864 else if (PL_tainted)
1872 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1874 SV * const lsv = LvTARG(sv);
1882 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1887 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1890 do_vecset(sv); /* XXX slurp this routine */
1895 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1898 if (LvTARGLEN(sv)) {
1900 SV *ahv = LvTARG(sv);
1901 if (SvTYPE(ahv) == SVt_PVHV) {
1902 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1907 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, FALSE, 0);
1913 AV* av = (AV*)LvTARG(sv);
1914 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1915 targ = AvARRAY(av)[LvTARGOFF(sv)];
1917 if (targ && targ != &PL_sv_undef) {
1918 /* somebody else defined it for us */
1919 SvREFCNT_dec(LvTARG(sv));
1920 LvTARG(sv) = SvREFCNT_inc(targ);
1922 SvREFCNT_dec(mg->mg_obj);
1923 mg->mg_obj = Nullsv;
1924 mg->mg_flags &= ~MGf_REFCOUNTED;
1929 sv_setsv(sv, targ ? targ : &PL_sv_undef);
1934 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1940 sv_setsv(LvTARG(sv), sv);
1941 SvSETMAGIC(LvTARG(sv));
1947 Perl_vivify_defelem(pTHX_ SV *sv)
1952 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1955 SV *ahv = LvTARG(sv);
1957 if (SvTYPE(ahv) == SVt_PVHV) {
1958 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1963 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, TRUE, 0);
1967 if (!value || value == &PL_sv_undef)
1968 Perl_croak(aTHX_ PL_no_helem, SvPV(mg->mg_obj, n_a));
1971 AV* av = (AV*)LvTARG(sv);
1972 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1973 LvTARG(sv) = Nullsv; /* array can't be extended */
1975 SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1976 if (!svp || (value = *svp) == &PL_sv_undef)
1977 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
1980 (void)SvREFCNT_inc(value);
1981 SvREFCNT_dec(LvTARG(sv));
1984 SvREFCNT_dec(mg->mg_obj);
1985 mg->mg_obj = Nullsv;
1986 mg->mg_flags &= ~MGf_REFCOUNTED;
1990 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
1992 AV *av = (AV*)mg->mg_obj;
1993 SV **svp = AvARRAY(av);
1994 I32 i = AvFILLp(av);
1999 if (!SvWEAKREF(svp[i]))
2000 Perl_croak(aTHX_ "panic: magic_killbackrefs");
2001 /* XXX Should we check that it hasn't changed? */
2002 SvRV_set(svp[i], 0);
2004 SvWEAKREF_off(svp[i]);
2009 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
2014 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2022 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2025 sv_unmagic(sv, PERL_MAGIC_bm);
2031 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2034 sv_unmagic(sv, PERL_MAGIC_fm);
2040 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2042 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2044 if (uf && uf->uf_set)
2045 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2050 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2053 sv_unmagic(sv, PERL_MAGIC_qr);
2058 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2060 regexp *re = (regexp *)mg->mg_obj;
2066 #ifdef USE_LOCALE_COLLATE
2068 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2071 * RenE<eacute> Descartes said "I think not."
2072 * and vanished with a faint plop.
2076 Safefree(mg->mg_ptr);
2082 #endif /* USE_LOCALE_COLLATE */
2084 /* Just clear the UTF-8 cache data. */
2086 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2089 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2091 mg->mg_len = -1; /* The mg_len holds the len cache. */
2096 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2098 register const char *s;
2101 switch (*mg->mg_ptr) {
2102 case '\001': /* ^A */
2103 sv_setsv(PL_bodytarget, sv);
2105 case '\003': /* ^C */
2106 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2109 case '\004': /* ^D */
2112 PL_debug = get_debug_opts_flags(&s, 0) | DEBUG_TOP_FLAG;
2113 DEBUG_x(dump_all());
2115 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2118 case '\005': /* ^E */
2119 if (*(mg->mg_ptr+1) == '\0') {
2120 #ifdef MACOS_TRADITIONAL
2121 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2124 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2127 SetLastError( SvIV(sv) );
2130 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2132 /* will anyone ever use this? */
2133 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2139 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2141 SvREFCNT_dec(PL_encoding);
2142 if (SvOK(sv) || SvGMAGICAL(sv)) {
2143 PL_encoding = newSVsv(sv);
2146 PL_encoding = Nullsv;
2150 case '\006': /* ^F */
2151 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2153 case '\010': /* ^H */
2154 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2156 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2158 Safefree(PL_inplace);
2160 PL_inplace = savesvpv(sv);
2162 PL_inplace = Nullch;
2164 case '\017': /* ^O */
2165 if (*(mg->mg_ptr+1) == '\0') {
2167 Safefree(PL_osname);
2171 TAINT_PROPER("assigning to $^O");
2172 PL_osname = savesvpv(sv);
2175 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2176 if (!PL_compiling.cop_io)
2177 PL_compiling.cop_io = newSVsv(sv);
2179 sv_setsv(PL_compiling.cop_io,sv);
2182 case '\020': /* ^P */
2183 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2184 if (PL_perldb && !PL_DBsingle)
2187 case '\024': /* ^T */
2189 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2191 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2194 case '\027': /* ^W & $^WARNING_BITS */
2195 if (*(mg->mg_ptr+1) == '\0') {
2196 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2197 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2198 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2199 | (i ? G_WARN_ON : G_WARN_OFF) ;
2202 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2203 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2204 if (!SvPOK(sv) && PL_localizing) {
2205 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2206 PL_compiling.cop_warnings = pWARN_NONE;
2211 int accumulate = 0 ;
2212 int any_fatals = 0 ;
2213 const char * const ptr = (char*)SvPV(sv, len) ;
2214 for (i = 0 ; i < len ; ++i) {
2215 accumulate |= ptr[i] ;
2216 any_fatals |= (ptr[i] & 0xAA) ;
2219 PL_compiling.cop_warnings = pWARN_NONE;
2220 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2221 PL_compiling.cop_warnings = pWARN_ALL;
2222 PL_dowarn |= G_WARN_ONCE ;
2225 if (specialWARN(PL_compiling.cop_warnings))
2226 PL_compiling.cop_warnings = newSVsv(sv) ;
2228 sv_setsv(PL_compiling.cop_warnings, sv);
2229 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2230 PL_dowarn |= G_WARN_ONCE ;
2238 if (PL_localizing) {
2239 if (PL_localizing == 1)
2240 SAVESPTR(PL_last_in_gv);
2242 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2243 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2246 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2247 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2248 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
2251 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2252 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2253 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
2256 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2259 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2260 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2261 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2264 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2268 IO *io = GvIOp(PL_defoutgv);
2271 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2272 IoFLAGS(io) &= ~IOf_FLUSH;
2274 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2275 PerlIO *ofp = IoOFP(io);
2277 (void)PerlIO_flush(ofp);
2278 IoFLAGS(io) |= IOf_FLUSH;
2284 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2285 PL_multiline = (i != 0);
2288 SvREFCNT_dec(PL_rs);
2289 PL_rs = newSVsv(sv);
2293 SvREFCNT_dec(PL_ors_sv);
2294 if (SvOK(sv) || SvGMAGICAL(sv)) {
2295 PL_ors_sv = newSVsv(sv);
2303 SvREFCNT_dec(PL_ofs_sv);
2304 if (SvOK(sv) || SvGMAGICAL(sv)) {
2305 PL_ofs_sv = newSVsv(sv);
2314 PL_ofmt = savesvpv(sv);
2317 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2320 #ifdef COMPLEX_STATUS
2321 if (PL_localizing == 2) {
2322 PL_statusvalue = LvTARGOFF(sv);
2323 PL_statusvalue_vms = LvTARGLEN(sv);
2327 #ifdef VMSISH_STATUS
2329 STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
2332 STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2337 # define PERL_VMS_BANG vaxc$errno
2339 # define PERL_VMS_BANG 0
2341 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2342 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2346 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2347 if (PL_delaymagic) {
2348 PL_delaymagic |= DM_RUID;
2349 break; /* don't do magic till later */
2352 (void)setruid((Uid_t)PL_uid);
2355 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2357 #ifdef HAS_SETRESUID
2358 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2360 if (PL_uid == PL_euid) { /* special case $< = $> */
2362 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2363 if (PL_uid != 0 && PerlProc_getuid() == 0)
2364 (void)PerlProc_setuid(0);
2366 (void)PerlProc_setuid(PL_uid);
2368 PL_uid = PerlProc_getuid();
2369 Perl_croak(aTHX_ "setruid() not implemented");
2374 PL_uid = PerlProc_getuid();
2375 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2378 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2379 if (PL_delaymagic) {
2380 PL_delaymagic |= DM_EUID;
2381 break; /* don't do magic till later */
2384 (void)seteuid((Uid_t)PL_euid);
2387 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2389 #ifdef HAS_SETRESUID
2390 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2392 if (PL_euid == PL_uid) /* special case $> = $< */
2393 PerlProc_setuid(PL_euid);
2395 PL_euid = PerlProc_geteuid();
2396 Perl_croak(aTHX_ "seteuid() not implemented");
2401 PL_euid = PerlProc_geteuid();
2402 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2405 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2406 if (PL_delaymagic) {
2407 PL_delaymagic |= DM_RGID;
2408 break; /* don't do magic till later */
2411 (void)setrgid((Gid_t)PL_gid);
2414 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2416 #ifdef HAS_SETRESGID
2417 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2419 if (PL_gid == PL_egid) /* special case $( = $) */
2420 (void)PerlProc_setgid(PL_gid);
2422 PL_gid = PerlProc_getgid();
2423 Perl_croak(aTHX_ "setrgid() not implemented");
2428 PL_gid = PerlProc_getgid();
2429 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2432 #ifdef HAS_SETGROUPS
2434 const char *p = SvPV(sv, len);
2435 Groups_t gary[NGROUPS];
2440 for (i = 0; i < NGROUPS; ++i) {
2441 while (*p && !isSPACE(*p))
2450 (void)setgroups(i, gary);
2452 #else /* HAS_SETGROUPS */
2453 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2454 #endif /* HAS_SETGROUPS */
2455 if (PL_delaymagic) {
2456 PL_delaymagic |= DM_EGID;
2457 break; /* don't do magic till later */
2460 (void)setegid((Gid_t)PL_egid);
2463 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2465 #ifdef HAS_SETRESGID
2466 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2468 if (PL_egid == PL_gid) /* special case $) = $( */
2469 (void)PerlProc_setgid(PL_egid);
2471 PL_egid = PerlProc_getegid();
2472 Perl_croak(aTHX_ "setegid() not implemented");
2477 PL_egid = PerlProc_getegid();
2478 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2481 PL_chopset = SvPV_force(sv,len);
2483 #ifndef MACOS_TRADITIONAL
2485 LOCK_DOLLARZERO_MUTEX;
2486 #ifdef HAS_SETPROCTITLE
2487 /* The BSDs don't show the argv[] in ps(1) output, they
2488 * show a string from the process struct and provide
2489 * the setproctitle() routine to manipulate that. */
2492 # if __FreeBSD_version > 410001
2493 /* The leading "-" removes the "perl: " prefix,
2494 * but not the "(perl) suffix from the ps(1)
2495 * output, because that's what ps(1) shows if the
2496 * argv[] is modified. */
2497 setproctitle("-%s", s);
2498 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2499 /* This doesn't really work if you assume that
2500 * $0 = 'foobar'; will wipe out 'perl' from the $0
2501 * because in ps(1) output the result will be like
2502 * sprintf("perl: %s (perl)", s)
2503 * I guess this is a security feature:
2504 * one (a user process) cannot get rid of the original name.
2506 setproctitle("%s", s);
2510 #if defined(__hpux) && defined(PSTAT_SETCMD)
2514 un.pst_command = (char *)s;
2515 pstat(PSTAT_SETCMD, un, len, 0, 0);
2518 /* PL_origalen is set in perl_parse(). */
2519 s = SvPV_force(sv,len);
2520 if (len >= (STRLEN)PL_origalen) {
2521 /* Longer than original, will be truncated. */
2522 Copy(s, PL_origargv[0], PL_origalen, char);
2523 PL_origargv[0][PL_origalen - 1] = 0;
2526 /* Shorter than original, will be padded. */
2527 Copy(s, PL_origargv[0], len, char);
2528 PL_origargv[0][len] = 0;
2529 memset(PL_origargv[0] + len + 1,
2530 /* Is the space counterintuitive? Yes.
2531 * (You were expecting \0?)
2532 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2535 PL_origalen - len - 1);
2536 for (i = 1; i < PL_origargc; i++)
2539 UNLOCK_DOLLARZERO_MUTEX;
2542 #ifdef USE_5005THREADS
2544 sv_setsv(thr->errsv, sv);
2546 #endif /* USE_5005THREADS */
2551 #ifdef USE_5005THREADS
2553 Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg)
2555 DEBUG_S(PerlIO_printf(Perl_debug_log,
2556 "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n",
2557 PTR2UV(thr), PTR2UV(sv)));
2559 Perl_croak(aTHX_ "panic: magic_mutexfree");
2560 MUTEX_DESTROY(MgMUTEXP(mg));
2561 COND_DESTROY(MgCONDP(mg));
2564 #endif /* USE_5005THREADS */
2567 Perl_whichsig(pTHX_ char *sig)
2569 register const char **sigv;
2571 for (sigv = PL_sig_name; *sigv; sigv++)
2572 if (strEQ(sig,*sigv))
2573 return PL_sig_num[sigv - PL_sig_name];
2575 if (strEQ(sig,"CHLD"))
2579 if (strEQ(sig,"CLD"))
2585 #if !defined(PERL_IMPLICIT_CONTEXT)
2590 Perl_sighandler(int sig)
2592 #ifdef PERL_GET_SIG_CONTEXT
2593 dTHXa(PERL_GET_SIG_CONTEXT);
2600 SV *sv = Nullsv, *tSv = PL_Sv;
2606 if (PL_savestack_ix + 15 <= PL_savestack_max)
2608 if (PL_markstack_ptr < PL_markstack_max - 2)
2610 if (PL_retstack_ix < PL_retstack_max - 2)
2612 if (PL_scopestack_ix < PL_scopestack_max - 3)
2615 if (!PL_psig_ptr[sig]) {
2616 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2621 /* Max number of items pushed there is 3*n or 4. We cannot fix
2622 infinity, so we fix 4 (in fact 5): */
2624 PL_savestack_ix += 5; /* Protect save in progress. */
2625 SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
2628 PL_markstack_ptr++; /* Protect mark. */
2631 PL_retstack[PL_retstack_ix] = NULL;
2634 PL_scopestack_ix += 1;
2635 /* sv_2cv is too complicated, try a simpler variant first: */
2636 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2637 || SvTYPE(cv) != SVt_PVCV)
2638 cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
2640 if (!cv || !CvROOT(cv)) {
2641 if (ckWARN(WARN_SIGNAL))
2642 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2643 PL_sig_name[sig], (gv ? GvENAME(gv)
2650 if(PL_psig_name[sig]) {
2651 sv = SvREFCNT_inc(PL_psig_name[sig]);
2653 #if !defined(PERL_IMPLICIT_CONTEXT)
2657 sv = sv_newmortal();
2658 sv_setpv(sv,PL_sig_name[sig]);
2661 PUSHSTACKi(PERLSI_SIGNAL);
2666 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2669 if (SvTRUE(ERRSV)) {
2671 #ifdef HAS_SIGPROCMASK
2672 /* Handler "died", for example to get out of a restart-able read().
2673 * Before we re-do that on its behalf re-enable the signal which was
2674 * blocked by the system when we entered.
2678 sigaddset(&set,sig);
2679 sigprocmask(SIG_UNBLOCK, &set, NULL);
2681 /* Not clear if this will work */
2682 (void)rsignal(sig, SIG_IGN);
2683 (void)rsignal(sig, PL_csighandlerp);
2685 #endif /* !PERL_MICRO */
2690 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2696 PL_scopestack_ix -= 1;
2699 PL_op = myop; /* Apparently not needed... */
2701 PL_Sv = tSv; /* Restore global temporaries. */
2708 restore_magic(pTHX_ const void *p)
2710 MGS* mgs = SSPTR(PTR2IV(p), MGS*);
2711 SV* sv = mgs->mgs_sv;
2716 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2719 SvFLAGS(sv) |= mgs->mgs_flags;
2723 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2726 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2728 /* If we're still on top of the stack, pop us off. (That condition
2729 * will be satisfied if restore_magic was called explicitly, but *not*
2730 * if it's being called via leave_scope.)
2731 * The reason for doing this is that otherwise, things like sv_2cv()
2732 * may leave alloc gunk on the savestack, and some code
2733 * (e.g. sighandler) doesn't expect that...
2735 if (PL_savestack_ix == mgs->mgs_ss_ix)
2737 I32 popval = SSPOPINT;
2738 assert(popval == SAVEt_DESTRUCTOR_X);
2739 PL_savestack_ix -= 2;
2741 assert(popval == SAVEt_ALLOC);
2743 PL_savestack_ix -= popval;
2749 unwind_handler_stack(pTHX_ const void *p)
2751 const U32 flags = *(const U32*)p;
2754 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2755 /* cxstack_ix-- Not needed, die already unwound it. */
2756 #if !defined(PERL_IMPLICIT_CONTEXT)
2758 SvREFCNT_dec(sig_sv);