3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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.
15 * [p.363 of _The Lord of the Rings_, II/vii: "The Mirror of Galadriel"]
19 =head1 Magical Functions
21 "Magic" is special data attached to SV structures in order to give them
22 "magical" properties. When any Perl code tries to read from, or assign to,
23 an SV marked as magical, it calls the 'get' or 'set' function associated
24 with that SV's magic. A get is called prior to reading an SV, in order to
25 give it a chance to update its internal value (get on $. writes the line
26 number of the last read filehandle into to the SV's IV slot), while
27 set is called after an SV has been written to, in order to allow it to make
28 use of its changed value (set on $/ copies the SV's new value to the
29 PL_rs global variable).
31 Magic is implemented as a linked list of MAGIC structures attached to the
32 SV. Each MAGIC struct holds the type of the magic, a pointer to an array
33 of functions that implement the get(), set(), length() etc functions,
34 plus space for some flags and pointers. For example, a tied variable has
35 a MAGIC structure that contains a pointer to the object associated with the
44 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
50 #if defined(HAS_SETGROUPS)
57 # include <sys/pstat.h>
60 #ifdef HAS_PRCTL_SET_NAME
61 # include <sys/prctl.h>
64 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
65 Signal_t Perl_csighandler(int sig, siginfo_t *, void *);
67 Signal_t Perl_csighandler(int sig);
71 /* Missing protos on LynxOS */
72 void setruid(uid_t id);
73 void seteuid(uid_t id);
74 void setrgid(uid_t id);
75 void setegid(uid_t id);
79 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
88 /* MGS is typedef'ed to struct magic_state in perl.h */
91 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
96 PERL_ARGS_ASSERT_SAVE_MAGIC;
98 assert(SvMAGICAL(sv));
99 /* Turning READONLY off for a copy-on-write scalar (including shared
100 hash keys) is a bad idea. */
102 sv_force_normal_flags(sv, 0);
104 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
106 mgs = SSPTR(mgs_ix, MGS*);
108 mgs->mgs_magical = SvMAGICAL(sv);
109 mgs->mgs_readonly = SvREADONLY(sv) != 0;
110 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
114 if (!(SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK))) {
115 /* No public flags are set, so promote any private flags to public. */
116 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
121 =for apidoc mg_magical
123 Turns on the magical status of an SV. See C<sv_magic>.
129 Perl_mg_magical(pTHX_ SV *sv)
132 PERL_ARGS_ASSERT_MG_MAGICAL;
136 if ((mg = SvMAGIC(sv))) {
138 const MGVTBL* const vtbl = mg->mg_virtual;
140 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
147 } while ((mg = mg->mg_moremagic));
148 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)))
154 /* is this container magic (%ENV, $1 etc), or value magic (pos, taint etc)? */
157 S_is_container_magic(const MAGIC *mg)
160 switch (mg->mg_type) {
163 case PERL_MAGIC_regex_global:
164 case PERL_MAGIC_nkeys:
165 #ifdef USE_LOCALE_COLLATE
166 case PERL_MAGIC_collxfrm:
169 case PERL_MAGIC_taint:
171 case PERL_MAGIC_vstring:
172 case PERL_MAGIC_utf8:
173 case PERL_MAGIC_substr:
174 case PERL_MAGIC_defelem:
175 case PERL_MAGIC_arylen:
177 case PERL_MAGIC_backref:
178 case PERL_MAGIC_arylen_p:
179 case PERL_MAGIC_rhash:
180 case PERL_MAGIC_symtab:
181 case PERL_MAGIC_tied: /* treat as value, so 'local @tied' isn't tied */
182 case PERL_MAGIC_checkcall:
192 Do magic after a value is retrieved from the SV. See C<sv_magic>.
198 Perl_mg_get(pTHX_ SV *sv)
201 const I32 mgs_ix = SSNEW(sizeof(MGS));
202 const bool was_temp = cBOOL(SvTEMP(sv));
204 MAGIC *newmg, *head, *cur, *mg;
205 /* guard against sv having being freed midway by holding a private
208 PERL_ARGS_ASSERT_MG_GET;
210 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
211 cause the SV's buffer to get stolen (and maybe other stuff).
214 sv_2mortal(SvREFCNT_inc_simple_NN(sv));
219 save_magic(mgs_ix, sv);
221 /* We must call svt_get(sv, mg) for each valid entry in the linked
222 list of magic. svt_get() may delete the current entry, add new
223 magic to the head of the list, or upgrade the SV. AMS 20010810 */
225 newmg = cur = head = mg = SvMAGIC(sv);
227 const MGVTBL * const vtbl = mg->mg_virtual;
228 MAGIC * const nextmg = mg->mg_moremagic; /* it may delete itself */
230 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
231 vtbl->svt_get(aTHX_ sv, mg);
233 /* guard against magic having been deleted - eg FETCH calling
236 (SSPTR(mgs_ix, MGS *))->mgs_magical = 0; /* recalculate flags */
240 /* recalculate flags if this entry was deleted. */
241 if (mg->mg_flags & MGf_GSKIP)
242 (SSPTR(mgs_ix, MGS *))->mgs_magical = 0;
248 /* Have we finished with the new entries we saw? Start again
249 where we left off (unless there are more new entries). */
257 /* Were any new entries added? */
258 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
262 (SSPTR(mgs_ix, MGS *))->mgs_magical = 0; /* recalculate flags */
266 restore_magic(INT2PTR(void *, (IV)mgs_ix));
268 if (SvREFCNT(sv) == 1) {
269 /* We hold the last reference to this SV, which implies that the
270 SV was deleted as a side effect of the routines we called. */
279 Do magic after a value is assigned to the SV. See C<sv_magic>.
285 Perl_mg_set(pTHX_ SV *sv)
288 const I32 mgs_ix = SSNEW(sizeof(MGS));
292 PERL_ARGS_ASSERT_MG_SET;
294 save_magic(mgs_ix, sv);
296 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
297 const MGVTBL* vtbl = mg->mg_virtual;
298 nextmg = mg->mg_moremagic; /* it may delete itself */
299 if (mg->mg_flags & MGf_GSKIP) {
300 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
301 (SSPTR(mgs_ix, MGS*))->mgs_magical = 0;
303 if (PL_localizing == 2 && !S_is_container_magic(mg))
305 if (vtbl && vtbl->svt_set)
306 vtbl->svt_set(aTHX_ sv, mg);
309 restore_magic(INT2PTR(void*, (IV)mgs_ix));
314 =for apidoc mg_length
316 Report on the SV's length. See C<sv_magic>.
322 Perl_mg_length(pTHX_ SV *sv)
328 PERL_ARGS_ASSERT_MG_LENGTH;
330 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
331 const MGVTBL * const vtbl = mg->mg_virtual;
332 if (vtbl && vtbl->svt_len) {
333 const I32 mgs_ix = SSNEW(sizeof(MGS));
334 save_magic(mgs_ix, sv);
335 /* omit MGf_GSKIP -- not changed here */
336 len = vtbl->svt_len(aTHX_ sv, mg);
337 restore_magic(INT2PTR(void*, (IV)mgs_ix));
343 /* You can't know whether it's UTF-8 until you get the string again...
345 const U8 *s = (U8*)SvPV_const(sv, len);
348 len = utf8_length(s, s + len);
355 Perl_mg_size(pTHX_ SV *sv)
359 PERL_ARGS_ASSERT_MG_SIZE;
361 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
362 const MGVTBL* const vtbl = mg->mg_virtual;
363 if (vtbl && vtbl->svt_len) {
364 const I32 mgs_ix = SSNEW(sizeof(MGS));
366 save_magic(mgs_ix, sv);
367 /* omit MGf_GSKIP -- not changed here */
368 len = vtbl->svt_len(aTHX_ sv, mg);
369 restore_magic(INT2PTR(void*, (IV)mgs_ix));
376 return AvFILLp((const AV *) sv); /* Fallback to non-tied array */
380 Perl_croak(aTHX_ "Size magic not implemented");
389 Clear something magical that the SV represents. See C<sv_magic>.
395 Perl_mg_clear(pTHX_ SV *sv)
397 const I32 mgs_ix = SSNEW(sizeof(MGS));
401 PERL_ARGS_ASSERT_MG_CLEAR;
403 save_magic(mgs_ix, sv);
405 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
406 const MGVTBL* const vtbl = mg->mg_virtual;
407 /* omit GSKIP -- never set here */
409 nextmg = mg->mg_moremagic; /* it may delete itself */
411 if (vtbl && vtbl->svt_clear)
412 vtbl->svt_clear(aTHX_ sv, mg);
415 restore_magic(INT2PTR(void*, (IV)mgs_ix));
422 Finds the magic pointer for type matching the SV. See C<sv_magic>.
428 Perl_mg_find(pTHX_ const SV *sv, int type)
433 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
434 if (mg->mg_type == type)
444 Copies the magic from one SV to another. See C<sv_magic>.
450 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
455 PERL_ARGS_ASSERT_MG_COPY;
457 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
458 const MGVTBL* const vtbl = mg->mg_virtual;
459 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
460 count += vtbl->svt_copy(aTHX_ sv, mg, nsv, key, klen);
463 const char type = mg->mg_type;
464 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
466 (type == PERL_MAGIC_tied)
468 : (type == PERL_MAGIC_regdata && mg->mg_obj)
471 toLOWER(type), key, klen);
480 =for apidoc mg_localize
482 Copy some of the magic from an existing SV to new localized version of that
483 SV. Container magic (eg %ENV, $1, tie) gets copied, value magic doesn't (eg
486 If setmagic is false then no set magic will be called on the new (empty) SV.
487 This typically means that assignment will soon follow (e.g. 'local $x = $y'),
488 and that will handle the magic.
494 Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic)
499 PERL_ARGS_ASSERT_MG_LOCALIZE;
501 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
502 const MGVTBL* const vtbl = mg->mg_virtual;
503 if (!S_is_container_magic(mg))
506 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
507 (void)vtbl->svt_local(aTHX_ nsv, mg);
509 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
510 mg->mg_ptr, mg->mg_len);
512 /* container types should remain read-only across localization */
513 SvFLAGS(nsv) |= SvREADONLY(sv);
516 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
517 SvFLAGS(nsv) |= SvMAGICAL(sv);
526 #define mg_free_struct(sv, mg) S_mg_free_struct(aTHX_ sv, mg)
528 S_mg_free_struct(pTHX_ SV *sv, MAGIC *mg)
530 const MGVTBL* const vtbl = mg->mg_virtual;
531 if (vtbl && vtbl->svt_free)
532 vtbl->svt_free(aTHX_ sv, mg);
533 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
534 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
535 Safefree(mg->mg_ptr);
536 else if (mg->mg_len == HEf_SVKEY)
537 SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
539 if (mg->mg_flags & MGf_REFCOUNTED)
540 SvREFCNT_dec(mg->mg_obj);
547 Free any magic storage used by the SV. See C<sv_magic>.
553 Perl_mg_free(pTHX_ SV *sv)
558 PERL_ARGS_ASSERT_MG_FREE;
560 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
561 moremagic = mg->mg_moremagic;
562 mg_free_struct(sv, mg);
563 SvMAGIC_set(sv, moremagic);
565 SvMAGIC_set(sv, NULL);
571 =for apidoc Am|void|mg_free_type|SV *sv|int how
573 Remove any magic of type I<how> from the SV I<sv>. See L</sv_magic>.
579 Perl_mg_free_type(pTHX_ SV *sv, int how)
581 MAGIC *mg, *prevmg, *moremg;
582 PERL_ARGS_ASSERT_MG_FREE_TYPE;
583 for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
585 moremg = mg->mg_moremagic;
586 if (mg->mg_type == how) {
587 /* temporarily move to the head of the magic chain, in case
588 custom free code relies on this historical aspect of mg_free */
590 prevmg->mg_moremagic = moremg;
591 mg->mg_moremagic = SvMAGIC(sv);
594 newhead = mg->mg_moremagic;
595 mg_free_struct(sv, mg);
596 SvMAGIC_set(sv, newhead);
606 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
611 PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT;
614 register const REGEXP * const rx = PM_GETRE(PL_curpm);
616 if (mg->mg_obj) { /* @+ */
617 /* return the number possible */
618 return RX_NPARENS(rx);
620 I32 paren = RX_LASTPAREN(rx);
622 /* return the last filled */
624 && (RX_OFFS(rx)[paren].start == -1
625 || RX_OFFS(rx)[paren].end == -1) )
636 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
640 PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET;
643 register const REGEXP * const rx = PM_GETRE(PL_curpm);
645 register const I32 paren = mg->mg_len;
650 if (paren <= (I32)RX_NPARENS(rx) &&
651 (s = RX_OFFS(rx)[paren].start) != -1 &&
652 (t = RX_OFFS(rx)[paren].end) != -1)
655 if (mg->mg_obj) /* @+ */
660 if (i > 0 && RX_MATCH_UTF8(rx)) {
661 const char * const b = RX_SUBBEG(rx);
663 i = utf8_length((U8*)b, (U8*)(b+i));
674 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
676 PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET;
679 Perl_croak_no_modify(aTHX);
680 NORETURN_FUNCTION_END;
684 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
689 register const REGEXP * rx;
690 const char * const remaining = mg->mg_ptr + 1;
692 PERL_ARGS_ASSERT_MAGIC_LEN;
694 switch (*mg->mg_ptr) {
696 if (*remaining == '\0') { /* ^P */
698 } else if (strEQ(remaining, "REMATCH")) { /* $^PREMATCH */
700 } else if (strEQ(remaining, "OSTMATCH")) { /* $^POSTMATCH */
704 case '\015': /* $^MATCH */
705 if (strEQ(remaining, "ATCH")) {
712 paren = RX_BUFF_IDX_PREMATCH;
716 paren = RX_BUFF_IDX_POSTMATCH;
720 paren = RX_BUFF_IDX_FULLMATCH;
722 case '1': case '2': case '3': case '4':
723 case '5': case '6': case '7': case '8': case '9':
724 paren = atoi(mg->mg_ptr);
726 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
728 i = CALLREG_NUMBUF_LENGTH((REGEXP * const)rx, sv, paren);
731 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
734 if (ckWARN(WARN_UNINITIALIZED))
739 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
740 paren = RX_LASTPAREN(rx);
745 case '\016': /* ^N */
746 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
747 paren = RX_LASTCLOSEPAREN(rx);
754 if (!SvPOK(sv) && SvNIOK(sv)) {
762 #define SvRTRIM(sv) STMT_START { \
764 STRLEN len = SvCUR(sv); \
765 char * const p = SvPVX(sv); \
766 while (len > 0 && isSPACE(p[len-1])) \
768 SvCUR_set(sv, len); \
774 Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
776 PERL_ARGS_ASSERT_EMULATE_COP_IO;
778 if (!(CopHINTS_get(c) & (HINT_LEXICAL_IO_IN|HINT_LEXICAL_IO_OUT)))
779 sv_setsv(sv, &PL_sv_undef);
783 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_IN)) {
784 SV *const value = Perl_refcounted_he_fetch(aTHX_
786 0, "open<", 5, 0, 0);
791 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_OUT)) {
792 SV *const value = Perl_refcounted_he_fetch(aTHX_
794 0, "open>", 5, 0, 0);
802 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
806 register const char *s = NULL;
808 const char * const remaining = mg->mg_ptr + 1;
809 const char nextchar = *remaining;
811 PERL_ARGS_ASSERT_MAGIC_GET;
813 switch (*mg->mg_ptr) {
814 case '\001': /* ^A */
815 sv_setsv(sv, PL_bodytarget);
817 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
818 if (nextchar == '\0') {
819 sv_setiv(sv, (IV)PL_minus_c);
821 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
822 sv_setiv(sv, (IV)STATUS_NATIVE);
826 case '\004': /* ^D */
827 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
829 case '\005': /* ^E */
830 if (nextchar == '\0') {
833 # include <descrip.h>
834 # include <starlet.h>
836 $DESCRIPTOR(msgdsc,msg);
837 sv_setnv(sv,(NV) vaxc$errno);
838 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
839 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
844 if (!(_emx_env & 0x200)) { /* Under DOS */
845 sv_setnv(sv, (NV)errno);
846 sv_setpv(sv, errno ? Strerror(errno) : "");
848 if (errno != errno_isOS2) {
849 const int tmp = _syserrno();
850 if (tmp) /* 2nd call to _syserrno() makes it 0 */
853 sv_setnv(sv, (NV)Perl_rc);
854 sv_setpv(sv, os2error(Perl_rc));
858 const DWORD dwErr = GetLastError();
859 sv_setnv(sv, (NV)dwErr);
861 PerlProc_GetOSError(sv, dwErr);
870 sv_setnv(sv, (NV)errno);
871 sv_setpv(sv, errno ? Strerror(errno) : "");
876 SvNOK_on(sv); /* what a wonderful hack! */
878 else if (strEQ(remaining, "NCODING"))
879 sv_setsv(sv, PL_encoding);
881 case '\006': /* ^F */
882 sv_setiv(sv, (IV)PL_maxsysfd);
884 case '\010': /* ^H */
885 sv_setiv(sv, (IV)PL_hints);
887 case '\011': /* ^I */ /* NOT \t in EBCDIC */
888 sv_setpv(sv, PL_inplace); /* Will undefine sv if PL_inplace is NULL */
890 case '\017': /* ^O & ^OPEN */
891 if (nextchar == '\0') {
892 sv_setpv(sv, PL_osname);
895 else if (strEQ(remaining, "PEN")) {
896 Perl_emulate_cop_io(aTHX_ &PL_compiling, sv);
900 if (nextchar == '\0') { /* ^P */
901 sv_setiv(sv, (IV)PL_perldb);
902 } else if (strEQ(remaining, "REMATCH")) { /* $^PREMATCH */
903 goto do_prematch_fetch;
904 } else if (strEQ(remaining, "OSTMATCH")) { /* $^POSTMATCH */
905 goto do_postmatch_fetch;
908 case '\023': /* ^S */
909 if (nextchar == '\0') {
910 if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING)
913 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
918 case '\024': /* ^T */
919 if (nextchar == '\0') {
921 sv_setnv(sv, PL_basetime);
923 sv_setiv(sv, (IV)PL_basetime);
926 else if (strEQ(remaining, "AINT"))
927 sv_setiv(sv, PL_tainting
928 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
931 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
932 if (strEQ(remaining, "NICODE"))
933 sv_setuv(sv, (UV) PL_unicode);
934 else if (strEQ(remaining, "TF8LOCALE"))
935 sv_setuv(sv, (UV) PL_utf8locale);
936 else if (strEQ(remaining, "TF8CACHE"))
937 sv_setiv(sv, (IV) PL_utf8cache);
939 case '\027': /* ^W & $^WARNING_BITS */
940 if (nextchar == '\0')
941 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
942 else if (strEQ(remaining, "ARNING_BITS")) {
943 if (PL_compiling.cop_warnings == pWARN_NONE) {
944 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
946 else if (PL_compiling.cop_warnings == pWARN_STD) {
949 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
953 else if (PL_compiling.cop_warnings == pWARN_ALL) {
954 /* Get the bit mask for $warnings::Bits{all}, because
955 * it could have been extended by warnings::register */
956 HV * const bits=get_hv("warnings::Bits", 0);
958 SV ** const bits_all = hv_fetchs(bits, "all", FALSE);
960 sv_setsv(sv, *bits_all);
963 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
967 sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
968 *PL_compiling.cop_warnings);
973 case '\015': /* $^MATCH */
974 if (strEQ(remaining, "ATCH")) {
975 case '1': case '2': case '3': case '4':
976 case '5': case '6': case '7': case '8': case '9': case '&':
977 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
979 * Pre-threads, this was paren = atoi(GvENAME((const GV *)mg->mg_obj));
980 * XXX Does the new way break anything?
982 paren = atoi(mg->mg_ptr); /* $& is in [0] */
983 CALLREG_NUMBUF_FETCH(rx,paren,sv);
986 sv_setsv(sv,&PL_sv_undef);
990 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
991 if (RX_LASTPAREN(rx)) {
992 CALLREG_NUMBUF_FETCH(rx,RX_LASTPAREN(rx),sv);
996 sv_setsv(sv,&PL_sv_undef);
998 case '\016': /* ^N */
999 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1000 if (RX_LASTCLOSEPAREN(rx)) {
1001 CALLREG_NUMBUF_FETCH(rx,RX_LASTCLOSEPAREN(rx),sv);
1006 sv_setsv(sv,&PL_sv_undef);
1010 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1011 CALLREG_NUMBUF_FETCH(rx,-2,sv);
1014 sv_setsv(sv,&PL_sv_undef);
1018 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1019 CALLREG_NUMBUF_FETCH(rx,-1,sv);
1022 sv_setsv(sv,&PL_sv_undef);
1025 if (GvIO(PL_last_in_gv)) {
1026 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
1031 sv_setiv(sv, (IV)STATUS_CURRENT);
1032 #ifdef COMPLEX_STATUS
1033 SvUPGRADE(sv, SVt_PVLV);
1034 LvTARGOFF(sv) = PL_statusvalue;
1035 LvTARGLEN(sv) = PL_statusvalue_vms;
1040 if (!isGV_with_GP(PL_defoutgv))
1042 else if (GvIOp(PL_defoutgv))
1043 s = IoTOP_NAME(GvIOp(PL_defoutgv));
1047 sv_setpv(sv,GvENAME(PL_defoutgv));
1048 sv_catpvs(sv,"_TOP");
1052 if (!isGV_with_GP(PL_defoutgv))
1054 else if (GvIOp(PL_defoutgv))
1055 s = IoFMT_NAME(GvIOp(PL_defoutgv));
1057 s = GvENAME(PL_defoutgv);
1061 if (GvIO(PL_defoutgv))
1062 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
1065 if (GvIO(PL_defoutgv))
1066 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
1069 if (GvIO(PL_defoutgv))
1070 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
1077 sv_setiv(sv, (IV)CopARYBASE_get(PL_curcop));
1080 if (GvIO(PL_defoutgv))
1081 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
1085 sv_copypv(sv, PL_ors_sv);
1091 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
1093 sv_setnv(sv, (NV)errno);
1096 if (errno == errno_isOS2 || errno == errno_isOS2_set)
1097 sv_setpv(sv, os2error(Perl_rc));
1100 sv_setpv(sv, errno ? Strerror(errno) : "");
1102 SvPOK_on(sv); /* may have got removed during taint processing */
1107 SvNOK_on(sv); /* what a wonderful hack! */
1110 sv_setiv(sv, (IV)PL_uid);
1113 sv_setiv(sv, (IV)PL_euid);
1116 sv_setiv(sv, (IV)PL_gid);
1119 sv_setiv(sv, (IV)PL_egid);
1121 #ifdef HAS_GETGROUPS
1123 Groups_t *gary = NULL;
1124 I32 i, num_groups = getgroups(0, gary);
1125 Newx(gary, num_groups, Groups_t);
1126 num_groups = getgroups(num_groups, gary);
1127 for (i = 0; i < num_groups; i++)
1128 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1131 (void)SvIOK_on(sv); /* what a wonderful hack! */
1141 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1143 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1145 PERL_ARGS_ASSERT_MAGIC_GETUVAR;
1147 if (uf && uf->uf_val)
1148 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1153 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1156 STRLEN len = 0, klen;
1157 const char *s = SvOK(sv) ? SvPV_const(sv,len) : "";
1158 const char * const ptr = MgPV_const(mg,klen);
1161 PERL_ARGS_ASSERT_MAGIC_SETENV;
1163 #ifdef DYNAMIC_ENV_FETCH
1164 /* We just undefd an environment var. Is a replacement */
1165 /* waiting in the wings? */
1167 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1169 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1173 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1174 /* And you'll never guess what the dog had */
1175 /* in its mouth... */
1177 MgTAINTEDDIR_off(mg);
1179 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1180 char pathbuf[256], eltbuf[256], *cp, *elt;
1184 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1186 do { /* DCL$PATH may be a search list */
1187 while (1) { /* as may dev portion of any element */
1188 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1189 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1190 cando_by_name(S_IWUSR,0,elt) ) {
1191 MgTAINTEDDIR_on(mg);
1195 if ((cp = strchr(elt, ':')) != NULL)
1197 if (my_trnlnm(elt, eltbuf, j++))
1203 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1206 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1207 const char * const strend = s + len;
1209 while (s < strend) {
1213 #ifdef VMS /* Hmm. How do we get $Config{path_sep} from C? */
1214 const char path_sep = '|';
1216 const char path_sep = ':';
1218 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1219 s, strend, path_sep, &i);
1221 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1223 || !strchr(tmpbuf, ':') /* no colon thus no device name -- assume relative path */
1225 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1227 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1228 MgTAINTEDDIR_on(mg);
1234 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1240 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1242 PERL_ARGS_ASSERT_MAGIC_CLEARENV;
1243 PERL_UNUSED_ARG(sv);
1244 my_setenv(MgPV_nolen_const(mg),NULL);
1249 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1252 PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV;
1253 PERL_UNUSED_ARG(mg);
1255 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1257 if (PL_localizing) {
1260 hv_iterinit(MUTABLE_HV(sv));
1261 while ((entry = hv_iternext(MUTABLE_HV(sv)))) {
1263 my_setenv(hv_iterkey(entry, &keylen),
1264 SvPV_nolen_const(hv_iterval(MUTABLE_HV(sv), entry)));
1272 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1275 PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV;
1276 PERL_UNUSED_ARG(sv);
1277 PERL_UNUSED_ARG(mg);
1279 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1287 #ifdef HAS_SIGPROCMASK
1289 restore_sigmask(pTHX_ SV *save_sv)
1291 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1292 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1296 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1299 /* Are we fetching a signal entry? */
1300 int i = (I16)mg->mg_private;
1302 PERL_ARGS_ASSERT_MAGIC_GETSIG;
1305 mg->mg_private = i = whichsig(MgPV_nolen_const(mg));
1310 sv_setsv(sv,PL_psig_ptr[i]);
1312 Sighandler_t sigstate = rsignal_state(i);
1313 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1314 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1317 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1318 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1321 /* cache state so we don't fetch it again */
1322 if(sigstate == (Sighandler_t) SIG_IGN)
1323 sv_setpvs(sv,"IGNORE");
1325 sv_setsv(sv,&PL_sv_undef);
1326 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1333 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1335 PERL_ARGS_ASSERT_MAGIC_CLEARSIG;
1336 PERL_UNUSED_ARG(sv);
1338 magic_setsig(NULL, mg);
1339 return sv_unmagic(sv, mg->mg_type);
1343 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1344 Perl_csighandler(int sig, siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
1346 Perl_csighandler(int sig)
1349 #ifdef PERL_GET_SIG_CONTEXT
1350 dTHXa(PERL_GET_SIG_CONTEXT);
1354 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1355 (void) rsignal(sig, PL_csighandlerp);
1356 if (PL_sig_ignoring[sig]) return;
1358 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1359 if (PL_sig_defaulting[sig])
1360 #ifdef KILL_BY_SIGPRC
1361 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1376 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1377 /* Call the perl level handler now--
1378 * with risk we may be in malloc() or being destructed etc. */
1379 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1380 (*PL_sighandlerp)(sig, NULL, NULL);
1382 (*PL_sighandlerp)(sig);
1385 if (!PL_psig_pend) return;
1386 /* Set a flag to say this signal is pending, that is awaiting delivery after
1387 * the current Perl opcode completes */
1388 PL_psig_pend[sig]++;
1390 #ifndef SIG_PENDING_DIE_COUNT
1391 # define SIG_PENDING_DIE_COUNT 120
1393 /* Add one to say _a_ signal is pending */
1394 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1395 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1396 (unsigned long)SIG_PENDING_DIE_COUNT);
1400 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1402 Perl_csighandler_init(void)
1405 if (PL_sig_handlers_initted) return;
1407 for (sig = 1; sig < SIG_SIZE; sig++) {
1408 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1410 PL_sig_defaulting[sig] = 1;
1411 (void) rsignal(sig, PL_csighandlerp);
1413 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1414 PL_sig_ignoring[sig] = 0;
1417 PL_sig_handlers_initted = 1;
1422 Perl_despatch_signals(pTHX)
1427 for (sig = 1; sig < SIG_SIZE; sig++) {
1428 if (PL_psig_pend[sig]) {
1430 PERL_BLOCKSIG_ADD(set, sig);
1431 PL_psig_pend[sig] = 0;
1432 PERL_BLOCKSIG_BLOCK(set);
1433 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1434 (*PL_sighandlerp)(sig, NULL, NULL);
1436 (*PL_sighandlerp)(sig);
1438 PERL_BLOCKSIG_UNBLOCK(set);
1444 /* sv of NULL signifies that we're acting as magic_clearsig. */
1446 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1451 /* Need to be careful with SvREFCNT_dec(), because that can have side
1452 * effects (due to closures). We must make sure that the new disposition
1453 * is in place before it is called.
1457 #ifdef HAS_SIGPROCMASK
1461 register const char *s = MgPV_const(mg,len);
1463 PERL_ARGS_ASSERT_MAGIC_SETSIG;
1466 if (strEQ(s,"__DIE__"))
1468 else if (strEQ(s,"__WARN__")
1469 && (sv ? 1 : PL_warnhook != PERL_WARNHOOK_FATAL)) {
1470 /* Merge the existing behaviours, which are as follows:
1471 magic_setsig, we always set svp to &PL_warnhook
1472 (hence we always change the warnings handler)
1473 For magic_clearsig, we don't change the warnings handler if it's
1474 set to the &PL_warnhook. */
1477 Perl_croak(aTHX_ "No such hook: %s", s);
1480 if (*svp != PERL_WARNHOOK_FATAL)
1486 i = (I16)mg->mg_private;
1488 i = whichsig(s); /* ...no, a brick */
1489 mg->mg_private = (U16)i;
1493 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1496 #ifdef HAS_SIGPROCMASK
1497 /* Avoid having the signal arrive at a bad time, if possible. */
1500 sigprocmask(SIG_BLOCK, &set, &save);
1502 save_sv = newSVpvn((char *)(&save), sizeof(sigset_t));
1503 SAVEFREESV(save_sv);
1504 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1507 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1508 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1510 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1511 PL_sig_ignoring[i] = 0;
1513 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1514 PL_sig_defaulting[i] = 0;
1516 to_dec = PL_psig_ptr[i];
1518 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1519 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1521 /* Signals don't change name during the program's execution, so once
1522 they're cached in the appropriate slot of PL_psig_name, they can
1525 Ideally we'd find some way of making SVs at (C) compile time, or
1526 at least, doing most of the work. */
1527 if (!PL_psig_name[i]) {
1528 PL_psig_name[i] = newSVpvn(s, len);
1529 SvREADONLY_on(PL_psig_name[i]);
1532 SvREFCNT_dec(PL_psig_name[i]);
1533 PL_psig_name[i] = NULL;
1534 PL_psig_ptr[i] = NULL;
1537 if (sv && (isGV_with_GP(sv) || SvROK(sv))) {
1539 (void)rsignal(i, PL_csighandlerp);
1542 *svp = SvREFCNT_inc_simple_NN(sv);
1544 if (sv && SvOK(sv)) {
1545 s = SvPV_force(sv, len);
1549 if (sv && strEQ(s,"IGNORE")) {
1551 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1552 PL_sig_ignoring[i] = 1;
1553 (void)rsignal(i, PL_csighandlerp);
1555 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1559 else if (!sv || strEQ(s,"DEFAULT") || !len) {
1561 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1562 PL_sig_defaulting[i] = 1;
1563 (void)rsignal(i, PL_csighandlerp);
1565 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1571 * We should warn if HINT_STRICT_REFS, but without
1572 * access to a known hint bit in a known OP, we can't
1573 * tell whether HINT_STRICT_REFS is in force or not.
1575 if (!strchr(s,':') && !strchr(s,'\''))
1576 Perl_sv_insert_flags(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"),
1579 (void)rsignal(i, PL_csighandlerp);
1581 *svp = SvREFCNT_inc_simple_NN(sv);
1585 #ifdef HAS_SIGPROCMASK
1589 SvREFCNT_dec(to_dec);
1592 #endif /* !PERL_MICRO */
1595 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1598 PERL_ARGS_ASSERT_MAGIC_SETISA;
1599 PERL_UNUSED_ARG(sv);
1601 /* Skip _isaelem because _isa will handle it shortly */
1602 if (PL_delaymagic & DM_ARRAY_ISA && mg->mg_type == PERL_MAGIC_isaelem)
1605 return magic_clearisa(NULL, mg);
1608 /* sv of NULL signifies that we're acting as magic_setisa. */
1610 Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
1615 PERL_ARGS_ASSERT_MAGIC_CLEARISA;
1617 /* Bail out if destruction is going on */
1618 if(PL_dirty) return 0;
1621 av_clear(MUTABLE_AV(sv));
1623 /* XXX Once it's possible, we need to
1624 detect that our @ISA is aliased in
1625 other stashes, and act on the stashes
1626 of all of the aliases */
1628 /* The first case occurs via setisa,
1629 the second via setisa_elem, which
1630 calls this same magic */
1632 SvTYPE(mg->mg_obj) == SVt_PVGV
1633 ? (const GV *)mg->mg_obj
1634 : (const GV *)mg_find(mg->mg_obj, PERL_MAGIC_isa)->mg_obj
1638 mro_isa_changed_in(stash);
1644 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1647 PERL_ARGS_ASSERT_MAGIC_SETAMAGIC;
1648 PERL_UNUSED_ARG(sv);
1649 PERL_UNUSED_ARG(mg);
1650 PL_amagic_generation++;
1656 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1658 HV * const hv = MUTABLE_HV(LvTARG(sv));
1661 PERL_ARGS_ASSERT_MAGIC_GETNKEYS;
1662 PERL_UNUSED_ARG(mg);
1665 (void) hv_iterinit(hv);
1666 if (! SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
1669 while (hv_iternext(hv))
1674 sv_setiv(sv, (IV)i);
1679 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1681 PERL_ARGS_ASSERT_MAGIC_SETNKEYS;
1682 PERL_UNUSED_ARG(mg);
1684 hv_ksplit(MUTABLE_HV(LvTARG(sv)), SvIV(sv));
1690 =for apidoc magic_methcall
1692 Invoke a magic method (like FETCH).
1694 * sv and mg are the tied thinggy and the tie magic;
1695 * meth is the name of the method to call;
1696 * argc is the number of args (in addition to $self) to pass to the method;
1697 the args themselves are any values following the argc argument.
1699 G_DISCARD: invoke method with G_DISCARD flag and don't return a value
1700 G_UNDEF_FILL: fill the stack with argc pointers to PL_sv_undef.
1702 Returns the SV (if any) returned by the method, or NULL on failure.
1709 Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, U32 flags,
1716 PERL_ARGS_ASSERT_MAGIC_METHCALL;
1719 PUSHSTACKi(PERLSI_MAGIC);
1723 PUSHs(SvTIED_obj(sv, mg));
1724 if (flags & G_UNDEF_FILL) {
1726 PUSHs(&PL_sv_undef);
1728 } else if (argc > 0) {
1730 va_start(args, argc);
1733 SV *const sv = va_arg(args, SV *);
1740 if (flags & G_DISCARD) {
1741 call_method(meth, G_SCALAR|G_DISCARD);
1744 if (call_method(meth, G_SCALAR))
1745 ret = *PL_stack_sp--;
1753 /* wrapper for magic_methcall that creates the first arg */
1756 S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, const char *meth, U32 flags,
1762 PERL_ARGS_ASSERT_MAGIC_METHCALL1;
1765 if (mg->mg_len >= 0) {
1766 arg1 = newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
1768 else if (mg->mg_len == HEf_SVKEY)
1769 arg1 = MUTABLE_SV(mg->mg_ptr);
1771 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1772 arg1 = newSViv((IV)(mg->mg_len));
1776 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n - 1, val);
1778 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n, arg1, val);
1782 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1787 PERL_ARGS_ASSERT_MAGIC_METHPACK;
1789 ret = magic_methcall1(sv, mg, meth, 0, 1, NULL);
1796 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1798 PERL_ARGS_ASSERT_MAGIC_GETPACK;
1800 if (mg->mg_type == PERL_MAGIC_tiedelem)
1801 mg->mg_flags |= MGf_GSKIP;
1802 magic_methpack(sv,mg,"FETCH");
1807 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1813 PERL_ARGS_ASSERT_MAGIC_SETPACK;
1815 /* in the code C<$tied{foo} = $val>, the "thing" that gets passed to
1816 * STORE() is not $val, but rather a PVLV (the sv in this call), whose
1817 * public flags indicate its value based on copying from $val. Doing
1818 * mg_set() on the PVLV temporarily does SvMAGICAL_off(), then calls us.
1819 * So STORE()'s $_[2] arg is a temporarily disarmed PVLV. This goes
1820 * wrong if $val happened to be tainted, as sv hasn't got magic
1821 * enabled, even though taint magic is in the chain. In which case,
1822 * fake up a temporary tainted value (this is easier than temporarily
1823 * re-enabling magic on sv). */
1825 if (PL_tainting && (tmg = mg_find(sv, PERL_MAGIC_taint))
1826 && (tmg->mg_len & 1))
1828 val = sv_mortalcopy(sv);
1834 magic_methcall1(sv, mg, "STORE", G_DISCARD, 2, val);
1839 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1841 PERL_ARGS_ASSERT_MAGIC_CLEARPACK;
1843 return magic_methpack(sv,mg,"DELETE");
1848 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1854 PERL_ARGS_ASSERT_MAGIC_SIZEPACK;
1856 retsv = magic_methcall1(sv, mg, "FETCHSIZE", 0, 1, NULL);
1858 retval = SvIV(retsv)-1;
1860 Perl_croak(aTHX_ "FETCHSIZE returned a negative value");
1862 return (U32) retval;
1866 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1870 PERL_ARGS_ASSERT_MAGIC_WIPEPACK;
1872 Perl_magic_methcall(aTHX_ sv, mg, "CLEAR", G_DISCARD, 0);
1877 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1882 PERL_ARGS_ASSERT_MAGIC_NEXTPACK;
1884 ret = SvOK(key) ? Perl_magic_methcall(aTHX_ sv, mg, "NEXTKEY", 0, 1, key)
1885 : Perl_magic_methcall(aTHX_ sv, mg, "FIRSTKEY", 0, 0);
1892 Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
1894 PERL_ARGS_ASSERT_MAGIC_EXISTSPACK;
1896 return magic_methpack(sv,mg,"EXISTS");
1900 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1904 SV * const tied = SvTIED_obj(MUTABLE_SV(hv), mg);
1905 HV * const pkg = SvSTASH((const SV *)SvRV(tied));
1907 PERL_ARGS_ASSERT_MAGIC_SCALARPACK;
1909 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1911 if (HvEITER_get(hv))
1912 /* we are in an iteration so the hash cannot be empty */
1914 /* no xhv_eiter so now use FIRSTKEY */
1915 key = sv_newmortal();
1916 magic_nextpack(MUTABLE_SV(hv), mg, key);
1917 HvEITER_set(hv, NULL); /* need to reset iterator */
1918 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1921 /* there is a SCALAR method that we can call */
1922 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(hv), mg, "SCALAR", 0, 0);
1924 retval = &PL_sv_undef;
1929 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1932 GV * const gv = PL_DBline;
1933 const I32 i = SvTRUE(sv);
1934 SV ** const svp = av_fetch(GvAV(gv),
1935 atoi(MgPV_nolen_const(mg)), FALSE);
1937 PERL_ARGS_ASSERT_MAGIC_SETDBLINE;
1939 if (svp && SvIOKp(*svp)) {
1940 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1942 /* set or clear breakpoint in the relevant control op */
1944 o->op_flags |= OPf_SPECIAL;
1946 o->op_flags &= ~OPf_SPECIAL;
1953 Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1956 AV * const obj = MUTABLE_AV(mg->mg_obj);
1958 PERL_ARGS_ASSERT_MAGIC_GETARYLEN;
1961 sv_setiv(sv, AvFILL(obj) + CopARYBASE_get(PL_curcop));
1969 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1972 AV * const obj = MUTABLE_AV(mg->mg_obj);
1974 PERL_ARGS_ASSERT_MAGIC_SETARYLEN;
1977 av_fill(obj, SvIV(sv) - CopARYBASE_get(PL_curcop));
1979 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1980 "Attempt to set length of freed array");
1986 Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1990 PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P;
1991 PERL_UNUSED_ARG(sv);
1993 /* during global destruction, mg_obj may already have been freed */
1994 if (PL_in_clean_all)
1997 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
2000 /* arylen scalar holds a pointer back to the array, but doesn't own a
2001 reference. Hence the we (the array) are about to go away with it
2002 still pointing at us. Clear its pointer, else it would be pointing
2003 at free memory. See the comment in sv_magic about reference loops,
2004 and why it can't own a reference to us. */
2011 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
2014 SV* const lsv = LvTARG(sv);
2016 PERL_ARGS_ASSERT_MAGIC_GETPOS;
2017 PERL_UNUSED_ARG(mg);
2019 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
2020 MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
2021 if (found && found->mg_len >= 0) {
2022 I32 i = found->mg_len;
2024 sv_pos_b2u(lsv, &i);
2025 sv_setiv(sv, i + CopARYBASE_get(PL_curcop));
2034 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
2037 SV* const lsv = LvTARG(sv);
2043 PERL_ARGS_ASSERT_MAGIC_SETPOS;
2044 PERL_UNUSED_ARG(mg);
2046 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
2047 found = mg_find(lsv, PERL_MAGIC_regex_global);
2053 #ifdef PERL_OLD_COPY_ON_WRITE
2055 sv_force_normal_flags(lsv, 0);
2057 found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
2060 else if (!SvOK(sv)) {
2064 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
2066 pos = SvIV(sv) - CopARYBASE_get(PL_curcop);
2069 ulen = sv_len_utf8(lsv);
2079 else if (pos > (SSize_t)len)
2084 sv_pos_u2b(lsv, &p, 0);
2088 found->mg_len = pos;
2089 found->mg_flags &= ~MGf_MINMATCH;
2095 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
2098 SV * const lsv = LvTARG(sv);
2099 const char * const tmps = SvPV_const(lsv,len);
2100 STRLEN offs = LvTARGOFF(sv);
2101 STRLEN rem = LvTARGLEN(sv);
2103 PERL_ARGS_ASSERT_MAGIC_GETSUBSTR;
2104 PERL_UNUSED_ARG(mg);
2107 offs = sv_pos_u2b_flags(lsv, offs, &rem, SV_CONST_RETURN);
2110 if (rem > len - offs)
2112 sv_setpvn(sv, tmps + offs, rem);
2119 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
2123 const char * const tmps = SvPV_const(sv, len);
2124 SV * const lsv = LvTARG(sv);
2125 STRLEN lvoff = LvTARGOFF(sv);
2126 STRLEN lvlen = LvTARGLEN(sv);
2128 PERL_ARGS_ASSERT_MAGIC_SETSUBSTR;
2129 PERL_UNUSED_ARG(mg);
2132 sv_utf8_upgrade(lsv);
2133 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2134 sv_insert(lsv, lvoff, lvlen, tmps, len);
2135 LvTARGLEN(sv) = sv_len_utf8(sv);
2138 else if (lsv && SvUTF8(lsv)) {
2140 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2141 LvTARGLEN(sv) = len;
2142 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
2143 sv_insert(lsv, lvoff, lvlen, utf8, len);
2147 sv_insert(lsv, lvoff, lvlen, tmps, len);
2148 LvTARGLEN(sv) = len;
2155 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
2159 PERL_ARGS_ASSERT_MAGIC_GETTAINT;
2160 PERL_UNUSED_ARG(sv);
2162 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
2167 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
2171 PERL_ARGS_ASSERT_MAGIC_SETTAINT;
2172 PERL_UNUSED_ARG(sv);
2174 /* update taint status */
2183 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
2185 SV * const lsv = LvTARG(sv);
2187 PERL_ARGS_ASSERT_MAGIC_GETVEC;
2188 PERL_UNUSED_ARG(mg);
2191 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
2199 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
2201 PERL_ARGS_ASSERT_MAGIC_SETVEC;
2202 PERL_UNUSED_ARG(mg);
2203 do_vecset(sv); /* XXX slurp this routine */
2208 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2213 PERL_ARGS_ASSERT_MAGIC_GETDEFELEM;
2215 if (LvTARGLEN(sv)) {
2217 SV * const ahv = LvTARG(sv);
2218 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, FALSE, 0);
2223 AV *const av = MUTABLE_AV(LvTARG(sv));
2224 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
2225 targ = AvARRAY(av)[LvTARGOFF(sv)];
2227 if (targ && (targ != &PL_sv_undef)) {
2228 /* somebody else defined it for us */
2229 SvREFCNT_dec(LvTARG(sv));
2230 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2232 SvREFCNT_dec(mg->mg_obj);
2234 mg->mg_flags &= ~MGf_REFCOUNTED;
2239 sv_setsv(sv, targ ? targ : &PL_sv_undef);
2244 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2246 PERL_ARGS_ASSERT_MAGIC_SETDEFELEM;
2247 PERL_UNUSED_ARG(mg);
2251 sv_setsv(LvTARG(sv), sv);
2252 SvSETMAGIC(LvTARG(sv));
2258 Perl_vivify_defelem(pTHX_ SV *sv)
2264 PERL_ARGS_ASSERT_VIVIFY_DEFELEM;
2266 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2269 SV * const ahv = LvTARG(sv);
2270 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, TRUE, 0);
2273 if (!value || value == &PL_sv_undef)
2274 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
2277 AV *const av = MUTABLE_AV(LvTARG(sv));
2278 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2279 LvTARG(sv) = NULL; /* array can't be extended */
2281 SV* const * const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2282 if (!svp || (value = *svp) == &PL_sv_undef)
2283 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2286 SvREFCNT_inc_simple_void(value);
2287 SvREFCNT_dec(LvTARG(sv));
2290 SvREFCNT_dec(mg->mg_obj);
2292 mg->mg_flags &= ~MGf_REFCOUNTED;
2296 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2298 PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS;
2299 Perl_sv_kill_backrefs(aTHX_ sv, MUTABLE_AV(mg->mg_obj));
2304 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2306 PERL_ARGS_ASSERT_MAGIC_SETMGLOB;
2307 PERL_UNUSED_CONTEXT;
2309 if (!isGV_with_GP(sv))
2315 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2317 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2319 PERL_ARGS_ASSERT_MAGIC_SETUVAR;
2321 if (uf && uf->uf_set)
2322 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2327 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2329 const char type = mg->mg_type;
2331 PERL_ARGS_ASSERT_MAGIC_SETREGEXP;
2333 if (type == PERL_MAGIC_qr) {
2334 } else if (type == PERL_MAGIC_bm) {
2338 assert(type == PERL_MAGIC_fm);
2341 return sv_unmagic(sv, type);
2344 #ifdef USE_LOCALE_COLLATE
2346 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2348 PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM;
2351 * RenE<eacute> Descartes said "I think not."
2352 * and vanished with a faint plop.
2354 PERL_UNUSED_CONTEXT;
2355 PERL_UNUSED_ARG(sv);
2357 Safefree(mg->mg_ptr);
2363 #endif /* USE_LOCALE_COLLATE */
2365 /* Just clear the UTF-8 cache data. */
2367 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2369 PERL_ARGS_ASSERT_MAGIC_SETUTF8;
2370 PERL_UNUSED_CONTEXT;
2371 PERL_UNUSED_ARG(sv);
2372 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2374 mg->mg_len = -1; /* The mg_len holds the len cache. */
2379 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2382 register const char *s;
2384 register const REGEXP * rx;
2385 const char * const remaining = mg->mg_ptr + 1;
2389 PERL_ARGS_ASSERT_MAGIC_SET;
2391 switch (*mg->mg_ptr) {
2392 case '\015': /* $^MATCH */
2393 if (strEQ(remaining, "ATCH"))
2395 case '`': /* ${^PREMATCH} caught below */
2397 paren = RX_BUFF_IDX_PREMATCH;
2399 case '\'': /* ${^POSTMATCH} caught below */
2401 paren = RX_BUFF_IDX_POSTMATCH;
2405 paren = RX_BUFF_IDX_FULLMATCH;
2407 case '1': case '2': case '3': case '4':
2408 case '5': case '6': case '7': case '8': case '9':
2409 paren = atoi(mg->mg_ptr);
2411 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
2412 CALLREG_NUMBUF_STORE((REGEXP * const)rx,paren,sv);
2414 /* Croak with a READONLY error when a numbered match var is
2415 * set without a previous pattern match. Unless it's C<local $1>
2417 if (!PL_localizing) {
2418 Perl_croak_no_modify(aTHX);
2422 case '\001': /* ^A */
2423 sv_setsv(PL_bodytarget, sv);
2425 case '\003': /* ^C */
2426 PL_minus_c = cBOOL(SvIV(sv));
2429 case '\004': /* ^D */
2431 s = SvPV_nolen_const(sv);
2432 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2433 if (DEBUG_x_TEST || DEBUG_B_TEST)
2434 dump_all_perl(!DEBUG_B_TEST);
2436 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2439 case '\005': /* ^E */
2440 if (*(mg->mg_ptr+1) == '\0') {
2442 set_vaxc_errno(SvIV(sv));
2445 SetLastError( SvIV(sv) );
2448 os2_setsyserrno(SvIV(sv));
2450 /* will anyone ever use this? */
2451 SETERRNO(SvIV(sv), 4);
2456 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2457 SvREFCNT_dec(PL_encoding);
2458 if (SvOK(sv) || SvGMAGICAL(sv)) {
2459 PL_encoding = newSVsv(sv);
2466 case '\006': /* ^F */
2467 PL_maxsysfd = SvIV(sv);
2469 case '\010': /* ^H */
2470 PL_hints = SvIV(sv);
2472 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2473 Safefree(PL_inplace);
2474 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2476 case '\017': /* ^O */
2477 if (*(mg->mg_ptr+1) == '\0') {
2478 Safefree(PL_osname);
2481 TAINT_PROPER("assigning to $^O");
2482 PL_osname = savesvpv(sv);
2485 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2487 const char *const start = SvPV(sv, len);
2488 const char *out = (const char*)memchr(start, '\0', len);
2492 PL_compiling.cop_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2493 PL_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2495 /* Opening for input is more common than opening for output, so
2496 ensure that hints for input are sooner on linked list. */
2497 tmp = out ? newSVpvn_flags(out + 1, start + len - out - 1,
2499 : newSVpvs_flags("", SvUTF8(sv));
2500 (void)hv_stores(GvHV(PL_hintgv), "open>", tmp);
2503 tmp = newSVpvn_flags(start, out ? (STRLEN)(out - start) : len,
2505 (void)hv_stores(GvHV(PL_hintgv), "open<", tmp);
2509 case '\020': /* ^P */
2510 if (*remaining == '\0') { /* ^P */
2511 PL_perldb = SvIV(sv);
2512 if (PL_perldb && !PL_DBsingle)
2515 } else if (strEQ(remaining, "REMATCH")) { /* $^PREMATCH */
2517 } else if (strEQ(remaining, "OSTMATCH")) { /* $^POSTMATCH */
2521 case '\024': /* ^T */
2523 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2525 PL_basetime = (Time_t)SvIV(sv);
2528 case '\025': /* ^UTF8CACHE */
2529 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2530 PL_utf8cache = (signed char) sv_2iv(sv);
2533 case '\027': /* ^W & $^WARNING_BITS */
2534 if (*(mg->mg_ptr+1) == '\0') {
2535 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2537 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2538 | (i ? G_WARN_ON : G_WARN_OFF) ;
2541 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2542 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2543 if (!SvPOK(sv) && PL_localizing) {
2544 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2545 PL_compiling.cop_warnings = pWARN_NONE;
2550 int accumulate = 0 ;
2551 int any_fatals = 0 ;
2552 const char * const ptr = SvPV_const(sv, len) ;
2553 for (i = 0 ; i < len ; ++i) {
2554 accumulate |= ptr[i] ;
2555 any_fatals |= (ptr[i] & 0xAA) ;
2558 if (!specialWARN(PL_compiling.cop_warnings))
2559 PerlMemShared_free(PL_compiling.cop_warnings);
2560 PL_compiling.cop_warnings = pWARN_NONE;
2562 /* Yuck. I can't see how to abstract this: */
2563 else if (isWARN_on(((STRLEN *)SvPV_nolen_const(sv)) - 1,
2564 WARN_ALL) && !any_fatals) {
2565 if (!specialWARN(PL_compiling.cop_warnings))
2566 PerlMemShared_free(PL_compiling.cop_warnings);
2567 PL_compiling.cop_warnings = pWARN_ALL;
2568 PL_dowarn |= G_WARN_ONCE ;
2572 const char *const p = SvPV_const(sv, len);
2574 PL_compiling.cop_warnings
2575 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
2578 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2579 PL_dowarn |= G_WARN_ONCE ;
2587 if (PL_localizing) {
2588 if (PL_localizing == 1)
2589 SAVESPTR(PL_last_in_gv);
2591 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2592 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2595 if (isGV_with_GP(PL_defoutgv)) {
2596 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2597 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2598 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2602 if (isGV_with_GP(PL_defoutgv)) {
2603 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2604 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2605 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2609 if (isGV_with_GP(PL_defoutgv))
2610 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
2613 if (isGV_with_GP(PL_defoutgv)) {
2614 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2615 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2616 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2620 if (isGV_with_GP(PL_defoutgv))
2621 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
2625 IO * const io = GvIO(PL_defoutgv);
2628 if ((SvIV(sv)) == 0)
2629 IoFLAGS(io) &= ~IOf_FLUSH;
2631 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2632 PerlIO *ofp = IoOFP(io);
2634 (void)PerlIO_flush(ofp);
2635 IoFLAGS(io) |= IOf_FLUSH;
2641 SvREFCNT_dec(PL_rs);
2642 PL_rs = newSVsv(sv);
2645 SvREFCNT_dec(PL_ors_sv);
2646 if (SvOK(sv) || SvGMAGICAL(sv)) {
2647 PL_ors_sv = newSVsv(sv);
2654 CopARYBASE_set(&PL_compiling, SvIV(sv));
2657 #ifdef COMPLEX_STATUS
2658 if (PL_localizing == 2) {
2659 SvUPGRADE(sv, SVt_PVLV);
2660 PL_statusvalue = LvTARGOFF(sv);
2661 PL_statusvalue_vms = LvTARGLEN(sv);
2665 #ifdef VMSISH_STATUS
2667 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2670 STATUS_UNIX_EXIT_SET(SvIV(sv));
2675 # define PERL_VMS_BANG vaxc$errno
2677 # define PERL_VMS_BANG 0
2679 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2680 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2685 if (PL_delaymagic) {
2686 PL_delaymagic |= DM_RUID;
2687 break; /* don't do magic till later */
2690 (void)setruid((Uid_t)PL_uid);
2693 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2695 #ifdef HAS_SETRESUID
2696 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2698 if (PL_uid == PL_euid) { /* special case $< = $> */
2700 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2701 if (PL_uid != 0 && PerlProc_getuid() == 0)
2702 (void)PerlProc_setuid(0);
2704 (void)PerlProc_setuid(PL_uid);
2706 PL_uid = PerlProc_getuid();
2707 Perl_croak(aTHX_ "setruid() not implemented");
2712 PL_uid = PerlProc_getuid();
2716 if (PL_delaymagic) {
2717 PL_delaymagic |= DM_EUID;
2718 break; /* don't do magic till later */
2721 (void)seteuid((Uid_t)PL_euid);
2724 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2726 #ifdef HAS_SETRESUID
2727 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2729 if (PL_euid == PL_uid) /* special case $> = $< */
2730 PerlProc_setuid(PL_euid);
2732 PL_euid = PerlProc_geteuid();
2733 Perl_croak(aTHX_ "seteuid() not implemented");
2738 PL_euid = PerlProc_geteuid();
2742 if (PL_delaymagic) {
2743 PL_delaymagic |= DM_RGID;
2744 break; /* don't do magic till later */
2747 (void)setrgid((Gid_t)PL_gid);
2750 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2752 #ifdef HAS_SETRESGID
2753 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2755 if (PL_gid == PL_egid) /* special case $( = $) */
2756 (void)PerlProc_setgid(PL_gid);
2758 PL_gid = PerlProc_getgid();
2759 Perl_croak(aTHX_ "setrgid() not implemented");
2764 PL_gid = PerlProc_getgid();
2767 #ifdef HAS_SETGROUPS
2769 const char *p = SvPV_const(sv, len);
2770 Groups_t *gary = NULL;
2771 #ifdef _SC_NGROUPS_MAX
2772 int maxgrp = sysconf(_SC_NGROUPS_MAX);
2777 int maxgrp = NGROUPS;
2783 for (i = 0; i < maxgrp; ++i) {
2784 while (*p && !isSPACE(*p))
2791 Newx(gary, i + 1, Groups_t);
2793 Renew(gary, i + 1, Groups_t);
2797 (void)setgroups(i, gary);
2800 #else /* HAS_SETGROUPS */
2802 #endif /* HAS_SETGROUPS */
2803 if (PL_delaymagic) {
2804 PL_delaymagic |= DM_EGID;
2805 break; /* don't do magic till later */
2808 (void)setegid((Gid_t)PL_egid);
2811 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2813 #ifdef HAS_SETRESGID
2814 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2816 if (PL_egid == PL_gid) /* special case $) = $( */
2817 (void)PerlProc_setgid(PL_egid);
2819 PL_egid = PerlProc_getegid();
2820 Perl_croak(aTHX_ "setegid() not implemented");
2825 PL_egid = PerlProc_getegid();
2828 PL_chopset = SvPV_force(sv,len);
2831 LOCK_DOLLARZERO_MUTEX;
2832 #ifdef HAS_SETPROCTITLE
2833 /* The BSDs don't show the argv[] in ps(1) output, they
2834 * show a string from the process struct and provide
2835 * the setproctitle() routine to manipulate that. */
2836 if (PL_origalen != 1) {
2837 s = SvPV_const(sv, len);
2838 # if __FreeBSD_version > 410001
2839 /* The leading "-" removes the "perl: " prefix,
2840 * but not the "(perl) suffix from the ps(1)
2841 * output, because that's what ps(1) shows if the
2842 * argv[] is modified. */
2843 setproctitle("-%s", s);
2844 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2845 /* This doesn't really work if you assume that
2846 * $0 = 'foobar'; will wipe out 'perl' from the $0
2847 * because in ps(1) output the result will be like
2848 * sprintf("perl: %s (perl)", s)
2849 * I guess this is a security feature:
2850 * one (a user process) cannot get rid of the original name.
2852 setproctitle("%s", s);
2855 #elif defined(__hpux) && defined(PSTAT_SETCMD)
2856 if (PL_origalen != 1) {
2858 s = SvPV_const(sv, len);
2859 un.pst_command = (char *)s;
2860 pstat(PSTAT_SETCMD, un, len, 0, 0);
2863 if (PL_origalen > 1) {
2864 /* PL_origalen is set in perl_parse(). */
2865 s = SvPV_force(sv,len);
2866 if (len >= (STRLEN)PL_origalen-1) {
2867 /* Longer than original, will be truncated. We assume that
2868 * PL_origalen bytes are available. */
2869 Copy(s, PL_origargv[0], PL_origalen-1, char);
2872 /* Shorter than original, will be padded. */
2874 /* Special case for Mac OS X: see [perl #38868] */
2877 /* Is the space counterintuitive? Yes.
2878 * (You were expecting \0?)
2879 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2881 const int pad = ' ';
2883 Copy(s, PL_origargv[0], len, char);
2884 PL_origargv[0][len] = 0;
2885 memset(PL_origargv[0] + len + 1,
2886 pad, PL_origalen - len - 1);
2888 PL_origargv[0][PL_origalen-1] = 0;
2889 for (i = 1; i < PL_origargc; i++)
2891 #ifdef HAS_PRCTL_SET_NAME
2892 /* Set the legacy process name in addition to the POSIX name on Linux */
2893 if (prctl(PR_SET_NAME, (unsigned long)s, 0, 0, 0) != 0) {
2894 /* diag_listed_as: SKIPME */
2895 Perl_croak(aTHX_ "Can't set $0 with prctl(): %s", Strerror(errno));
2900 UNLOCK_DOLLARZERO_MUTEX;
2907 Perl_whichsig(pTHX_ const char *sig)
2909 register char* const* sigv;
2911 PERL_ARGS_ASSERT_WHICHSIG;
2912 PERL_UNUSED_CONTEXT;
2914 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
2915 if (strEQ(sig,*sigv))
2916 return PL_sig_num[sigv - (char* const*)PL_sig_name];
2918 if (strEQ(sig,"CHLD"))
2922 if (strEQ(sig,"CLD"))
2929 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2930 Perl_sighandler(int sig, siginfo_t *sip, void *uap PERL_UNUSED_DECL)
2932 Perl_sighandler(int sig)
2935 #ifdef PERL_GET_SIG_CONTEXT
2936 dTHXa(PERL_GET_SIG_CONTEXT);
2943 SV * const tSv = PL_Sv;
2947 XPV * const tXpv = PL_Xpv;
2949 if (PL_savestack_ix + 15 <= PL_savestack_max)
2951 if (PL_markstack_ptr < PL_markstack_max - 2)
2953 if (PL_scopestack_ix < PL_scopestack_max - 3)
2956 if (!PL_psig_ptr[sig]) {
2957 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2962 /* Max number of items pushed there is 3*n or 4. We cannot fix
2963 infinity, so we fix 4 (in fact 5): */
2965 PL_savestack_ix += 5; /* Protect save in progress. */
2966 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2969 PL_markstack_ptr++; /* Protect mark. */
2971 PL_scopestack_ix += 1;
2972 /* sv_2cv is too complicated, try a simpler variant first: */
2973 if (!SvROK(PL_psig_ptr[sig]) || !(cv = MUTABLE_CV(SvRV(PL_psig_ptr[sig])))
2974 || SvTYPE(cv) != SVt_PVCV) {
2976 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2979 if (!cv || !CvROOT(cv)) {
2980 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2981 PL_sig_name[sig], (gv ? GvENAME(gv)
2988 if(PL_psig_name[sig]) {
2989 sv = SvREFCNT_inc_NN(PL_psig_name[sig]);
2991 #if !defined(PERL_IMPLICIT_CONTEXT)
2995 sv = sv_newmortal();
2996 sv_setpv(sv,PL_sig_name[sig]);
2999 PUSHSTACKi(PERLSI_SIGNAL);
3002 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3004 struct sigaction oact;
3006 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
3009 SV *rv = newRV_noinc(MUTABLE_SV(sih));
3010 /* The siginfo fields signo, code, errno, pid, uid,
3011 * addr, status, and band are defined by POSIX/SUSv3. */
3012 (void)hv_stores(sih, "signo", newSViv(sip->si_signo));
3013 (void)hv_stores(sih, "code", newSViv(sip->si_code));
3014 #if 0 /* XXX TODO: Configure scan for the existence of these, but even that does not help if the SA_SIGINFO is not implemented according to the spec. */
3015 hv_stores(sih, "errno", newSViv(sip->si_errno));
3016 hv_stores(sih, "status", newSViv(sip->si_status));
3017 hv_stores(sih, "uid", newSViv(sip->si_uid));
3018 hv_stores(sih, "pid", newSViv(sip->si_pid));
3019 hv_stores(sih, "addr", newSVuv(PTR2UV(sip->si_addr)));
3020 hv_stores(sih, "band", newSViv(sip->si_band));
3024 mPUSHp((char *)sip, sizeof(*sip));
3032 call_sv(MUTABLE_SV(cv), G_DISCARD|G_EVAL);
3035 if (SvTRUE(ERRSV)) {
3037 #ifdef HAS_SIGPROCMASK
3038 /* Handler "died", for example to get out of a restart-able read().
3039 * Before we re-do that on its behalf re-enable the signal which was
3040 * blocked by the system when we entered.
3044 sigaddset(&set,sig);
3045 sigprocmask(SIG_UNBLOCK, &set, NULL);
3047 /* Not clear if this will work */
3048 (void)rsignal(sig, SIG_IGN);
3049 (void)rsignal(sig, PL_csighandlerp);
3051 #endif /* !PERL_MICRO */
3056 PL_savestack_ix -= 8; /* Unprotect save in progress. */
3060 PL_scopestack_ix -= 1;
3063 PL_op = myop; /* Apparently not needed... */
3065 PL_Sv = tSv; /* Restore global temporaries. */
3072 S_restore_magic(pTHX_ const void *p)
3075 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
3076 SV* const sv = mgs->mgs_sv;
3081 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
3083 #ifdef PERL_OLD_COPY_ON_WRITE
3084 /* While magic was saved (and off) sv_setsv may well have seen
3085 this SV as a prime candidate for COW. */
3087 sv_force_normal_flags(sv, 0);
3090 if (mgs->mgs_readonly)
3092 if (mgs->mgs_magical)
3093 SvFLAGS(sv) |= mgs->mgs_magical;
3096 if (SvGMAGICAL(sv)) {
3097 /* downgrade public flags to private,
3098 and discard any other private flags */
3100 const U32 pubflags = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
3102 SvFLAGS(sv) &= ~( pubflags | (SVp_IOK|SVp_NOK|SVp_POK) );
3103 SvFLAGS(sv) |= ( pubflags << PRIVSHIFT );
3108 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
3110 /* If we're still on top of the stack, pop us off. (That condition
3111 * will be satisfied if restore_magic was called explicitly, but *not*
3112 * if it's being called via leave_scope.)
3113 * The reason for doing this is that otherwise, things like sv_2cv()
3114 * may leave alloc gunk on the savestack, and some code
3115 * (e.g. sighandler) doesn't expect that...
3117 if (PL_savestack_ix == mgs->mgs_ss_ix)
3119 UV popval = SSPOPUV;
3120 assert(popval == SAVEt_DESTRUCTOR_X);
3121 PL_savestack_ix -= 2;
3123 assert((popval & SAVE_MASK) == SAVEt_ALLOC);
3124 PL_savestack_ix -= popval >> SAVE_TIGHT_SHIFT;
3130 S_unwind_handler_stack(pTHX_ const void *p)
3133 const U32 flags = *(const U32*)p;
3135 PERL_ARGS_ASSERT_UNWIND_HANDLER_STACK;
3138 PL_savestack_ix -= 5; /* Unprotect save in progress. */
3139 #if !defined(PERL_IMPLICIT_CONTEXT)
3141 SvREFCNT_dec(PL_sig_sv);
3146 =for apidoc magic_sethint
3148 Triggered by a store to %^H, records the key/value pair to
3149 C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
3150 anything that would need a deep copy. Maybe we should warn if we find a
3156 Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
3159 SV *key = (mg->mg_len == HEf_SVKEY) ? MUTABLE_SV(mg->mg_ptr)
3160 : newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
3162 PERL_ARGS_ASSERT_MAGIC_SETHINT;
3164 /* mg->mg_obj isn't being used. If needed, it would be possible to store
3165 an alternative leaf in there, with PL_compiling.cop_hints being used if
3166 it's NULL. If needed for threads, the alternative could lock a mutex,
3167 or take other more complex action. */
3169 /* Something changed in %^H, so it will need to be restored on scope exit.
3170 Doing this here saves a lot of doing it manually in perl code (and
3171 forgetting to do it, and consequent subtle errors. */
3172 PL_hints |= HINT_LOCALIZE_HH;
3173 PL_compiling.cop_hints_hash
3174 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash, key, sv);
3179 =for apidoc magic_clearhint
3181 Triggered by a delete from %^H, records the key to
3182 C<PL_compiling.cop_hints_hash>.
3187 Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
3191 PERL_ARGS_ASSERT_MAGIC_CLEARHINT;
3192 PERL_UNUSED_ARG(sv);
3194 assert(mg->mg_len == HEf_SVKEY);
3196 PERL_UNUSED_ARG(sv);
3198 PL_hints |= HINT_LOCALIZE_HH;
3199 PL_compiling.cop_hints_hash
3200 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
3201 MUTABLE_SV(mg->mg_ptr), &PL_sv_placeholder);
3206 =for apidoc magic_clearhints
3208 Triggered by clearing %^H, resets C<PL_compiling.cop_hints_hash>.
3213 Perl_magic_clearhints(pTHX_ SV *sv, MAGIC *mg)
3215 PERL_ARGS_ASSERT_MAGIC_CLEARHINTS;
3216 PERL_UNUSED_ARG(sv);
3217 PERL_UNUSED_ARG(mg);
3218 if (PL_compiling.cop_hints_hash) {
3219 Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash);
3220 PL_compiling.cop_hints_hash = NULL;
3227 * c-indentation-style: bsd
3229 * indent-tabs-mode: t
3232 * ex: set ts=8 sts=4 sw=4 noet: