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 static void restore_magic(pTHX_ const void *p);
58 static void unwind_handler_stack(pTHX_ const void *p);
61 /* Missing protos on LynxOS */
62 void setruid(uid_t id);
63 void seteuid(uid_t id);
64 void setrgid(uid_t id);
65 void setegid(uid_t id);
69 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
77 /* MGS is typedef'ed to struct magic_state in perl.h */
80 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
83 assert(SvMAGICAL(sv));
84 #ifdef PERL_COPY_ON_WRITE
85 /* Turning READONLY off for a copy-on-write scalar is a bad idea. */
90 SAVEDESTRUCTOR_X(restore_magic, INT2PTR(void*, (IV)mgs_ix));
92 mgs = SSPTR(mgs_ix, MGS*);
94 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
95 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
99 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
103 =for apidoc mg_magical
105 Turns on the magical status of an SV. See C<sv_magic>.
111 Perl_mg_magical(pTHX_ SV *sv)
114 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
115 const MGVTBL* const vtbl = mg->mg_virtual;
117 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
121 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
130 Do magic after a value is retrieved from the SV. See C<sv_magic>.
136 Perl_mg_get(pTHX_ SV *sv)
138 const I32 mgs_ix = SSNEW(sizeof(MGS));
139 const bool was_temp = (bool)SvTEMP(sv);
141 MAGIC *newmg, *head, *cur, *mg;
142 /* guard against sv having being freed midway by holding a private
145 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
146 cause the SV's buffer to get stolen (and maybe other stuff).
149 sv_2mortal(SvREFCNT_inc(sv));
154 save_magic(mgs_ix, sv);
156 /* We must call svt_get(sv, mg) for each valid entry in the linked
157 list of magic. svt_get() may delete the current entry, add new
158 magic to the head of the list, or upgrade the SV. AMS 20010810 */
160 newmg = cur = head = mg = SvMAGIC(sv);
162 const MGVTBL * const vtbl = mg->mg_virtual;
164 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
165 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
167 /* guard against magic having been deleted - eg FETCH calling
172 /* Don't restore the flags for this entry if it was deleted. */
173 if (mg->mg_flags & MGf_GSKIP)
174 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
177 mg = mg->mg_moremagic;
180 /* Have we finished with the new entries we saw? Start again
181 where we left off (unless there are more new entries). */
189 /* Were any new entries added? */
190 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
197 restore_magic(aTHX_ INT2PTR(void *, (IV)mgs_ix));
199 if (SvREFCNT(sv) == 1) {
200 /* We hold the last reference to this SV, which implies that the
201 SV was deleted as a side effect of the routines we called. */
210 Do magic after a value is assigned to the SV. See C<sv_magic>.
216 Perl_mg_set(pTHX_ SV *sv)
218 const I32 mgs_ix = SSNEW(sizeof(MGS));
222 save_magic(mgs_ix, sv);
224 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
225 const MGVTBL* vtbl = mg->mg_virtual;
226 nextmg = mg->mg_moremagic; /* it may delete itself */
227 if (mg->mg_flags & MGf_GSKIP) {
228 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
229 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
231 if (vtbl && vtbl->svt_set)
232 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
235 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
240 =for apidoc mg_length
242 Report on the SV's length. See C<sv_magic>.
248 Perl_mg_length(pTHX_ SV *sv)
253 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
254 const MGVTBL * const vtbl = mg->mg_virtual;
255 if (vtbl && vtbl->svt_len) {
256 const I32 mgs_ix = SSNEW(sizeof(MGS));
257 save_magic(mgs_ix, sv);
258 /* omit MGf_GSKIP -- not changed here */
259 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
260 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
266 U8 *s = (U8*)SvPV(sv, len);
267 len = Perl_utf8_length(aTHX_ s, s + len);
275 Perl_mg_size(pTHX_ SV *sv)
279 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
280 const MGVTBL* const vtbl = mg->mg_virtual;
281 if (vtbl && vtbl->svt_len) {
282 const I32 mgs_ix = SSNEW(sizeof(MGS));
284 save_magic(mgs_ix, sv);
285 /* omit MGf_GSKIP -- not changed here */
286 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
287 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
294 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
298 Perl_croak(aTHX_ "Size magic not implemented");
307 Clear something magical that the SV represents. See C<sv_magic>.
313 Perl_mg_clear(pTHX_ SV *sv)
315 const I32 mgs_ix = SSNEW(sizeof(MGS));
318 save_magic(mgs_ix, sv);
320 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
321 const MGVTBL* const vtbl = mg->mg_virtual;
322 /* omit GSKIP -- never set here */
324 if (vtbl && vtbl->svt_clear)
325 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
328 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
335 Finds the magic pointer for type matching the SV. See C<sv_magic>.
341 Perl_mg_find(pTHX_ const SV *sv, int type)
345 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
346 if (mg->mg_type == type)
356 Copies the magic from one SV to another. See C<sv_magic>.
362 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
366 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
367 const MGVTBL* const vtbl = mg->mg_virtual;
368 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
369 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
371 else if (isUPPER(mg->mg_type)) {
373 mg->mg_type == PERL_MAGIC_tied ? SvTIED_obj(sv, mg) :
374 (mg->mg_type == PERL_MAGIC_regdata && mg->mg_obj)
376 toLOWER(mg->mg_type), key, klen);
386 Free any magic storage used by the SV. See C<sv_magic>.
392 Perl_mg_free(pTHX_ SV *sv)
396 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
397 const MGVTBL* const vtbl = mg->mg_virtual;
398 moremagic = mg->mg_moremagic;
399 if (vtbl && vtbl->svt_free)
400 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
401 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
402 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
403 Safefree(mg->mg_ptr);
404 else if (mg->mg_len == HEf_SVKEY)
405 SvREFCNT_dec((SV*)mg->mg_ptr);
407 if (mg->mg_flags & MGf_REFCOUNTED)
408 SvREFCNT_dec(mg->mg_obj);
411 SvMAGIC_set(sv, NULL);
418 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
420 register const REGEXP *rx;
423 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
424 if (mg->mg_obj) /* @+ */
427 return rx->lastparen;
434 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
438 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
439 register const I32 paren = mg->mg_len;
444 if (paren <= (I32)rx->nparens &&
445 (s = rx->startp[paren]) != -1 &&
446 (t = rx->endp[paren]) != -1)
449 if (mg->mg_obj) /* @+ */
454 if (i > 0 && RX_MATCH_UTF8(rx)) {
455 char *b = rx->subbeg;
457 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
467 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
470 Perl_croak(aTHX_ PL_no_modify);
471 NORETURN_FUNCTION_END;
475 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
479 register const REGEXP *rx;
482 switch (*mg->mg_ptr) {
483 case '1': case '2': case '3': case '4':
484 case '5': case '6': case '7': case '8': case '9': case '&':
485 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
487 paren = atoi(mg->mg_ptr); /* $& is in [0] */
489 if (paren <= (I32)rx->nparens &&
490 (s1 = rx->startp[paren]) != -1 &&
491 (t1 = rx->endp[paren]) != -1)
495 if (i > 0 && RX_MATCH_UTF8(rx)) {
496 char *s = rx->subbeg + s1;
497 char *send = rx->subbeg + t1;
502 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
506 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
510 if (ckWARN(WARN_UNINITIALIZED))
515 if (ckWARN(WARN_UNINITIALIZED))
520 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
521 paren = rx->lastparen;
526 case '\016': /* ^N */
527 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
528 paren = rx->lastcloseparen;
534 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
535 if (rx->startp[0] != -1) {
546 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
547 if (rx->endp[0] != -1) {
548 i = rx->sublen - rx->endp[0];
559 if (!SvPOK(sv) && SvNIOK(sv)) {
569 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
573 register char *s = NULL;
577 switch (*mg->mg_ptr) {
578 case '\001': /* ^A */
579 sv_setsv(sv, PL_bodytarget);
581 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
582 if (*(mg->mg_ptr+1) == '\0') {
583 sv_setiv(sv, (IV)PL_minus_c);
585 else if (strEQ(mg->mg_ptr, "\003HILD_ERROR_NATIVE")) {
586 sv_setiv(sv, (IV)STATUS_NATIVE);
590 case '\004': /* ^D */
591 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
593 case '\005': /* ^E */
594 if (*(mg->mg_ptr+1) == '\0') {
595 #ifdef MACOS_TRADITIONAL
599 sv_setnv(sv,(double)gMacPerl_OSErr);
600 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
605 # include <descrip.h>
606 # include <starlet.h>
608 $DESCRIPTOR(msgdsc,msg);
609 sv_setnv(sv,(NV) vaxc$errno);
610 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
611 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
617 if (!(_emx_env & 0x200)) { /* Under DOS */
618 sv_setnv(sv, (NV)errno);
619 sv_setpv(sv, errno ? Strerror(errno) : "");
621 if (errno != errno_isOS2) {
622 int tmp = _syserrno();
623 if (tmp) /* 2nd call to _syserrno() makes it 0 */
626 sv_setnv(sv, (NV)Perl_rc);
627 sv_setpv(sv, os2error(Perl_rc));
632 DWORD dwErr = GetLastError();
633 sv_setnv(sv, (NV)dwErr);
636 PerlProc_GetOSError(sv, dwErr);
639 sv_setpvn(sv, "", 0);
644 int saveerrno = errno;
645 sv_setnv(sv, (NV)errno);
646 sv_setpv(sv, errno ? Strerror(errno) : "");
653 SvNOK_on(sv); /* what a wonderful hack! */
655 else if (strEQ(mg->mg_ptr+1, "NCODING"))
656 sv_setsv(sv, PL_encoding);
658 case '\006': /* ^F */
659 sv_setiv(sv, (IV)PL_maxsysfd);
661 case '\010': /* ^H */
662 sv_setiv(sv, (IV)PL_hints);
664 case '\011': /* ^I */ /* NOT \t in EBCDIC */
666 sv_setpv(sv, PL_inplace);
668 sv_setsv(sv, &PL_sv_undef);
670 case '\017': /* ^O & ^OPEN */
671 if (*(mg->mg_ptr+1) == '\0') {
672 sv_setpv(sv, PL_osname);
675 else if (strEQ(mg->mg_ptr, "\017PEN")) {
676 if (!PL_compiling.cop_io)
677 sv_setsv(sv, &PL_sv_undef);
679 sv_setsv(sv, PL_compiling.cop_io);
683 case '\020': /* ^P */
684 sv_setiv(sv, (IV)PL_perldb);
686 case '\023': /* ^S */
687 if (*(mg->mg_ptr+1) == '\0') {
688 if (PL_lex_state != LEX_NOTPARSING)
691 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
696 case '\024': /* ^T */
697 if (*(mg->mg_ptr+1) == '\0') {
699 sv_setnv(sv, PL_basetime);
701 sv_setiv(sv, (IV)PL_basetime);
704 else if (strEQ(mg->mg_ptr, "\024AINT"))
705 sv_setiv(sv, PL_tainting
706 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
709 case '\025': /* $^UNICODE, $^UTF8LOCALE */
710 if (strEQ(mg->mg_ptr, "\025NICODE"))
711 sv_setuv(sv, (UV) PL_unicode);
712 else if (strEQ(mg->mg_ptr, "\025TF8LOCALE"))
713 sv_setuv(sv, (UV) PL_utf8locale);
715 case '\027': /* ^W & $^WARNING_BITS */
716 if (*(mg->mg_ptr+1) == '\0')
717 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
718 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
719 if (PL_compiling.cop_warnings == pWARN_NONE ||
720 PL_compiling.cop_warnings == pWARN_STD)
722 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
724 else if (PL_compiling.cop_warnings == pWARN_ALL) {
725 /* Get the bit mask for $warnings::Bits{all}, because
726 * it could have been extended by warnings::register */
728 HV *bits=get_hv("warnings::Bits", FALSE);
729 if (bits && (bits_all=hv_fetch(bits, "all", 3, FALSE))) {
730 sv_setsv(sv, *bits_all);
733 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
737 sv_setsv(sv, PL_compiling.cop_warnings);
742 case '1': case '2': case '3': case '4':
743 case '5': case '6': case '7': case '8': case '9': case '&':
744 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
748 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
749 * XXX Does the new way break anything?
751 paren = atoi(mg->mg_ptr); /* $& is in [0] */
753 if (paren <= (I32)rx->nparens &&
754 (s1 = rx->startp[paren]) != -1 &&
755 (t1 = rx->endp[paren]) != -1)
765 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
770 if (RX_MATCH_TAINTED(rx)) {
771 MAGIC* mg = SvMAGIC(sv);
774 SvMAGIC_set(sv, mg->mg_moremagic);
776 if ((mgt = SvMAGIC(sv))) {
777 mg->mg_moremagic = mgt;
787 sv_setsv(sv,&PL_sv_undef);
790 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
791 paren = rx->lastparen;
795 sv_setsv(sv,&PL_sv_undef);
797 case '\016': /* ^N */
798 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
799 paren = rx->lastcloseparen;
803 sv_setsv(sv,&PL_sv_undef);
806 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
807 if ((s = rx->subbeg) && rx->startp[0] != -1) {
812 sv_setsv(sv,&PL_sv_undef);
815 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
816 if (rx->subbeg && rx->endp[0] != -1) {
817 s = rx->subbeg + rx->endp[0];
818 i = rx->sublen - rx->endp[0];
822 sv_setsv(sv,&PL_sv_undef);
825 if (GvIO(PL_last_in_gv)) {
826 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
831 sv_setiv(sv, (IV)STATUS_CURRENT);
832 #ifdef COMPLEX_STATUS
833 LvTARGOFF(sv) = PL_statusvalue;
834 LvTARGLEN(sv) = PL_statusvalue_vms;
839 if (GvIOp(PL_defoutgv))
840 s = IoTOP_NAME(GvIOp(PL_defoutgv));
844 sv_setpv(sv,GvENAME(PL_defoutgv));
849 if (GvIOp(PL_defoutgv))
850 s = IoFMT_NAME(GvIOp(PL_defoutgv));
852 s = GvENAME(PL_defoutgv);
856 if (GvIOp(PL_defoutgv))
857 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
860 if (GvIOp(PL_defoutgv))
861 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
864 if (GvIOp(PL_defoutgv))
865 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
872 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
875 if (GvIOp(PL_defoutgv))
876 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
882 sv_copypv(sv, PL_ors_sv);
885 sv_setpv(sv,PL_ofmt);
889 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
890 sv_setpv(sv, errno ? Strerror(errno) : "");
893 int saveerrno = errno;
894 sv_setnv(sv, (NV)errno);
896 if (errno == errno_isOS2 || errno == errno_isOS2_set)
897 sv_setpv(sv, os2error(Perl_rc));
900 sv_setpv(sv, errno ? Strerror(errno) : "");
904 SvNOK_on(sv); /* what a wonderful hack! */
907 sv_setiv(sv, (IV)PL_uid);
910 sv_setiv(sv, (IV)PL_euid);
913 sv_setiv(sv, (IV)PL_gid);
915 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_gid);
919 sv_setiv(sv, (IV)PL_egid);
921 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_egid);
926 Groups_t gary[NGROUPS];
927 I32 j = getgroups(NGROUPS,gary);
929 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, (long unsigned int)gary[j]);
932 (void)SvIOK_on(sv); /* what a wonderful hack! */
934 #ifndef MACOS_TRADITIONAL
943 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
945 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
947 if (uf && uf->uf_val)
948 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
953 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
964 #ifdef DYNAMIC_ENV_FETCH
965 /* We just undefd an environment var. Is a replacement */
966 /* waiting in the wings? */
969 if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
970 s = SvPV(*valp, len);
974 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
975 /* And you'll never guess what the dog had */
976 /* in its mouth... */
978 MgTAINTEDDIR_off(mg);
980 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
981 char pathbuf[256], eltbuf[256], *cp, *elt = s;
985 do { /* DCL$PATH may be a search list */
986 while (1) { /* as may dev portion of any element */
987 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
988 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
989 cando_by_name(S_IWUSR,0,elt) ) {
994 if ((cp = strchr(elt, ':')) != Nullch)
996 if (my_trnlnm(elt, eltbuf, j++))
1002 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1005 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1006 char *strend = s + len;
1008 while (s < strend) {
1012 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1013 s, strend, ':', &i);
1015 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1017 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1018 MgTAINTEDDIR_on(mg);
1024 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1030 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1034 my_setenv(MgPV(mg,n_a),Nullch);
1039 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1041 #if defined(VMS) || defined(EPOC) || defined(SYMBIAN)
1042 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1044 if (PL_localizing) {
1047 magic_clear_all_env(sv,mg);
1048 hv_iterinit((HV*)sv);
1049 while ((entry = hv_iternext((HV*)sv))) {
1051 my_setenv(hv_iterkey(entry, &keylen),
1052 SvPV(hv_iterval((HV*)sv, entry), n_a));
1060 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1064 #if defined(VMS) || defined(EPOC) || defined(SYMBIAN)
1065 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1067 # if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
1070 # ifdef USE_ENVIRON_ARRAY
1071 # if defined(USE_ITHREADS)
1072 /* only the parent thread can clobber the process environment */
1073 if (PL_curinterp == aTHX)
1076 # ifndef PERL_USE_SAFE_PUTENV
1077 if (!PL_use_safe_putenv) {
1080 if (environ == PL_origenviron)
1081 environ = (char**)safesysmalloc(sizeof(char*));
1083 for (i = 0; environ[i]; i++)
1084 safesysfree(environ[i]);
1086 # endif /* PERL_USE_SAFE_PUTENV */
1088 environ[0] = Nullch;
1090 # endif /* USE_ENVIRON_ARRAY */
1091 # endif /* PERL_IMPLICIT_SYS || WIN32 */
1092 #endif /* VMS || EPOC */
1093 #endif /* !PERL_MICRO */
1100 #ifdef HAS_SIGPROCMASK
1102 restore_sigmask(pTHX_ SV *save_sv)
1104 sigset_t *ossetp = (sigset_t *) SvPV_nolen( save_sv );
1105 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1109 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1113 /* Are we fetching a signal entry? */
1114 i = whichsig(MgPV(mg,n_a));
1117 sv_setsv(sv,PL_psig_ptr[i]);
1119 Sighandler_t sigstate;
1120 sigstate = rsignal_state(i);
1121 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1122 if (PL_sig_handlers_initted && PL_sig_ignoring[i]) sigstate = SIG_IGN;
1124 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1125 if (PL_sig_handlers_initted && PL_sig_defaulting[i]) sigstate = SIG_DFL;
1127 /* cache state so we don't fetch it again */
1128 if(sigstate == SIG_IGN)
1129 sv_setpv(sv,"IGNORE");
1131 sv_setsv(sv,&PL_sv_undef);
1132 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1139 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1141 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1142 * refactoring might be in order.
1146 register const char *s = MgPV(mg,n_a);
1150 if (strEQ(s,"__DIE__"))
1152 else if (strEQ(s,"__WARN__"))
1155 Perl_croak(aTHX_ "No such hook: %s", s);
1159 SvREFCNT_dec(to_dec);
1164 /* Are we clearing a signal entry? */
1167 #ifdef HAS_SIGPROCMASK
1170 /* Avoid having the signal arrive at a bad time, if possible. */
1173 sigprocmask(SIG_BLOCK, &set, &save);
1175 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1176 SAVEFREESV(save_sv);
1177 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1180 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1181 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1183 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1184 PL_sig_defaulting[i] = 1;
1185 (void)rsignal(i, PL_csighandlerp);
1187 (void)rsignal(i, SIG_DFL);
1189 if(PL_psig_name[i]) {
1190 SvREFCNT_dec(PL_psig_name[i]);
1193 if(PL_psig_ptr[i]) {
1194 SV *to_dec=PL_psig_ptr[i];
1197 SvREFCNT_dec(to_dec);
1207 S_raise_signal(pTHX_ int sig)
1209 /* Set a flag to say this signal is pending */
1210 PL_psig_pend[sig]++;
1211 /* And one to say _a_ signal is pending */
1216 Perl_csighandler(int sig)
1218 #ifdef PERL_GET_SIG_CONTEXT
1219 dTHXa(PERL_GET_SIG_CONTEXT);
1223 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1224 (void) rsignal(sig, PL_csighandlerp);
1225 if (PL_sig_ignoring[sig]) return;
1227 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1228 if (PL_sig_defaulting[sig])
1229 #ifdef KILL_BY_SIGPRC
1230 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1235 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1236 /* Call the perl level handler now--
1237 * with risk we may be in malloc() etc. */
1238 (*PL_sighandlerp)(sig);
1240 S_raise_signal(aTHX_ sig);
1243 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1245 Perl_csighandler_init(void)
1248 if (PL_sig_handlers_initted) return;
1250 for (sig = 1; sig < SIG_SIZE; sig++) {
1251 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1253 PL_sig_defaulting[sig] = 1;
1254 (void) rsignal(sig, PL_csighandlerp);
1256 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1257 PL_sig_ignoring[sig] = 0;
1260 PL_sig_handlers_initted = 1;
1265 Perl_despatch_signals(pTHX)
1269 for (sig = 1; sig < SIG_SIZE; sig++) {
1270 if (PL_psig_pend[sig]) {
1271 PERL_BLOCKSIG_ADD(set, sig);
1272 PL_psig_pend[sig] = 0;
1273 PERL_BLOCKSIG_BLOCK(set);
1274 (*PL_sighandlerp)(sig);
1275 PERL_BLOCKSIG_UNBLOCK(set);
1281 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1286 /* Need to be careful with SvREFCNT_dec(), because that can have side
1287 * effects (due to closures). We must make sure that the new disposition
1288 * is in place before it is called.
1292 #ifdef HAS_SIGPROCMASK
1297 register const char *s = MgPV(mg,len);
1299 if (strEQ(s,"__DIE__"))
1301 else if (strEQ(s,"__WARN__"))
1304 Perl_croak(aTHX_ "No such hook: %s", s);
1312 i = whichsig(s); /* ...no, a brick */
1314 if (ckWARN(WARN_SIGNAL))
1315 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1318 #ifdef HAS_SIGPROCMASK
1319 /* Avoid having the signal arrive at a bad time, if possible. */
1322 sigprocmask(SIG_BLOCK, &set, &save);
1324 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1325 SAVEFREESV(save_sv);
1326 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1329 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1330 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1332 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1333 PL_sig_ignoring[i] = 0;
1335 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1336 PL_sig_defaulting[i] = 0;
1338 SvREFCNT_dec(PL_psig_name[i]);
1339 to_dec = PL_psig_ptr[i];
1340 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1341 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1342 PL_psig_name[i] = newSVpvn(s, len);
1343 SvREADONLY_on(PL_psig_name[i]);
1345 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1347 (void)rsignal(i, PL_csighandlerp);
1348 #ifdef HAS_SIGPROCMASK
1353 *svp = SvREFCNT_inc(sv);
1355 SvREFCNT_dec(to_dec);
1358 s = SvPV_force(sv,len);
1359 if (strEQ(s,"IGNORE")) {
1361 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1362 PL_sig_ignoring[i] = 1;
1363 (void)rsignal(i, PL_csighandlerp);
1365 (void)rsignal(i, SIG_IGN);
1369 else if (strEQ(s,"DEFAULT") || !*s) {
1371 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1373 PL_sig_defaulting[i] = 1;
1374 (void)rsignal(i, PL_csighandlerp);
1377 (void)rsignal(i, SIG_DFL);
1382 * We should warn if HINT_STRICT_REFS, but without
1383 * access to a known hint bit in a known OP, we can't
1384 * tell whether HINT_STRICT_REFS is in force or not.
1386 if (!strchr(s,':') && !strchr(s,'\''))
1387 sv_insert(sv, 0, 0, "main::", 6);
1389 (void)rsignal(i, PL_csighandlerp);
1391 *svp = SvREFCNT_inc(sv);
1393 #ifdef HAS_SIGPROCMASK
1398 SvREFCNT_dec(to_dec);
1401 #endif /* !PERL_MICRO */
1404 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1408 PL_sub_generation++;
1413 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1417 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1418 PL_amagic_generation++;
1424 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1426 HV * const hv = (HV*)LvTARG(sv);
1431 (void) hv_iterinit(hv);
1432 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1435 while (hv_iternext(hv))
1440 sv_setiv(sv, (IV)i);
1445 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1449 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1454 /* caller is responsible for stack switching/cleanup */
1456 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1462 PUSHs(SvTIED_obj(sv, mg));
1465 if (mg->mg_len >= 0)
1466 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1467 else if (mg->mg_len == HEf_SVKEY)
1468 PUSHs((SV*)mg->mg_ptr);
1470 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1471 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1479 return call_method(meth, flags);
1483 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1489 PUSHSTACKi(PERLSI_MAGIC);
1491 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1492 sv_setsv(sv, *PL_stack_sp--);
1502 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1505 mg->mg_flags |= MGf_GSKIP;
1506 magic_methpack(sv,mg,"FETCH");
1511 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1515 PUSHSTACKi(PERLSI_MAGIC);
1516 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1523 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1525 return magic_methpack(sv,mg,"DELETE");
1530 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1537 PUSHSTACKi(PERLSI_MAGIC);
1538 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1539 sv = *PL_stack_sp--;
1540 retval = (U32) SvIV(sv)-1;
1549 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1554 PUSHSTACKi(PERLSI_MAGIC);
1556 XPUSHs(SvTIED_obj(sv, mg));
1558 call_method("CLEAR", G_SCALAR|G_DISCARD);
1566 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1569 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1573 PUSHSTACKi(PERLSI_MAGIC);
1576 PUSHs(SvTIED_obj(sv, mg));
1581 if (call_method(meth, G_SCALAR))
1582 sv_setsv(key, *PL_stack_sp--);
1591 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1593 return magic_methpack(sv,mg,"EXISTS");
1597 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1600 SV *retval = &PL_sv_undef;
1601 SV *tied = SvTIED_obj((SV*)hv, mg);
1602 HV *pkg = SvSTASH((SV*)SvRV(tied));
1604 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1606 if (HvEITER_get(hv))
1607 /* we are in an iteration so the hash cannot be empty */
1609 /* no xhv_eiter so now use FIRSTKEY */
1610 key = sv_newmortal();
1611 magic_nextpack((SV*)hv, mg, key);
1612 HvEITER_set(hv, NULL); /* need to reset iterator */
1613 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1616 /* there is a SCALAR method that we can call */
1618 PUSHSTACKi(PERLSI_MAGIC);
1624 if (call_method("SCALAR", G_SCALAR))
1625 retval = *PL_stack_sp--;
1632 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1642 svp = av_fetch(GvAV(gv),
1643 atoi(MgPV(mg,n_a)), FALSE);
1644 if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp)))) {
1645 /* set or clear breakpoint in the relevant control op */
1647 o->op_flags |= OPf_SPECIAL;
1649 o->op_flags &= ~OPf_SPECIAL;
1655 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1657 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
1662 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1664 av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
1669 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1671 SV* lsv = LvTARG(sv);
1673 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1674 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1675 if (mg && mg->mg_len >= 0) {
1678 sv_pos_b2u(lsv, &i);
1679 sv_setiv(sv, i + PL_curcop->cop_arybase);
1688 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1690 SV* lsv = LvTARG(sv);
1697 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1698 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1702 sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1703 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1705 else if (!SvOK(sv)) {
1709 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1711 pos = SvIV(sv) - PL_curcop->cop_arybase;
1714 ulen = sv_len_utf8(lsv);
1724 else if (pos > (SSize_t)len)
1729 sv_pos_u2b(lsv, &p, 0);
1734 mg->mg_flags &= ~MGf_MINMATCH;
1740 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1743 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1745 gv_efullname3(sv,((GV*)sv), "*");
1749 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
1754 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1761 gv = gv_fetchsv(sv,TRUE, SVt_PVGV);
1766 GvGP(sv) = gp_ref(GvGP(gv));
1771 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1774 SV * const lsv = LvTARG(sv);
1775 const char * const tmps = SvPV(lsv,len);
1776 I32 offs = LvTARGOFF(sv);
1777 I32 rem = LvTARGLEN(sv);
1781 sv_pos_u2b(lsv, &offs, &rem);
1782 if (offs > (I32)len)
1784 if (rem + offs > (I32)len)
1786 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1793 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1796 char *tmps = SvPV(sv, len);
1797 SV * const lsv = LvTARG(sv);
1798 I32 lvoff = LvTARGOFF(sv);
1799 I32 lvlen = LvTARGLEN(sv);
1803 sv_utf8_upgrade(lsv);
1804 sv_pos_u2b(lsv, &lvoff, &lvlen);
1805 sv_insert(lsv, lvoff, lvlen, tmps, len);
1806 LvTARGLEN(sv) = sv_len_utf8(sv);
1809 else if (lsv && SvUTF8(lsv)) {
1810 sv_pos_u2b(lsv, &lvoff, &lvlen);
1811 LvTARGLEN(sv) = len;
1812 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1813 sv_insert(lsv, lvoff, lvlen, tmps, len);
1817 sv_insert(lsv, lvoff, lvlen, tmps, len);
1818 LvTARGLEN(sv) = len;
1826 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1828 TAINT_IF((mg->mg_len & 1) ||
1829 ((mg->mg_len & 2) && mg->mg_obj == sv)); /* kludge */
1834 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1837 if (PL_localizing) {
1838 if (PL_localizing == 1)
1843 else if (PL_tainted)
1851 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1853 SV * const lsv = LvTARG(sv);
1861 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1866 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1869 do_vecset(sv); /* XXX slurp this routine */
1874 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1877 if (LvTARGLEN(sv)) {
1879 SV *ahv = LvTARG(sv);
1880 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1885 AV* av = (AV*)LvTARG(sv);
1886 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1887 targ = AvARRAY(av)[LvTARGOFF(sv)];
1889 if (targ && targ != &PL_sv_undef) {
1890 /* somebody else defined it for us */
1891 SvREFCNT_dec(LvTARG(sv));
1892 LvTARG(sv) = SvREFCNT_inc(targ);
1894 SvREFCNT_dec(mg->mg_obj);
1895 mg->mg_obj = Nullsv;
1896 mg->mg_flags &= ~MGf_REFCOUNTED;
1901 sv_setsv(sv, targ ? targ : &PL_sv_undef);
1906 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1912 sv_setsv(LvTARG(sv), sv);
1913 SvSETMAGIC(LvTARG(sv));
1919 Perl_vivify_defelem(pTHX_ SV *sv)
1924 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1927 SV *ahv = LvTARG(sv);
1928 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1931 if (!value || value == &PL_sv_undef)
1932 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
1935 AV* av = (AV*)LvTARG(sv);
1936 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1937 LvTARG(sv) = Nullsv; /* array can't be extended */
1939 SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1940 if (!svp || (value = *svp) == &PL_sv_undef)
1941 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
1944 (void)SvREFCNT_inc(value);
1945 SvREFCNT_dec(LvTARG(sv));
1948 SvREFCNT_dec(mg->mg_obj);
1949 mg->mg_obj = Nullsv;
1950 mg->mg_flags &= ~MGf_REFCOUNTED;
1954 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
1956 AV *av = (AV*)mg->mg_obj;
1957 SV **svp = AvARRAY(av);
1958 I32 i = AvFILLp(av);
1963 if (!SvWEAKREF(svp[i]))
1964 Perl_croak(aTHX_ "panic: magic_killbackrefs");
1965 /* XXX Should we check that it hasn't changed? */
1966 SvRV_set(svp[i], 0);
1968 SvWEAKREF_off(svp[i]);
1973 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
1978 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
1986 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
1989 sv_unmagic(sv, PERL_MAGIC_bm);
1995 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
1998 sv_unmagic(sv, PERL_MAGIC_fm);
2004 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2006 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2008 if (uf && uf->uf_set)
2009 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2014 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2017 sv_unmagic(sv, PERL_MAGIC_qr);
2022 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2024 regexp *re = (regexp *)mg->mg_obj;
2030 #ifdef USE_LOCALE_COLLATE
2032 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2035 * RenE<eacute> Descartes said "I think not."
2036 * and vanished with a faint plop.
2040 Safefree(mg->mg_ptr);
2046 #endif /* USE_LOCALE_COLLATE */
2048 /* Just clear the UTF-8 cache data. */
2050 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2053 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2055 mg->mg_len = -1; /* The mg_len holds the len cache. */
2060 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2062 register const char *s;
2065 switch (*mg->mg_ptr) {
2066 case '\001': /* ^A */
2067 sv_setsv(PL_bodytarget, sv);
2069 case '\003': /* ^C */
2070 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2073 case '\004': /* ^D */
2076 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2077 DEBUG_x(dump_all());
2079 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2082 case '\005': /* ^E */
2083 if (*(mg->mg_ptr+1) == '\0') {
2084 #ifdef MACOS_TRADITIONAL
2085 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2088 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2091 SetLastError( SvIV(sv) );
2094 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2096 /* will anyone ever use this? */
2097 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2103 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2105 SvREFCNT_dec(PL_encoding);
2106 if (SvOK(sv) || SvGMAGICAL(sv)) {
2107 PL_encoding = newSVsv(sv);
2110 PL_encoding = Nullsv;
2114 case '\006': /* ^F */
2115 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2117 case '\010': /* ^H */
2118 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2120 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2122 Safefree(PL_inplace);
2124 PL_inplace = savesvpv(sv);
2126 PL_inplace = Nullch;
2128 case '\017': /* ^O */
2129 if (*(mg->mg_ptr+1) == '\0') {
2131 Safefree(PL_osname);
2135 TAINT_PROPER("assigning to $^O");
2136 PL_osname = savesvpv(sv);
2139 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2140 if (!PL_compiling.cop_io)
2141 PL_compiling.cop_io = newSVsv(sv);
2143 sv_setsv(PL_compiling.cop_io,sv);
2146 case '\020': /* ^P */
2147 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2148 if (PL_perldb && !PL_DBsingle)
2151 case '\024': /* ^T */
2153 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2155 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2158 case '\027': /* ^W & $^WARNING_BITS */
2159 if (*(mg->mg_ptr+1) == '\0') {
2160 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2161 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2162 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2163 | (i ? G_WARN_ON : G_WARN_OFF) ;
2166 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2167 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2168 if (!SvPOK(sv) && PL_localizing) {
2169 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2170 PL_compiling.cop_warnings = pWARN_NONE;
2175 int accumulate = 0 ;
2176 int any_fatals = 0 ;
2177 const char * const ptr = (char*)SvPV(sv, len) ;
2178 for (i = 0 ; i < len ; ++i) {
2179 accumulate |= ptr[i] ;
2180 any_fatals |= (ptr[i] & 0xAA) ;
2183 PL_compiling.cop_warnings = pWARN_NONE;
2184 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2185 PL_compiling.cop_warnings = pWARN_ALL;
2186 PL_dowarn |= G_WARN_ONCE ;
2189 if (specialWARN(PL_compiling.cop_warnings))
2190 PL_compiling.cop_warnings = newSVsv(sv) ;
2192 sv_setsv(PL_compiling.cop_warnings, sv);
2193 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2194 PL_dowarn |= G_WARN_ONCE ;
2202 if (PL_localizing) {
2203 if (PL_localizing == 1)
2204 SAVESPTR(PL_last_in_gv);
2206 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2207 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2210 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2211 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2212 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv,TRUE, SVt_PVIO);
2215 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2216 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2217 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv,TRUE, SVt_PVIO);
2220 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2223 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2224 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2225 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2228 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2232 IO *io = GvIOp(PL_defoutgv);
2235 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2236 IoFLAGS(io) &= ~IOf_FLUSH;
2238 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2239 PerlIO *ofp = IoOFP(io);
2241 (void)PerlIO_flush(ofp);
2242 IoFLAGS(io) |= IOf_FLUSH;
2248 SvREFCNT_dec(PL_rs);
2249 PL_rs = newSVsv(sv);
2253 SvREFCNT_dec(PL_ors_sv);
2254 if (SvOK(sv) || SvGMAGICAL(sv)) {
2255 PL_ors_sv = newSVsv(sv);
2263 SvREFCNT_dec(PL_ofs_sv);
2264 if (SvOK(sv) || SvGMAGICAL(sv)) {
2265 PL_ofs_sv = newSVsv(sv);
2274 PL_ofmt = savesvpv(sv);
2277 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2280 #ifdef COMPLEX_STATUS
2281 if (PL_localizing == 2) {
2282 PL_statusvalue = LvTARGOFF(sv);
2283 PL_statusvalue_vms = LvTARGLEN(sv);
2287 #ifdef VMSISH_STATUS
2289 STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
2292 STATUS_UNIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2297 # define PERL_VMS_BANG vaxc$errno
2299 # define PERL_VMS_BANG 0
2301 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2302 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2306 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2307 if (PL_delaymagic) {
2308 PL_delaymagic |= DM_RUID;
2309 break; /* don't do magic till later */
2312 (void)setruid((Uid_t)PL_uid);
2315 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2317 #ifdef HAS_SETRESUID
2318 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2320 if (PL_uid == PL_euid) { /* special case $< = $> */
2322 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2323 if (PL_uid != 0 && PerlProc_getuid() == 0)
2324 (void)PerlProc_setuid(0);
2326 (void)PerlProc_setuid(PL_uid);
2328 PL_uid = PerlProc_getuid();
2329 Perl_croak(aTHX_ "setruid() not implemented");
2334 PL_uid = PerlProc_getuid();
2335 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2338 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2339 if (PL_delaymagic) {
2340 PL_delaymagic |= DM_EUID;
2341 break; /* don't do magic till later */
2344 (void)seteuid((Uid_t)PL_euid);
2347 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2349 #ifdef HAS_SETRESUID
2350 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2352 if (PL_euid == PL_uid) /* special case $> = $< */
2353 PerlProc_setuid(PL_euid);
2355 PL_euid = PerlProc_geteuid();
2356 Perl_croak(aTHX_ "seteuid() not implemented");
2361 PL_euid = PerlProc_geteuid();
2362 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2365 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2366 if (PL_delaymagic) {
2367 PL_delaymagic |= DM_RGID;
2368 break; /* don't do magic till later */
2371 (void)setrgid((Gid_t)PL_gid);
2374 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2376 #ifdef HAS_SETRESGID
2377 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2379 if (PL_gid == PL_egid) /* special case $( = $) */
2380 (void)PerlProc_setgid(PL_gid);
2382 PL_gid = PerlProc_getgid();
2383 Perl_croak(aTHX_ "setrgid() not implemented");
2388 PL_gid = PerlProc_getgid();
2389 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2392 #ifdef HAS_SETGROUPS
2394 const char *p = SvPV(sv, len);
2395 Groups_t gary[NGROUPS];
2400 for (i = 0; i < NGROUPS; ++i) {
2401 while (*p && !isSPACE(*p))
2410 (void)setgroups(i, gary);
2412 #else /* HAS_SETGROUPS */
2413 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2414 #endif /* HAS_SETGROUPS */
2415 if (PL_delaymagic) {
2416 PL_delaymagic |= DM_EGID;
2417 break; /* don't do magic till later */
2420 (void)setegid((Gid_t)PL_egid);
2423 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2425 #ifdef HAS_SETRESGID
2426 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2428 if (PL_egid == PL_gid) /* special case $) = $( */
2429 (void)PerlProc_setgid(PL_egid);
2431 PL_egid = PerlProc_getegid();
2432 Perl_croak(aTHX_ "setegid() not implemented");
2437 PL_egid = PerlProc_getegid();
2438 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2441 PL_chopset = SvPV_force(sv,len);
2443 #ifndef MACOS_TRADITIONAL
2445 LOCK_DOLLARZERO_MUTEX;
2446 #ifdef HAS_SETPROCTITLE
2447 /* The BSDs don't show the argv[] in ps(1) output, they
2448 * show a string from the process struct and provide
2449 * the setproctitle() routine to manipulate that. */
2452 # if __FreeBSD_version > 410001
2453 /* The leading "-" removes the "perl: " prefix,
2454 * but not the "(perl) suffix from the ps(1)
2455 * output, because that's what ps(1) shows if the
2456 * argv[] is modified. */
2457 setproctitle("-%s", s);
2458 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2459 /* This doesn't really work if you assume that
2460 * $0 = 'foobar'; will wipe out 'perl' from the $0
2461 * because in ps(1) output the result will be like
2462 * sprintf("perl: %s (perl)", s)
2463 * I guess this is a security feature:
2464 * one (a user process) cannot get rid of the original name.
2466 setproctitle("%s", s);
2470 #if defined(__hpux) && defined(PSTAT_SETCMD)
2474 un.pst_command = (char *)s;
2475 pstat(PSTAT_SETCMD, un, len, 0, 0);
2478 /* PL_origalen is set in perl_parse(). */
2479 s = SvPV_force(sv,len);
2480 if (len >= (STRLEN)PL_origalen-1) {
2481 /* Longer than original, will be truncated. We assume that
2482 * PL_origalen bytes are available. */
2483 Copy(s, PL_origargv[0], PL_origalen-1, char);
2486 /* Shorter than original, will be padded. */
2487 Copy(s, PL_origargv[0], len, char);
2488 PL_origargv[0][len] = 0;
2489 memset(PL_origargv[0] + len + 1,
2490 /* Is the space counterintuitive? Yes.
2491 * (You were expecting \0?)
2492 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2495 PL_origalen - len - 1);
2497 PL_origargv[0][PL_origalen-1] = 0;
2498 for (i = 1; i < PL_origargc; i++)
2500 UNLOCK_DOLLARZERO_MUTEX;
2508 Perl_whichsig(pTHX_ const char *sig)
2510 register char* const* sigv;
2512 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
2513 if (strEQ(sig,*sigv))
2514 return PL_sig_num[sigv - (char* const*)PL_sig_name];
2516 if (strEQ(sig,"CHLD"))
2520 if (strEQ(sig,"CLD"))
2527 Perl_sighandler(int sig)
2529 #ifdef PERL_GET_SIG_CONTEXT
2530 dTHXa(PERL_GET_SIG_CONTEXT);
2537 SV *sv = Nullsv, *tSv = PL_Sv;
2543 if (PL_savestack_ix + 15 <= PL_savestack_max)
2545 if (PL_markstack_ptr < PL_markstack_max - 2)
2547 if (PL_scopestack_ix < PL_scopestack_max - 3)
2550 if (!PL_psig_ptr[sig]) {
2551 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2556 /* Max number of items pushed there is 3*n or 4. We cannot fix
2557 infinity, so we fix 4 (in fact 5): */
2559 PL_savestack_ix += 5; /* Protect save in progress. */
2560 SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
2563 PL_markstack_ptr++; /* Protect mark. */
2565 PL_scopestack_ix += 1;
2566 /* sv_2cv is too complicated, try a simpler variant first: */
2567 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2568 || SvTYPE(cv) != SVt_PVCV)
2569 cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
2571 if (!cv || !CvROOT(cv)) {
2572 if (ckWARN(WARN_SIGNAL))
2573 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2574 PL_sig_name[sig], (gv ? GvENAME(gv)
2581 if(PL_psig_name[sig]) {
2582 sv = SvREFCNT_inc(PL_psig_name[sig]);
2584 #if !defined(PERL_IMPLICIT_CONTEXT)
2588 sv = sv_newmortal();
2589 sv_setpv(sv,PL_sig_name[sig]);
2592 PUSHSTACKi(PERLSI_SIGNAL);
2597 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2600 if (SvTRUE(ERRSV)) {
2602 #ifdef HAS_SIGPROCMASK
2603 /* Handler "died", for example to get out of a restart-able read().
2604 * Before we re-do that on its behalf re-enable the signal which was
2605 * blocked by the system when we entered.
2609 sigaddset(&set,sig);
2610 sigprocmask(SIG_UNBLOCK, &set, NULL);
2612 /* Not clear if this will work */
2613 (void)rsignal(sig, SIG_IGN);
2614 (void)rsignal(sig, PL_csighandlerp);
2616 #endif /* !PERL_MICRO */
2621 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2625 PL_scopestack_ix -= 1;
2628 PL_op = myop; /* Apparently not needed... */
2630 PL_Sv = tSv; /* Restore global temporaries. */
2637 restore_magic(pTHX_ const void *p)
2639 MGS* mgs = SSPTR(PTR2IV(p), MGS*);
2640 SV* sv = mgs->mgs_sv;
2645 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2647 #ifdef PERL_COPY_ON_WRITE
2648 /* While magic was saved (and off) sv_setsv may well have seen
2649 this SV as a prime candidate for COW. */
2651 sv_force_normal(sv);
2655 SvFLAGS(sv) |= mgs->mgs_flags;
2659 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2662 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2664 /* If we're still on top of the stack, pop us off. (That condition
2665 * will be satisfied if restore_magic was called explicitly, but *not*
2666 * if it's being called via leave_scope.)
2667 * The reason for doing this is that otherwise, things like sv_2cv()
2668 * may leave alloc gunk on the savestack, and some code
2669 * (e.g. sighandler) doesn't expect that...
2671 if (PL_savestack_ix == mgs->mgs_ss_ix)
2673 I32 popval = SSPOPINT;
2674 assert(popval == SAVEt_DESTRUCTOR_X);
2675 PL_savestack_ix -= 2;
2677 assert(popval == SAVEt_ALLOC);
2679 PL_savestack_ix -= popval;
2685 unwind_handler_stack(pTHX_ const void *p)
2688 const U32 flags = *(const U32*)p;
2691 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2692 /* cxstack_ix-- Not needed, die already unwound it. */
2693 #if !defined(PERL_IMPLICIT_CONTEXT)
2695 SvREFCNT_dec(PL_sig_sv);
2701 * c-indentation-style: bsd
2703 * indent-tabs-mode: t
2706 * ex: set ts=8 sts=4 sw=4 noet: