3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 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_ void *p);
67 static void unwind_handler_stack(pTHX_ 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 MGVTBL* 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)
143 MAGIC *newmg, *head, *cur, *mg;
144 I32 mgs_ix = SSNEW(sizeof(MGS));
145 int was_temp = SvTEMP(sv);
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 MGVTBL *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 (!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)
226 mgs_ix = SSNEW(sizeof(MGS));
227 save_magic(mgs_ix, sv);
229 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
230 MGVTBL* vtbl = mg->mg_virtual;
231 nextmg = mg->mg_moremagic; /* it may delete itself */
232 if (mg->mg_flags & MGf_GSKIP) {
233 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
234 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
236 if (vtbl && vtbl->svt_set)
237 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
240 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
245 =for apidoc mg_length
247 Report on the SV's length. See C<sv_magic>.
253 Perl_mg_length(pTHX_ SV *sv)
258 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
259 MGVTBL* vtbl = mg->mg_virtual;
260 if (vtbl && vtbl->svt_len) {
263 mgs_ix = SSNEW(sizeof(MGS));
264 save_magic(mgs_ix, sv);
265 /* omit MGf_GSKIP -- not changed here */
266 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
267 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
274 U8 *s = (U8*)SvPV(sv, len);
275 len = Perl_utf8_length(aTHX_ s, s + len);
283 Perl_mg_size(pTHX_ SV *sv)
288 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
289 MGVTBL* vtbl = mg->mg_virtual;
290 if (vtbl && vtbl->svt_len) {
293 mgs_ix = SSNEW(sizeof(MGS));
294 save_magic(mgs_ix, sv);
295 /* omit MGf_GSKIP -- not changed here */
296 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
297 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
304 len = AvFILLp((AV *) sv); /* Fallback to non-tied array */
309 Perl_croak(aTHX_ "Size magic not implemented");
318 Clear something magical that the SV represents. See C<sv_magic>.
324 Perl_mg_clear(pTHX_ SV *sv)
329 mgs_ix = SSNEW(sizeof(MGS));
330 save_magic(mgs_ix, sv);
332 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
333 MGVTBL* vtbl = mg->mg_virtual;
334 /* omit GSKIP -- never set here */
336 if (vtbl && vtbl->svt_clear)
337 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
340 restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
347 Finds the magic pointer for type matching the SV. See C<sv_magic>.
353 Perl_mg_find(pTHX_ SV *sv, int type)
358 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
359 if (mg->mg_type == type)
368 Copies the magic from one SV to another. See C<sv_magic>.
374 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
378 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
379 MGVTBL* vtbl = mg->mg_virtual;
380 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
381 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
383 else if (isUPPER(mg->mg_type)) {
385 mg->mg_type == PERL_MAGIC_tied ? SvTIED_obj(sv, mg) :
386 (mg->mg_type == PERL_MAGIC_regdata && mg->mg_obj)
388 toLOWER(mg->mg_type), key, klen);
398 Free any magic storage used by the SV. See C<sv_magic>.
404 Perl_mg_free(pTHX_ SV *sv)
408 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
409 MGVTBL* vtbl = mg->mg_virtual;
410 moremagic = mg->mg_moremagic;
411 if (vtbl && vtbl->svt_free)
412 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
413 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
414 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
415 Safefree(mg->mg_ptr);
416 else if (mg->mg_len == HEf_SVKEY)
417 SvREFCNT_dec((SV*)mg->mg_ptr);
419 if (mg->mg_flags & MGf_REFCOUNTED)
420 SvREFCNT_dec(mg->mg_obj);
430 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
434 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
435 if (mg->mg_obj) /* @+ */
438 return rx->lastparen;
445 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
453 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
457 if (paren <= (I32)rx->nparens &&
458 (s = rx->startp[paren]) != -1 &&
459 (t = rx->endp[paren]) != -1)
461 if (mg->mg_obj) /* @+ */
466 if (i > 0 && RX_MATCH_UTF8(rx)) {
467 char *b = rx->subbeg;
469 i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
479 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
481 Perl_croak(aTHX_ PL_no_modify);
487 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
494 switch (*mg->mg_ptr) {
495 case '1': case '2': case '3': case '4':
496 case '5': case '6': case '7': case '8': case '9': case '&':
497 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
499 paren = atoi(mg->mg_ptr); /* $& is in [0] */
501 if (paren <= (I32)rx->nparens &&
502 (s1 = rx->startp[paren]) != -1 &&
503 (t1 = rx->endp[paren]) != -1)
507 if (i > 0 && RX_MATCH_UTF8(rx)) {
508 char *s = rx->subbeg + s1;
509 char *send = rx->subbeg + t1;
512 if (is_utf8_string((U8*)s, i))
513 i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send);
516 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
520 if (ckWARN(WARN_UNINITIALIZED))
525 if (ckWARN(WARN_UNINITIALIZED))
530 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
531 paren = rx->lastparen;
536 case '\016': /* ^N */
537 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
538 paren = rx->lastcloseparen;
544 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
545 if (rx->startp[0] != -1) {
556 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
557 if (rx->endp[0] != -1) {
558 i = rx->sublen - rx->endp[0];
569 if (!SvPOK(sv) && SvNIOK(sv)) {
579 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
582 register char *s = NULL;
586 switch (*mg->mg_ptr) {
587 case '\001': /* ^A */
588 sv_setsv(sv, PL_bodytarget);
590 case '\003': /* ^C */
591 sv_setiv(sv, (IV)PL_minus_c);
594 case '\004': /* ^D */
595 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
596 #if defined(YYDEBUG) && defined(DEBUGGING)
597 PL_yydebug = DEBUG_p_TEST;
600 case '\005': /* ^E */
601 if (*(mg->mg_ptr+1) == '\0') {
602 #ifdef MACOS_TRADITIONAL
606 sv_setnv(sv,(double)gMacPerl_OSErr);
607 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
612 # include <descrip.h>
613 # include <starlet.h>
615 $DESCRIPTOR(msgdsc,msg);
616 sv_setnv(sv,(NV) vaxc$errno);
617 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
618 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
624 if (!(_emx_env & 0x200)) { /* Under DOS */
625 sv_setnv(sv, (NV)errno);
626 sv_setpv(sv, errno ? Strerror(errno) : "");
628 if (errno != errno_isOS2) {
629 int tmp = _syserrno();
630 if (tmp) /* 2nd call to _syserrno() makes it 0 */
633 sv_setnv(sv, (NV)Perl_rc);
634 sv_setpv(sv, os2error(Perl_rc));
639 DWORD dwErr = GetLastError();
640 sv_setnv(sv, (NV)dwErr);
643 PerlProc_GetOSError(sv, dwErr);
651 int saveerrno = errno;
652 sv_setnv(sv, (NV)errno);
653 sv_setpv(sv, errno ? Strerror(errno) : "");
660 SvNOK_on(sv); /* what a wonderful hack! */
662 else if (strEQ(mg->mg_ptr+1, "NCODING"))
663 sv_setsv(sv, PL_encoding);
665 case '\006': /* ^F */
666 sv_setiv(sv, (IV)PL_maxsysfd);
668 case '\010': /* ^H */
669 sv_setiv(sv, (IV)PL_hints);
671 case '\011': /* ^I */ /* NOT \t in EBCDIC */
673 sv_setpv(sv, PL_inplace);
675 sv_setsv(sv, &PL_sv_undef);
677 case '\017': /* ^O & ^OPEN */
678 if (*(mg->mg_ptr+1) == '\0') {
679 sv_setpv(sv, PL_osname);
682 else if (strEQ(mg->mg_ptr, "\017PEN")) {
683 if (!PL_compiling.cop_io)
684 sv_setsv(sv, &PL_sv_undef);
686 sv_setsv(sv, PL_compiling.cop_io);
690 case '\020': /* ^P */
691 sv_setiv(sv, (IV)PL_perldb);
693 case '\023': /* ^S */
694 if (*(mg->mg_ptr+1) == '\0') {
695 if (PL_lex_state != LEX_NOTPARSING)
698 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
703 case '\024': /* ^T */
704 if (*(mg->mg_ptr+1) == '\0') {
706 sv_setnv(sv, PL_basetime);
708 sv_setiv(sv, (IV)PL_basetime);
711 else if (strEQ(mg->mg_ptr, "\024AINT"))
712 sv_setiv(sv, PL_tainting
713 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
716 case '\025': /* $^UNICODE */
717 if (strEQ(mg->mg_ptr, "\025NICODE"))
718 sv_setuv(sv, (UV) PL_unicode);
720 case '\027': /* ^W & $^WARNING_BITS */
721 if (*(mg->mg_ptr+1) == '\0')
722 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
723 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
724 if (PL_compiling.cop_warnings == pWARN_NONE ||
725 PL_compiling.cop_warnings == pWARN_STD)
727 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
729 else if (PL_compiling.cop_warnings == pWARN_ALL) {
730 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
733 sv_setsv(sv, PL_compiling.cop_warnings);
738 case '1': case '2': case '3': case '4':
739 case '5': case '6': case '7': case '8': case '9': case '&':
740 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
744 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
745 * XXX Does the new way break anything?
747 paren = atoi(mg->mg_ptr); /* $& is in [0] */
749 if (paren <= (I32)rx->nparens &&
750 (s1 = rx->startp[paren]) != -1 &&
751 (t1 = rx->endp[paren]) != -1)
761 if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
766 if (RX_MATCH_TAINTED(rx)) {
767 MAGIC* mg = SvMAGIC(sv);
770 SvMAGIC(sv) = mg->mg_moremagic;
772 if ((mgt = SvMAGIC(sv))) {
773 mg->mg_moremagic = mgt;
783 sv_setsv(sv,&PL_sv_undef);
786 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
787 paren = rx->lastparen;
791 sv_setsv(sv,&PL_sv_undef);
793 case '\016': /* ^N */
794 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
795 paren = rx->lastcloseparen;
799 sv_setsv(sv,&PL_sv_undef);
802 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
803 if ((s = rx->subbeg) && rx->startp[0] != -1) {
808 sv_setsv(sv,&PL_sv_undef);
811 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
812 if (rx->subbeg && rx->endp[0] != -1) {
813 s = rx->subbeg + rx->endp[0];
814 i = rx->sublen - rx->endp[0];
818 sv_setsv(sv,&PL_sv_undef);
822 if (GvIO(PL_last_in_gv)) {
823 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
829 sv_setiv(sv, (IV)STATUS_CURRENT);
830 #ifdef COMPLEX_STATUS
831 LvTARGOFF(sv) = PL_statusvalue;
832 LvTARGLEN(sv) = PL_statusvalue_vms;
837 if (GvIOp(PL_defoutgv))
838 s = IoTOP_NAME(GvIOp(PL_defoutgv));
842 sv_setpv(sv,GvENAME(PL_defoutgv));
847 if (GvIOp(PL_defoutgv))
848 s = IoFMT_NAME(GvIOp(PL_defoutgv));
850 s = GvENAME(PL_defoutgv);
855 if (GvIOp(PL_defoutgv))
856 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
859 if (GvIOp(PL_defoutgv))
860 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
863 if (GvIOp(PL_defoutgv))
864 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, PL_gid);
919 sv_setiv(sv, (IV)PL_egid);
921 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_egid);
926 Groups_t gary[NGROUPS];
927 i = getgroups(NGROUPS,gary);
929 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, gary[i]);
932 (void)SvIOK_on(sv); /* what a wonderful hack! */
936 #ifndef MACOS_TRADITIONAL
940 #ifdef USE_5005THREADS
942 sv_setsv(sv, thr->errsv);
944 #endif /* USE_5005THREADS */
950 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
952 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
954 if (uf && uf->uf_val)
955 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
960 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
970 #ifdef DYNAMIC_ENV_FETCH
971 /* We just undefd an environment var. Is a replacement */
972 /* waiting in the wings? */
975 if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
976 s = SvPV(*valp, len);
980 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
981 /* And you'll never guess what the dog had */
982 /* in its mouth... */
984 MgTAINTEDDIR_off(mg);
986 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
987 char pathbuf[256], eltbuf[256], *cp, *elt = s;
991 do { /* DCL$PATH may be a search list */
992 while (1) { /* as may dev portion of any element */
993 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
994 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
995 cando_by_name(S_IWUSR,0,elt) ) {
1000 if ((cp = strchr(elt, ':')) != Nullch)
1002 if (my_trnlnm(elt, eltbuf, j++))
1008 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1011 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1012 char *strend = s + len;
1014 while (s < strend) {
1018 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1019 s, strend, ':', &i);
1021 if (i >= sizeof tmpbuf /* too long -- assume the worst */
1023 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1024 MgTAINTEDDIR_on(mg);
1030 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1036 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1039 my_setenv(MgPV(mg,n_a),Nullch);
1044 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1047 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1049 if (PL_localizing) {
1052 magic_clear_all_env(sv,mg);
1053 hv_iterinit((HV*)sv);
1054 while ((entry = hv_iternext((HV*)sv))) {
1056 my_setenv(hv_iterkey(entry, &keylen),
1057 SvPV(hv_iterval((HV*)sv, entry), n_a));
1065 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1068 #if defined(VMS) || defined(EPOC)
1069 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1071 # if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
1074 # ifdef USE_ENVIRON_ARRAY
1075 # if defined(USE_ITHREADS)
1076 /* only the parent thread can clobber the process environment */
1077 if (PL_curinterp == aTHX)
1080 # ifndef PERL_USE_SAFE_PUTENV
1081 if (!PL_use_safe_putenv) {
1084 if (environ == PL_origenviron)
1085 environ = (char**)safesysmalloc(sizeof(char*));
1087 for (i = 0; environ[i]; i++)
1088 safesysfree(environ[i]);
1090 # endif /* PERL_USE_SAFE_PUTENV */
1092 environ[0] = Nullch;
1094 # endif /* USE_ENVIRON_ARRAY */
1095 # endif /* PERL_IMPLICIT_SYS || WIN32 */
1096 #endif /* VMS || EPOC */
1097 #endif /* !PERL_MICRO */
1101 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1102 static int sig_handlers_initted = 0;
1104 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1105 static int sig_ignoring[SIG_SIZE]; /* which signals we are ignoring */
1107 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1108 static int sig_defaulting[SIG_SIZE];
1112 #ifdef HAS_SIGPROCMASK
1114 restore_sigmask(pTHX_ SV *save_sv)
1116 sigset_t *ossetp = (sigset_t *) SvPV_nolen( save_sv );
1117 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1121 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1125 /* Are we fetching a signal entry? */
1126 i = whichsig(MgPV(mg,n_a));
1129 sv_setsv(sv,PL_psig_ptr[i]);
1131 Sighandler_t sigstate;
1132 sigstate = rsignal_state(i);
1133 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1134 if (sig_handlers_initted && sig_ignoring[i]) sigstate = SIG_IGN;
1136 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1137 if (sig_handlers_initted && sig_defaulting[i]) sigstate = SIG_DFL;
1139 /* cache state so we don't fetch it again */
1140 if(sigstate == SIG_IGN)
1141 sv_setpv(sv,"IGNORE");
1143 sv_setsv(sv,&PL_sv_undef);
1144 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1151 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1153 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1154 * refactoring might be in order.
1162 if (strEQ(s,"__DIE__"))
1164 else if (strEQ(s,"__WARN__"))
1167 Perl_croak(aTHX_ "No such hook: %s", s);
1171 SvREFCNT_dec(to_dec);
1176 /* Are we clearing a signal entry? */
1179 #ifdef HAS_SIGPROCMASK
1182 /* Avoid having the signal arrive at a bad time, if possible. */
1185 sigprocmask(SIG_BLOCK, &set, &save);
1187 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1188 SAVEFREESV(save_sv);
1189 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1192 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1193 if (!sig_handlers_initted) Perl_csighandler_init();
1195 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1196 sig_defaulting[i] = 1;
1197 (void)rsignal(i, PL_csighandlerp);
1199 (void)rsignal(i, SIG_DFL);
1201 if(PL_psig_name[i]) {
1202 SvREFCNT_dec(PL_psig_name[i]);
1205 if(PL_psig_ptr[i]) {
1206 to_dec=PL_psig_ptr[i];
1209 SvREFCNT_dec(to_dec);
1219 Perl_raise_signal(pTHX_ int sig)
1221 /* Set a flag to say this signal is pending */
1222 PL_psig_pend[sig]++;
1223 /* And one to say _a_ signal is pending */
1228 Perl_csighandler(int sig)
1230 #ifdef PERL_GET_SIG_CONTEXT
1231 dTHXa(PERL_GET_SIG_CONTEXT);
1235 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1236 (void) rsignal(sig, PL_csighandlerp);
1237 if (sig_ignoring[sig]) return;
1239 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1240 if (sig_defaulting[sig])
1241 #ifdef KILL_BY_SIGPRC
1242 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1247 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1248 /* Call the perl level handler now--
1249 * with risk we may be in malloc() etc. */
1250 (*PL_sighandlerp)(sig);
1252 Perl_raise_signal(aTHX_ sig);
1255 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1257 Perl_csighandler_init(void)
1260 if (sig_handlers_initted) return;
1262 for (sig = 1; sig < SIG_SIZE; sig++) {
1263 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1265 sig_defaulting[sig] = 1;
1266 (void) rsignal(sig, PL_csighandlerp);
1268 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1269 sig_ignoring[sig] = 0;
1272 sig_handlers_initted = 1;
1277 Perl_despatch_signals(pTHX)
1281 for (sig = 1; sig < SIG_SIZE; sig++) {
1282 if (PL_psig_pend[sig]) {
1283 PERL_BLOCKSIG_ADD(set, sig);
1284 PL_psig_pend[sig] = 0;
1285 PERL_BLOCKSIG_BLOCK(set);
1286 (*PL_sighandlerp)(sig);
1287 PERL_BLOCKSIG_UNBLOCK(set);
1293 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1298 /* Need to be careful with SvREFCNT_dec(), because that can have side
1299 * effects (due to closures). We must make sure that the new disposition
1300 * is in place before it is called.
1304 #ifdef HAS_SIGPROCMASK
1311 if (strEQ(s,"__DIE__"))
1313 else if (strEQ(s,"__WARN__"))
1316 Perl_croak(aTHX_ "No such hook: %s", s);
1324 i = whichsig(s); /* ...no, a brick */
1326 if (ckWARN(WARN_SIGNAL))
1327 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1330 #ifdef HAS_SIGPROCMASK
1331 /* Avoid having the signal arrive at a bad time, if possible. */
1334 sigprocmask(SIG_BLOCK, &set, &save);
1336 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1337 SAVEFREESV(save_sv);
1338 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1341 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1342 if (!sig_handlers_initted) Perl_csighandler_init();
1344 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1345 sig_ignoring[i] = 0;
1347 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1348 sig_defaulting[i] = 0;
1350 SvREFCNT_dec(PL_psig_name[i]);
1351 to_dec = PL_psig_ptr[i];
1352 PL_psig_ptr[i] = SvREFCNT_inc(sv);
1353 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1354 PL_psig_name[i] = newSVpvn(s, len);
1355 SvREADONLY_on(PL_psig_name[i]);
1357 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1359 (void)rsignal(i, PL_csighandlerp);
1360 #ifdef HAS_SIGPROCMASK
1365 *svp = SvREFCNT_inc(sv);
1367 SvREFCNT_dec(to_dec);
1370 s = SvPV_force(sv,len);
1371 if (strEQ(s,"IGNORE")) {
1373 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1374 sig_ignoring[i] = 1;
1375 (void)rsignal(i, PL_csighandlerp);
1377 (void)rsignal(i, SIG_IGN);
1381 else if (strEQ(s,"DEFAULT") || !*s) {
1383 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1385 sig_defaulting[i] = 1;
1386 (void)rsignal(i, PL_csighandlerp);
1389 (void)rsignal(i, SIG_DFL);
1394 * We should warn if HINT_STRICT_REFS, but without
1395 * access to a known hint bit in a known OP, we can't
1396 * tell whether HINT_STRICT_REFS is in force or not.
1398 if (!strchr(s,':') && !strchr(s,'\''))
1399 sv_insert(sv, 0, 0, "main::", 6);
1401 (void)rsignal(i, PL_csighandlerp);
1403 *svp = SvREFCNT_inc(sv);
1405 #ifdef HAS_SIGPROCMASK
1410 SvREFCNT_dec(to_dec);
1413 #endif /* !PERL_MICRO */
1416 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1418 PL_sub_generation++;
1423 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1425 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1426 PL_amagic_generation++;
1432 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1434 HV *hv = (HV*)LvTARG(sv);
1438 (void) hv_iterinit(hv);
1439 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1442 while (hv_iternext(hv))
1447 sv_setiv(sv, (IV)i);
1452 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1455 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1460 /* caller is responsible for stack switching/cleanup */
1462 S_magic_methcall(pTHX_ SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
1468 PUSHs(SvTIED_obj(sv, mg));
1471 if (mg->mg_len >= 0)
1472 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1473 else if (mg->mg_len == HEf_SVKEY)
1474 PUSHs((SV*)mg->mg_ptr);
1476 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1477 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1485 return call_method(meth, flags);
1489 S_magic_methpack(pTHX_ SV *sv, MAGIC *mg, char *meth)
1495 PUSHSTACKi(PERLSI_MAGIC);
1497 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1498 sv_setsv(sv, *PL_stack_sp--);
1508 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1511 mg->mg_flags |= MGf_GSKIP;
1512 magic_methpack(sv,mg,"FETCH");
1517 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1521 PUSHSTACKi(PERLSI_MAGIC);
1522 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1529 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1531 return magic_methpack(sv,mg,"DELETE");
1536 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1543 PUSHSTACKi(PERLSI_MAGIC);
1544 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1545 sv = *PL_stack_sp--;
1546 retval = (U32) SvIV(sv)-1;
1555 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1560 PUSHSTACKi(PERLSI_MAGIC);
1562 XPUSHs(SvTIED_obj(sv, mg));
1564 call_method("CLEAR", G_SCALAR|G_DISCARD);
1572 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1575 const char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1579 PUSHSTACKi(PERLSI_MAGIC);
1582 PUSHs(SvTIED_obj(sv, mg));
1587 if (call_method(meth, G_SCALAR))
1588 sv_setsv(key, *PL_stack_sp--);
1597 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1599 return magic_methpack(sv,mg,"EXISTS");
1603 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1606 SV *retval = &PL_sv_undef;
1607 SV *tied = SvTIED_obj((SV*)hv, mg);
1608 HV *pkg = SvSTASH((SV*)SvRV(tied));
1610 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1613 /* we are in an iteration so the hash cannot be empty */
1615 /* no xhv_eiter so now use FIRSTKEY */
1616 key = sv_newmortal();
1617 magic_nextpack((SV*)hv, mg, key);
1618 HvEITER(hv) = NULL; /* need to reset iterator */
1619 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1622 /* there is a SCALAR method that we can call */
1624 PUSHSTACKi(PERLSI_MAGIC);
1630 if (call_method("SCALAR", G_SCALAR))
1631 retval = *PL_stack_sp--;
1638 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1648 svp = av_fetch(GvAV(gv),
1649 atoi(MgPV(mg,n_a)), FALSE);
1650 if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp)))) {
1651 /* set or clear breakpoint in the relevant control op */
1653 o->op_flags |= OPf_SPECIAL;
1655 o->op_flags &= ~OPf_SPECIAL;
1661 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1663 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
1668 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1670 av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
1675 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1677 SV* lsv = LvTARG(sv);
1679 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1680 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1681 if (mg && mg->mg_len >= 0) {
1684 sv_pos_b2u(lsv, &i);
1685 sv_setiv(sv, i + PL_curcop->cop_arybase);
1694 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1696 SV* lsv = LvTARG(sv);
1703 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1704 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1708 sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1709 mg = mg_find(lsv, PERL_MAGIC_regex_global);
1711 else if (!SvOK(sv)) {
1715 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1717 pos = SvIV(sv) - PL_curcop->cop_arybase;
1720 ulen = sv_len_utf8(lsv);
1730 else if (pos > (SSize_t)len)
1735 sv_pos_u2b(lsv, &p, 0);
1740 mg->mg_flags &= ~MGf_MINMATCH;
1746 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1748 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1750 gv_efullname3(sv,((GV*)sv), "*");
1754 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
1759 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1768 if (*s == '*' && s[1])
1770 gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1775 GvGP(sv) = gp_ref(GvGP(gv));
1780 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1783 SV *lsv = LvTARG(sv);
1784 char *tmps = SvPV(lsv,len);
1785 I32 offs = LvTARGOFF(sv);
1786 I32 rem = LvTARGLEN(sv);
1789 sv_pos_u2b(lsv, &offs, &rem);
1790 if (offs > (I32)len)
1792 if (rem + offs > (I32)len)
1794 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1801 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1804 char *tmps = SvPV(sv, len);
1805 SV *lsv = LvTARG(sv);
1806 I32 lvoff = LvTARGOFF(sv);
1807 I32 lvlen = LvTARGLEN(sv);
1810 sv_utf8_upgrade(lsv);
1811 sv_pos_u2b(lsv, &lvoff, &lvlen);
1812 sv_insert(lsv, lvoff, lvlen, tmps, len);
1815 else if (lsv && SvUTF8(lsv)) {
1816 sv_pos_u2b(lsv, &lvoff, &lvlen);
1817 tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1818 sv_insert(lsv, lvoff, lvlen, tmps, len);
1822 sv_insert(lsv, lvoff, lvlen, tmps, len);
1828 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1830 TAINT_IF((mg->mg_len & 1) ||
1831 ((mg->mg_len & 2) && mg->mg_obj == sv)); /* kludge */
1836 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1838 if (PL_localizing) {
1839 if (PL_localizing == 1)
1844 else if (PL_tainted)
1852 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1854 SV *lsv = LvTARG(sv);
1861 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1866 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1868 do_vecset(sv); /* XXX slurp this routine */
1873 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1876 if (LvTARGLEN(sv)) {
1878 SV *ahv = LvTARG(sv);
1879 if (SvTYPE(ahv) == SVt_PVHV) {
1880 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1885 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, FALSE, 0);
1891 AV* av = (AV*)LvTARG(sv);
1892 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1893 targ = AvARRAY(av)[LvTARGOFF(sv)];
1895 if (targ && targ != &PL_sv_undef) {
1896 /* somebody else defined it for us */
1897 SvREFCNT_dec(LvTARG(sv));
1898 LvTARG(sv) = SvREFCNT_inc(targ);
1900 SvREFCNT_dec(mg->mg_obj);
1901 mg->mg_obj = Nullsv;
1902 mg->mg_flags &= ~MGf_REFCOUNTED;
1907 sv_setsv(sv, targ ? targ : &PL_sv_undef);
1912 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1917 sv_setsv(LvTARG(sv), sv);
1918 SvSETMAGIC(LvTARG(sv));
1924 Perl_vivify_defelem(pTHX_ SV *sv)
1929 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1932 SV *ahv = LvTARG(sv);
1934 if (SvTYPE(ahv) == SVt_PVHV) {
1935 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1940 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, TRUE, 0);
1944 if (!value || value == &PL_sv_undef)
1945 Perl_croak(aTHX_ PL_no_helem, SvPV(mg->mg_obj, n_a));
1948 AV* av = (AV*)LvTARG(sv);
1949 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1950 LvTARG(sv) = Nullsv; /* array can't be extended */
1952 SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1953 if (!svp || (value = *svp) == &PL_sv_undef)
1954 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
1957 (void)SvREFCNT_inc(value);
1958 SvREFCNT_dec(LvTARG(sv));
1961 SvREFCNT_dec(mg->mg_obj);
1962 mg->mg_obj = Nullsv;
1963 mg->mg_flags &= ~MGf_REFCOUNTED;
1967 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
1969 AV *av = (AV*)mg->mg_obj;
1970 SV **svp = AvARRAY(av);
1971 I32 i = AvFILLp(av);
1974 if (!SvWEAKREF(svp[i]))
1975 Perl_croak(aTHX_ "panic: magic_killbackrefs");
1976 /* XXX Should we check that it hasn't changed? */
1979 SvWEAKREF_off(svp[i]);
1984 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
1989 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
1997 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
1999 sv_unmagic(sv, PERL_MAGIC_bm);
2005 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2007 sv_unmagic(sv, PERL_MAGIC_fm);
2013 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2015 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
2017 if (uf && uf->uf_set)
2018 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2023 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2025 sv_unmagic(sv, PERL_MAGIC_qr);
2030 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2032 regexp *re = (regexp *)mg->mg_obj;
2037 #ifdef USE_LOCALE_COLLATE
2039 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2042 * RenE<eacute> Descartes said "I think not."
2043 * and vanished with a faint plop.
2046 Safefree(mg->mg_ptr);
2052 #endif /* USE_LOCALE_COLLATE */
2054 /* Just clear the UTF-8 cache data. */
2056 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2058 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2060 mg->mg_len = -1; /* The mg_len holds the len cache. */
2065 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2070 switch (*mg->mg_ptr) {
2071 case '\001': /* ^A */
2072 sv_setsv(PL_bodytarget, sv);
2074 case '\003': /* ^C */
2075 PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2078 case '\004': /* ^D */
2081 PL_debug = get_debug_opts_flags(&s, 0) | DEBUG_TOP_FLAG;
2082 DEBUG_x(dump_all());
2084 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
2087 case '\005': /* ^E */
2088 if (*(mg->mg_ptr+1) == '\0') {
2089 #ifdef MACOS_TRADITIONAL
2090 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2093 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2096 SetLastError( SvIV(sv) );
2099 os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2101 /* will anyone ever use this? */
2102 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2108 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2110 SvREFCNT_dec(PL_encoding);
2111 if (SvOK(sv) || SvGMAGICAL(sv)) {
2112 PL_encoding = newSVsv(sv);
2115 PL_encoding = Nullsv;
2119 case '\006': /* ^F */
2120 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2122 case '\010': /* ^H */
2123 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2125 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2127 Safefree(PL_inplace);
2129 PL_inplace = savepv(SvPV(sv,len));
2131 PL_inplace = Nullch;
2133 case '\017': /* ^O */
2134 if (*(mg->mg_ptr+1) == '\0') {
2136 Safefree(PL_osname);
2140 TAINT_PROPER("assigning to $^O");
2141 PL_osname = savepv(SvPV(sv,len));
2144 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2145 if (!PL_compiling.cop_io)
2146 PL_compiling.cop_io = newSVsv(sv);
2148 sv_setsv(PL_compiling.cop_io,sv);
2151 case '\020': /* ^P */
2152 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2153 if ((PERLDB_SUB || PERLDB_LINE || PERLDB_SUBLINE)
2157 case '\024': /* ^T */
2159 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2161 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2164 case '\027': /* ^W & $^WARNING_BITS */
2165 if (*(mg->mg_ptr+1) == '\0') {
2166 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2167 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2168 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2169 | (i ? G_WARN_ON : G_WARN_OFF) ;
2172 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2173 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2174 if (!SvPOK(sv) && PL_localizing) {
2175 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2176 PL_compiling.cop_warnings = pWARN_NONE;
2181 int accumulate = 0 ;
2182 int any_fatals = 0 ;
2183 char * ptr = (char*)SvPV(sv, len) ;
2184 for (i = 0 ; i < len ; ++i) {
2185 accumulate |= ptr[i] ;
2186 any_fatals |= (ptr[i] & 0xAA) ;
2189 PL_compiling.cop_warnings = pWARN_NONE;
2190 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2191 PL_compiling.cop_warnings = pWARN_ALL;
2192 PL_dowarn |= G_WARN_ONCE ;
2195 if (specialWARN(PL_compiling.cop_warnings))
2196 PL_compiling.cop_warnings = newSVsv(sv) ;
2198 sv_setsv(PL_compiling.cop_warnings, sv);
2199 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2200 PL_dowarn |= G_WARN_ONCE ;
2208 if (PL_localizing) {
2209 if (PL_localizing == 1)
2210 SAVESPTR(PL_last_in_gv);
2212 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2213 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2216 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2217 IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
2218 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
2221 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2222 IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
2223 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
2226 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2229 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2230 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2231 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2234 IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2238 IO *io = GvIOp(PL_defoutgv);
2241 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2242 IoFLAGS(io) &= ~IOf_FLUSH;
2244 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2245 PerlIO *ofp = IoOFP(io);
2247 (void)PerlIO_flush(ofp);
2248 IoFLAGS(io) |= IOf_FLUSH;
2254 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2255 PL_multiline = (i != 0);
2258 SvREFCNT_dec(PL_rs);
2259 PL_rs = newSVsv(sv);
2263 SvREFCNT_dec(PL_ors_sv);
2264 if (SvOK(sv) || SvGMAGICAL(sv)) {
2265 PL_ors_sv = newSVsv(sv);
2273 SvREFCNT_dec(PL_ofs_sv);
2274 if (SvOK(sv) || SvGMAGICAL(sv)) {
2275 PL_ofs_sv = newSVsv(sv);
2284 PL_ofmt = savepv(SvPV(sv,len));
2287 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2290 #ifdef COMPLEX_STATUS
2291 if (PL_localizing == 2) {
2292 PL_statusvalue = LvTARGOFF(sv);
2293 PL_statusvalue_vms = LvTARGLEN(sv);
2297 #ifdef VMSISH_STATUS
2299 STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
2302 STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2307 # define PERL_VMS_BANG vaxc$errno
2309 # define PERL_VMS_BANG 0
2311 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2312 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2316 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2317 if (PL_delaymagic) {
2318 PL_delaymagic |= DM_RUID;
2319 break; /* don't do magic till later */
2322 (void)setruid((Uid_t)PL_uid);
2325 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2327 #ifdef HAS_SETRESUID
2328 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2330 if (PL_uid == PL_euid) { /* special case $< = $> */
2332 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2333 if (PL_uid != 0 && PerlProc_getuid() == 0)
2334 (void)PerlProc_setuid(0);
2336 (void)PerlProc_setuid(PL_uid);
2338 PL_uid = PerlProc_getuid();
2339 Perl_croak(aTHX_ "setruid() not implemented");
2344 PL_uid = PerlProc_getuid();
2345 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2348 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2349 if (PL_delaymagic) {
2350 PL_delaymagic |= DM_EUID;
2351 break; /* don't do magic till later */
2354 (void)seteuid((Uid_t)PL_euid);
2357 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2359 #ifdef HAS_SETRESUID
2360 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2362 if (PL_euid == PL_uid) /* special case $> = $< */
2363 PerlProc_setuid(PL_euid);
2365 PL_euid = PerlProc_geteuid();
2366 Perl_croak(aTHX_ "seteuid() not implemented");
2371 PL_euid = PerlProc_geteuid();
2372 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2375 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2376 if (PL_delaymagic) {
2377 PL_delaymagic |= DM_RGID;
2378 break; /* don't do magic till later */
2381 (void)setrgid((Gid_t)PL_gid);
2384 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2386 #ifdef HAS_SETRESGID
2387 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2389 if (PL_gid == PL_egid) /* special case $( = $) */
2390 (void)PerlProc_setgid(PL_gid);
2392 PL_gid = PerlProc_getgid();
2393 Perl_croak(aTHX_ "setrgid() not implemented");
2398 PL_gid = PerlProc_getgid();
2399 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2402 #ifdef HAS_SETGROUPS
2404 char *p = SvPV(sv, len);
2405 Groups_t gary[NGROUPS];
2410 for (i = 0; i < NGROUPS; ++i) {
2411 while (*p && !isSPACE(*p))
2420 (void)setgroups(i, gary);
2422 #else /* HAS_SETGROUPS */
2423 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2424 #endif /* HAS_SETGROUPS */
2425 if (PL_delaymagic) {
2426 PL_delaymagic |= DM_EGID;
2427 break; /* don't do magic till later */
2430 (void)setegid((Gid_t)PL_egid);
2433 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2435 #ifdef HAS_SETRESGID
2436 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2438 if (PL_egid == PL_gid) /* special case $) = $( */
2439 (void)PerlProc_setgid(PL_egid);
2441 PL_egid = PerlProc_getegid();
2442 Perl_croak(aTHX_ "setegid() not implemented");
2447 PL_egid = PerlProc_getegid();
2448 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2451 PL_chopset = SvPV_force(sv,len);
2453 #ifndef MACOS_TRADITIONAL
2455 LOCK_DOLLARZERO_MUTEX;
2456 #ifdef HAS_SETPROCTITLE
2457 /* The BSDs don't show the argv[] in ps(1) output, they
2458 * show a string from the process struct and provide
2459 * the setproctitle() routine to manipulate that. */
2462 # if __FreeBSD_version > 410001
2463 /* The leading "-" removes the "perl: " prefix,
2464 * but not the "(perl) suffix from the ps(1)
2465 * output, because that's what ps(1) shows if the
2466 * argv[] is modified. */
2467 setproctitle("-%s", s);
2468 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2469 /* This doesn't really work if you assume that
2470 * $0 = 'foobar'; will wipe out 'perl' from the $0
2471 * because in ps(1) output the result will be like
2472 * sprintf("perl: %s (perl)", s)
2473 * I guess this is a security feature:
2474 * one (a user process) cannot get rid of the original name.
2476 setproctitle("%s", s);
2480 #if defined(__hpux) && defined(PSTAT_SETCMD)
2485 pstat(PSTAT_SETCMD, un, len, 0, 0);
2488 /* PL_origalen is set in perl_parse(). */
2489 s = SvPV_force(sv,len);
2490 if (len >= (STRLEN)PL_origalen) {
2491 /* Longer than original, will be truncated. */
2492 Copy(s, PL_origargv[0], PL_origalen, char);
2493 PL_origargv[0][PL_origalen - 1] = 0;
2496 /* Shorter than original, will be padded. */
2497 Copy(s, PL_origargv[0], len, char);
2498 PL_origargv[0][len] = 0;
2499 memset(PL_origargv[0] + len + 1,
2500 /* Is the space counterintuitive? Yes.
2501 * (You were expecting \0?)
2502 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2505 PL_origalen - len - 1);
2506 for (i = 1; i < PL_origargc; i++)
2509 UNLOCK_DOLLARZERO_MUTEX;
2512 #ifdef USE_5005THREADS
2514 sv_setsv(thr->errsv, sv);
2516 #endif /* USE_5005THREADS */
2521 #ifdef USE_5005THREADS
2523 Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg)
2525 DEBUG_S(PerlIO_printf(Perl_debug_log,
2526 "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n",
2527 PTR2UV(thr), PTR2UV(sv)));
2529 Perl_croak(aTHX_ "panic: magic_mutexfree");
2530 MUTEX_DESTROY(MgMUTEXP(mg));
2531 COND_DESTROY(MgCONDP(mg));
2534 #endif /* USE_5005THREADS */
2537 Perl_whichsig(pTHX_ char *sig)
2539 register char **sigv;
2541 for (sigv = PL_sig_name; *sigv; sigv++)
2542 if (strEQ(sig,*sigv))
2543 return PL_sig_num[sigv - PL_sig_name];
2545 if (strEQ(sig,"CHLD"))
2549 if (strEQ(sig,"CLD"))
2555 #if !defined(PERL_IMPLICIT_CONTEXT)
2560 Perl_sighandler(int sig)
2562 #ifdef PERL_GET_SIG_CONTEXT
2563 dTHXa(PERL_GET_SIG_CONTEXT);
2570 SV *sv = Nullsv, *tSv = PL_Sv;
2576 if (PL_savestack_ix + 15 <= PL_savestack_max)
2578 if (PL_markstack_ptr < PL_markstack_max - 2)
2580 if (PL_retstack_ix < PL_retstack_max - 2)
2582 if (PL_scopestack_ix < PL_scopestack_max - 3)
2585 if (!PL_psig_ptr[sig]) {
2586 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2591 /* Max number of items pushed there is 3*n or 4. We cannot fix
2592 infinity, so we fix 4 (in fact 5): */
2594 PL_savestack_ix += 5; /* Protect save in progress. */
2595 SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
2598 PL_markstack_ptr++; /* Protect mark. */
2601 PL_retstack[PL_retstack_ix] = NULL;
2604 PL_scopestack_ix += 1;
2605 /* sv_2cv is too complicated, try a simpler variant first: */
2606 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2607 || SvTYPE(cv) != SVt_PVCV)
2608 cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
2610 if (!cv || !CvROOT(cv)) {
2611 if (ckWARN(WARN_SIGNAL))
2612 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2613 PL_sig_name[sig], (gv ? GvENAME(gv)
2620 if(PL_psig_name[sig]) {
2621 sv = SvREFCNT_inc(PL_psig_name[sig]);
2623 #if !defined(PERL_IMPLICIT_CONTEXT)
2627 sv = sv_newmortal();
2628 sv_setpv(sv,PL_sig_name[sig]);
2631 PUSHSTACKi(PERLSI_SIGNAL);
2636 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2639 if (SvTRUE(ERRSV)) {
2641 #ifdef HAS_SIGPROCMASK
2642 /* Handler "died", for example to get out of a restart-able read().
2643 * Before we re-do that on its behalf re-enable the signal which was
2644 * blocked by the system when we entered.
2648 sigaddset(&set,sig);
2649 sigprocmask(SIG_UNBLOCK, &set, NULL);
2651 /* Not clear if this will work */
2652 (void)rsignal(sig, SIG_IGN);
2653 (void)rsignal(sig, PL_csighandlerp);
2655 #endif /* !PERL_MICRO */
2656 Perl_die(aTHX_ Nullformat);
2660 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2666 PL_scopestack_ix -= 1;
2669 PL_op = myop; /* Apparently not needed... */
2671 PL_Sv = tSv; /* Restore global temporaries. */
2678 restore_magic(pTHX_ void *p)
2680 MGS* mgs = SSPTR(PTR2IV(p), MGS*);
2681 SV* sv = mgs->mgs_sv;
2686 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2689 SvFLAGS(sv) |= mgs->mgs_flags;
2693 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2696 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2698 /* If we're still on top of the stack, pop us off. (That condition
2699 * will be satisfied if restore_magic was called explicitly, but *not*
2700 * if it's being called via leave_scope.)
2701 * The reason for doing this is that otherwise, things like sv_2cv()
2702 * may leave alloc gunk on the savestack, and some code
2703 * (e.g. sighandler) doesn't expect that...
2705 if (PL_savestack_ix == mgs->mgs_ss_ix)
2707 I32 popval = SSPOPINT;
2708 assert(popval == SAVEt_DESTRUCTOR_X);
2709 PL_savestack_ix -= 2;
2711 assert(popval == SAVEt_ALLOC);
2713 PL_savestack_ix -= popval;
2719 unwind_handler_stack(pTHX_ void *p)
2721 U32 flags = *(U32*)p;
2724 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2725 /* cxstack_ix-- Not needed, die already unwound it. */
2726 #if !defined(PERL_IMPLICIT_CONTEXT)
2728 SvREFCNT_dec(sig_sv);