3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "Sam sat on the ground and put his head in his hands. 'I wish I had never
13 * come here, and I don't want to see no more magic,' he said, and fell silent."
17 =head1 Magical Functions
19 "Magic" is special data attached to SV structures in order to give them
20 "magical" properties. When any Perl code tries to read from, or assign to,
21 an SV marked as magical, it calls the 'get' or 'set' function associated
22 with that SV's magic. A get is called prior to reading an SV, in order to
23 give it a chance to update its internal value (get on $. writes the line
24 number of the last read filehandle into to the SV's IV slot), while
25 set is called after an SV has been written to, in order to allow it to make
26 use of its changed value (set on $/ copies the SV's new value to the
27 PL_rs global variable).
29 Magic is implemented as a linked list of MAGIC structures attached to the
30 SV. Each MAGIC struct holds the type of the magic, a pointer to an array
31 of functions that implement the get(), set(), length() etc functions,
32 plus space for some flags and pointers. For example, a tied variable has
33 a MAGIC structure that contains a pointer to the object associated with the
42 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
48 #if defined(HAS_SETGROUPS)
55 # include <sys/pstat.h>
58 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
59 Signal_t Perl_csighandler(int sig, ...);
61 Signal_t Perl_csighandler(int sig);
65 /* Missing protos on LynxOS */
66 void setruid(uid_t id);
67 void seteuid(uid_t id);
68 void setrgid(uid_t id);
69 void setegid(uid_t id);
73 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
81 /* MGS is typedef'ed to struct magic_state in perl.h */
84 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
88 assert(SvMAGICAL(sv));
89 /* Turning READONLY off for a copy-on-write scalar (including shared
90 hash keys) is a bad idea. */
92 sv_force_normal_flags(sv, 0);
94 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
96 mgs = SSPTR(mgs_ix, MGS*);
98 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
99 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
103 if (!(SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK))) {
104 /* No public flags are set, so promote any private flags to public. */
105 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
110 =for apidoc mg_magical
112 Turns on the magical status of an SV. See C<sv_magic>.
118 Perl_mg_magical(pTHX_ SV *sv)
122 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
123 const MGVTBL* const vtbl = mg->mg_virtual;
125 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
129 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
138 Do magic after a value is retrieved from the SV. See C<sv_magic>.
144 Perl_mg_get(pTHX_ SV *sv)
147 const I32 mgs_ix = SSNEW(sizeof(MGS));
148 const bool was_temp = (bool)SvTEMP(sv);
150 MAGIC *newmg, *head, *cur, *mg;
151 /* guard against sv having being freed midway by holding a private
154 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
155 cause the SV's buffer to get stolen (and maybe other stuff).
158 sv_2mortal(SvREFCNT_inc_simple_NN(sv));
163 save_magic(mgs_ix, sv);
165 /* We must call svt_get(sv, mg) for each valid entry in the linked
166 list of magic. svt_get() may delete the current entry, add new
167 magic to the head of the list, or upgrade the SV. AMS 20010810 */
169 newmg = cur = head = mg = SvMAGIC(sv);
171 const MGVTBL * const vtbl = mg->mg_virtual;
173 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
174 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
176 /* guard against magic having been deleted - eg FETCH calling
181 /* Don't restore the flags for this entry if it was deleted. */
182 if (mg->mg_flags & MGf_GSKIP)
183 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
186 mg = mg->mg_moremagic;
189 /* Have we finished with the new entries we saw? Start again
190 where we left off (unless there are more new entries). */
198 /* Were any new entries added? */
199 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
206 restore_magic(INT2PTR(void *, (IV)mgs_ix));
208 if (SvREFCNT(sv) == 1) {
209 /* We hold the last reference to this SV, which implies that the
210 SV was deleted as a side effect of the routines we called. */
219 Do magic after a value is assigned to the SV. See C<sv_magic>.
225 Perl_mg_set(pTHX_ SV *sv)
228 const I32 mgs_ix = SSNEW(sizeof(MGS));
232 save_magic(mgs_ix, sv);
234 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
235 const MGVTBL* vtbl = mg->mg_virtual;
236 nextmg = mg->mg_moremagic; /* it may delete itself */
237 if (mg->mg_flags & MGf_GSKIP) {
238 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
239 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
241 if (vtbl && vtbl->svt_set)
242 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
245 restore_magic(INT2PTR(void*, (IV)mgs_ix));
250 =for apidoc mg_length
252 Report on the SV's length. See C<sv_magic>.
258 Perl_mg_length(pTHX_ SV *sv)
264 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
265 const MGVTBL * const vtbl = mg->mg_virtual;
266 if (vtbl && vtbl->svt_len) {
267 const I32 mgs_ix = SSNEW(sizeof(MGS));
268 save_magic(mgs_ix, sv);
269 /* omit MGf_GSKIP -- not changed here */
270 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
271 restore_magic(INT2PTR(void*, (IV)mgs_ix));
277 const U8 *s = (U8*)SvPV_const(sv, len);
278 len = utf8_length(s, s + len);
281 (void)SvPV_const(sv, len);
286 Perl_mg_size(pTHX_ SV *sv)
290 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
291 const MGVTBL* const vtbl = mg->mg_virtual;
292 if (vtbl && vtbl->svt_len) {
293 const I32 mgs_ix = SSNEW(sizeof(MGS));
295 save_magic(mgs_ix, sv);
296 /* omit MGf_GSKIP -- not changed here */
297 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
298 restore_magic(INT2PTR(void*, (IV)mgs_ix));
305 return 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)
326 const I32 mgs_ix = SSNEW(sizeof(MGS));
329 save_magic(mgs_ix, sv);
331 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
332 const MGVTBL* const vtbl = mg->mg_virtual;
333 /* omit GSKIP -- never set here */
335 if (vtbl && vtbl->svt_clear)
336 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
339 restore_magic(INT2PTR(void*, (IV)mgs_ix));
346 Finds the magic pointer for type matching the SV. See C<sv_magic>.
352 Perl_mg_find(pTHX_ const SV *sv, int type)
357 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
358 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 const MGVTBL* const 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);
384 const char type = mg->mg_type;
385 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
387 (type == PERL_MAGIC_tied)
389 : (type == PERL_MAGIC_regdata && mg->mg_obj)
392 toLOWER(type), key, klen);
401 =for apidoc mg_localize
403 Copy some of the magic from an existing SV to new localized version of
404 that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
405 doesn't (eg taint, pos).
411 Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
415 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
416 MGVTBL* const vtbl = mg->mg_virtual;
417 switch (mg->mg_type) {
418 /* value magic types: don't copy */
421 case PERL_MAGIC_regex_global:
422 case PERL_MAGIC_nkeys:
423 #ifdef USE_LOCALE_COLLATE
424 case PERL_MAGIC_collxfrm:
427 case PERL_MAGIC_taint:
429 case PERL_MAGIC_vstring:
430 case PERL_MAGIC_utf8:
431 case PERL_MAGIC_substr:
432 case PERL_MAGIC_defelem:
433 case PERL_MAGIC_arylen:
435 case PERL_MAGIC_backref:
436 case PERL_MAGIC_arylen_p:
437 case PERL_MAGIC_rhash:
438 case PERL_MAGIC_symtab:
442 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
443 (void)CALL_FPTR(vtbl->svt_local)(aTHX_ nsv, mg);
445 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
446 mg->mg_ptr, mg->mg_len);
448 /* container types should remain read-only across localization */
449 SvFLAGS(nsv) |= SvREADONLY(sv);
452 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
453 SvFLAGS(nsv) |= SvMAGICAL(sv);
463 Free any magic storage used by the SV. See C<sv_magic>.
469 Perl_mg_free(pTHX_ SV *sv)
473 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
474 const MGVTBL* const vtbl = mg->mg_virtual;
475 moremagic = mg->mg_moremagic;
476 if (vtbl && vtbl->svt_free)
477 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
478 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
479 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
480 Safefree(mg->mg_ptr);
481 else if (mg->mg_len == HEf_SVKEY)
482 SvREFCNT_dec((SV*)mg->mg_ptr);
484 if (mg->mg_flags & MGf_REFCOUNTED)
485 SvREFCNT_dec(mg->mg_obj);
488 SvMAGIC_set(sv, NULL);
495 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
501 register const REGEXP * const rx = PM_GETRE(PL_curpm);
503 if (mg->mg_obj) { /* @+ */
504 /* return the number possible */
507 I32 paren = rx->lastparen;
509 /* return the last filled */
511 && (rx->startp[paren] == -1 || rx->endp[paren] == -1) )
522 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
526 register const REGEXP * const rx = PM_GETRE(PL_curpm);
528 register const I32 paren = mg->mg_len;
533 if (paren <= (I32)rx->nparens &&
534 (s = rx->startp[paren]) != -1 &&
535 (t = rx->endp[paren]) != -1)
538 if (mg->mg_obj) /* @+ */
543 if (i > 0 && RX_MATCH_UTF8(rx)) {
544 const char * const b = rx->subbeg;
546 i = utf8_length((U8*)b, (U8*)(b+i));
557 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
561 Perl_croak(aTHX_ PL_no_modify);
562 NORETURN_FUNCTION_END;
566 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
571 register const REGEXP *rx;
574 switch (*mg->mg_ptr) {
575 case '1': case '2': case '3': case '4':
576 case '5': case '6': case '7': case '8': case '9': case '&':
577 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
579 paren = atoi(mg->mg_ptr); /* $& is in [0] */
581 if (paren <= (I32)rx->nparens &&
582 (s1 = rx->startp[paren]) != -1 &&
583 (t1 = rx->endp[paren]) != -1)
587 if (i > 0 && RX_MATCH_UTF8(rx)) {
588 const char * const s = rx->subbeg + s1;
593 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
597 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
601 if (ckWARN(WARN_UNINITIALIZED))
606 if (ckWARN(WARN_UNINITIALIZED))
611 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
612 paren = rx->lastparen;
617 case '\016': /* ^N */
618 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
619 paren = rx->lastcloseparen;
625 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
626 if (rx->startp[0] != -1) {
637 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
638 if (rx->endp[0] != -1) {
639 i = rx->sublen - rx->endp[0];
650 if (!SvPOK(sv) && SvNIOK(sv)) {
658 #define SvRTRIM(sv) STMT_START { \
660 STRLEN len = SvCUR(sv); \
661 char * const p = SvPVX(sv); \
662 while (len > 0 && isSPACE(p[len-1])) \
664 SvCUR_set(sv, len); \
670 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
674 register char *s = NULL;
677 const char * const remaining = mg->mg_ptr + 1;
678 const char nextchar = *remaining;
680 switch (*mg->mg_ptr) {
681 case '\001': /* ^A */
682 sv_setsv(sv, PL_bodytarget);
684 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
685 if (nextchar == '\0') {
686 sv_setiv(sv, (IV)PL_minus_c);
688 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
689 sv_setiv(sv, (IV)STATUS_NATIVE);
693 case '\004': /* ^D */
694 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
696 case '\005': /* ^E */
697 if (nextchar == '\0') {
698 #if defined(MACOS_TRADITIONAL)
702 sv_setnv(sv,(double)gMacPerl_OSErr);
703 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
707 # include <descrip.h>
708 # include <starlet.h>
710 $DESCRIPTOR(msgdsc,msg);
711 sv_setnv(sv,(NV) vaxc$errno);
712 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
713 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
718 if (!(_emx_env & 0x200)) { /* Under DOS */
719 sv_setnv(sv, (NV)errno);
720 sv_setpv(sv, errno ? Strerror(errno) : "");
722 if (errno != errno_isOS2) {
723 const int tmp = _syserrno();
724 if (tmp) /* 2nd call to _syserrno() makes it 0 */
727 sv_setnv(sv, (NV)Perl_rc);
728 sv_setpv(sv, os2error(Perl_rc));
732 const DWORD dwErr = GetLastError();
733 sv_setnv(sv, (NV)dwErr);
735 PerlProc_GetOSError(sv, dwErr);
738 sv_setpvn(sv, "", 0);
743 const int saveerrno = errno;
744 sv_setnv(sv, (NV)errno);
745 sv_setpv(sv, errno ? Strerror(errno) : "");
750 SvNOK_on(sv); /* what a wonderful hack! */
752 else if (strEQ(remaining, "NCODING"))
753 sv_setsv(sv, PL_encoding);
755 case '\006': /* ^F */
756 sv_setiv(sv, (IV)PL_maxsysfd);
758 case '\010': /* ^H */
759 sv_setiv(sv, (IV)PL_hints);
761 case '\011': /* ^I */ /* NOT \t in EBCDIC */
763 sv_setpv(sv, PL_inplace);
765 sv_setsv(sv, &PL_sv_undef);
767 case '\017': /* ^O & ^OPEN */
768 if (nextchar == '\0') {
769 sv_setpv(sv, PL_osname);
772 else if (strEQ(remaining, "PEN")) {
773 if (!(CopHINTS_get(&PL_compiling) & HINT_LEXICAL_IO))
774 sv_setsv(sv, &PL_sv_undef);
777 Perl_refcounted_he_fetch(aTHX_
778 PL_compiling.cop_hints_hash,
779 0, "open", 4, 0, 0));
783 case '\020': /* ^P */
784 sv_setiv(sv, (IV)PL_perldb);
786 case '\023': /* ^S */
787 if (nextchar == '\0') {
788 if (PL_lex_state != LEX_NOTPARSING)
791 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
796 case '\024': /* ^T */
797 if (nextchar == '\0') {
799 sv_setnv(sv, PL_basetime);
801 sv_setiv(sv, (IV)PL_basetime);
804 else if (strEQ(remaining, "AINT"))
805 sv_setiv(sv, PL_tainting
806 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
809 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
810 if (strEQ(remaining, "NICODE"))
811 sv_setuv(sv, (UV) PL_unicode);
812 else if (strEQ(remaining, "TF8LOCALE"))
813 sv_setuv(sv, (UV) PL_utf8locale);
814 else if (strEQ(remaining, "TF8CACHE"))
815 sv_setiv(sv, (IV) PL_utf8cache);
817 case '\027': /* ^W & $^WARNING_BITS */
818 if (nextchar == '\0')
819 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
820 else if (strEQ(remaining, "ARNING_BITS")) {
821 if (PL_compiling.cop_warnings == pWARN_NONE) {
822 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
824 else if (PL_compiling.cop_warnings == pWARN_STD) {
827 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
831 else if (PL_compiling.cop_warnings == pWARN_ALL) {
832 /* Get the bit mask for $warnings::Bits{all}, because
833 * it could have been extended by warnings::register */
834 HV * const bits=get_hv("warnings::Bits", FALSE);
836 SV ** const bits_all = hv_fetchs(bits, "all", FALSE);
838 sv_setsv(sv, *bits_all);
841 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
845 sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
846 *PL_compiling.cop_warnings);
851 case '1': case '2': case '3': case '4':
852 case '5': case '6': case '7': case '8': case '9': case '&':
853 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
857 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
858 * XXX Does the new way break anything?
860 paren = atoi(mg->mg_ptr); /* $& is in [0] */
862 if (paren <= (I32)rx->nparens &&
863 (s1 = rx->startp[paren]) != -1 &&
864 (t1 = rx->endp[paren]) != -1)
869 assert(rx->sublen >= s1);
873 const int oldtainted = PL_tainted;
876 PL_tainted = oldtainted;
877 if ( (rx->extflags & RXf_CANY_SEEN)
879 && (!i || is_utf8_string((U8*)s, i)))
880 : (RX_MATCH_UTF8(rx)) )
887 if (RX_MATCH_TAINTED(rx)) {
888 MAGIC* const mg = SvMAGIC(sv);
891 SvMAGIC_set(sv, mg->mg_moremagic);
893 if ((mgt = SvMAGIC(sv))) {
894 mg->mg_moremagic = mgt;
904 sv_setsv(sv,&PL_sv_undef);
907 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
908 paren = rx->lastparen;
912 sv_setsv(sv,&PL_sv_undef);
914 case '\016': /* ^N */
915 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
916 paren = rx->lastcloseparen;
920 sv_setsv(sv,&PL_sv_undef);
923 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
924 if ((s = rx->subbeg) && rx->startp[0] != -1) {
929 sv_setsv(sv,&PL_sv_undef);
932 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
933 if (rx->subbeg && rx->endp[0] != -1) {
934 s = rx->subbeg + rx->endp[0];
935 i = rx->sublen - rx->endp[0];
939 sv_setsv(sv,&PL_sv_undef);
942 if (GvIO(PL_last_in_gv)) {
943 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
948 sv_setiv(sv, (IV)STATUS_CURRENT);
949 #ifdef COMPLEX_STATUS
950 LvTARGOFF(sv) = PL_statusvalue;
951 LvTARGLEN(sv) = PL_statusvalue_vms;
956 if (GvIOp(PL_defoutgv))
957 s = IoTOP_NAME(GvIOp(PL_defoutgv));
961 sv_setpv(sv,GvENAME(PL_defoutgv));
966 if (GvIOp(PL_defoutgv))
967 s = IoFMT_NAME(GvIOp(PL_defoutgv));
969 s = GvENAME(PL_defoutgv);
973 if (GvIOp(PL_defoutgv))
974 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
977 if (GvIOp(PL_defoutgv))
978 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
981 if (GvIOp(PL_defoutgv))
982 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
989 sv_setiv(sv, (IV)CopARYBASE_get(PL_curcop));
992 if (GvIOp(PL_defoutgv))
993 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
999 sv_copypv(sv, PL_ors_sv);
1003 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
1004 sv_setpv(sv, errno ? Strerror(errno) : "");
1007 const int saveerrno = errno;
1008 sv_setnv(sv, (NV)errno);
1010 if (errno == errno_isOS2 || errno == errno_isOS2_set)
1011 sv_setpv(sv, os2error(Perl_rc));
1014 sv_setpv(sv, errno ? Strerror(errno) : "");
1019 SvNOK_on(sv); /* what a wonderful hack! */
1022 sv_setiv(sv, (IV)PL_uid);
1025 sv_setiv(sv, (IV)PL_euid);
1028 sv_setiv(sv, (IV)PL_gid);
1031 sv_setiv(sv, (IV)PL_egid);
1033 #ifdef HAS_GETGROUPS
1035 Groups_t *gary = NULL;
1036 I32 i, num_groups = getgroups(0, gary);
1037 Newx(gary, num_groups, Groups_t);
1038 num_groups = getgroups(num_groups, gary);
1039 for (i = 0; i < num_groups; i++)
1040 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1043 (void)SvIOK_on(sv); /* what a wonderful hack! */
1046 #ifndef MACOS_TRADITIONAL
1055 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1057 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1059 if (uf && uf->uf_val)
1060 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1065 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1068 STRLEN len = 0, klen;
1069 const char *s = SvOK(sv) ? SvPV_const(sv,len) : "";
1070 const char * const ptr = MgPV_const(mg,klen);
1073 #ifdef DYNAMIC_ENV_FETCH
1074 /* We just undefd an environment var. Is a replacement */
1075 /* waiting in the wings? */
1077 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1079 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1083 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1084 /* And you'll never guess what the dog had */
1085 /* in its mouth... */
1087 MgTAINTEDDIR_off(mg);
1089 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1090 char pathbuf[256], eltbuf[256], *cp, *elt;
1094 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1096 do { /* DCL$PATH may be a search list */
1097 while (1) { /* as may dev portion of any element */
1098 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1099 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1100 cando_by_name(S_IWUSR,0,elt) ) {
1101 MgTAINTEDDIR_on(mg);
1105 if ((cp = strchr(elt, ':')) != NULL)
1107 if (my_trnlnm(elt, eltbuf, j++))
1113 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1116 if (s && klen == 4 && strEQ(ptr,"PATH")) {
1117 const char * const strend = s + len;
1119 while (s < strend) {
1123 #ifdef VMS /* Hmm. How do we get $Config{path_sep} from C? */
1124 const char path_sep = '|';
1126 const char path_sep = ':';
1128 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1129 s, strend, path_sep, &i);
1131 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1133 || !strchr(tmpbuf, ':') /* no colon thus no device name -- assume relative path */
1135 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1137 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1138 MgTAINTEDDIR_on(mg);
1144 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1150 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1152 PERL_UNUSED_ARG(sv);
1153 my_setenv(MgPV_nolen_const(mg),NULL);
1158 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1161 PERL_UNUSED_ARG(mg);
1163 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1165 if (PL_localizing) {
1168 hv_iterinit((HV*)sv);
1169 while ((entry = hv_iternext((HV*)sv))) {
1171 my_setenv(hv_iterkey(entry, &keylen),
1172 SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
1180 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1183 PERL_UNUSED_ARG(sv);
1184 PERL_UNUSED_ARG(mg);
1186 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1194 #ifdef HAS_SIGPROCMASK
1196 restore_sigmask(pTHX_ SV *save_sv)
1198 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1199 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1203 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1206 /* Are we fetching a signal entry? */
1207 const I32 i = whichsig(MgPV_nolen_const(mg));
1210 sv_setsv(sv,PL_psig_ptr[i]);
1212 Sighandler_t sigstate = rsignal_state(i);
1213 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1214 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1217 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1218 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1221 /* cache state so we don't fetch it again */
1222 if(sigstate == (Sighandler_t) SIG_IGN)
1223 sv_setpv(sv,"IGNORE");
1225 sv_setsv(sv,&PL_sv_undef);
1226 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1233 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1235 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1236 * refactoring might be in order.
1239 register const char * const s = MgPV_nolen_const(mg);
1240 PERL_UNUSED_ARG(sv);
1243 if (strEQ(s,"__DIE__"))
1245 else if (strEQ(s,"__WARN__") && PL_warnhook != PERL_WARNHOOK_FATAL)
1248 SV *const to_dec = *svp;
1250 SvREFCNT_dec(to_dec);
1254 /* Are we clearing a signal entry? */
1255 const I32 i = whichsig(s);
1257 #ifdef HAS_SIGPROCMASK
1260 /* Avoid having the signal arrive at a bad time, if possible. */
1263 sigprocmask(SIG_BLOCK, &set, &save);
1265 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1266 SAVEFREESV(save_sv);
1267 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1270 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1271 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1273 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1274 PL_sig_defaulting[i] = 1;
1275 (void)rsignal(i, PL_csighandlerp);
1277 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1279 if(PL_psig_name[i]) {
1280 SvREFCNT_dec(PL_psig_name[i]);
1283 if(PL_psig_ptr[i]) {
1284 SV * const to_dec=PL_psig_ptr[i];
1287 SvREFCNT_dec(to_dec);
1296 #ifndef SIG_PENDING_DIE_COUNT
1297 # define SIG_PENDING_DIE_COUNT 120
1301 S_raise_signal(pTHX_ int sig)
1304 /* Set a flag to say this signal is pending */
1305 PL_psig_pend[sig]++;
1306 /* And one to say _a_ signal is pending */
1307 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1308 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1309 (unsigned long)SIG_PENDING_DIE_COUNT);
1313 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1314 Perl_csighandler(int sig, ...)
1316 Perl_csighandler(int sig)
1319 #ifdef PERL_GET_SIG_CONTEXT
1320 dTHXa(PERL_GET_SIG_CONTEXT);
1324 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1325 (void) rsignal(sig, PL_csighandlerp);
1326 if (PL_sig_ignoring[sig]) return;
1328 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1329 if (PL_sig_defaulting[sig])
1330 #ifdef KILL_BY_SIGPRC
1331 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1346 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1347 /* Call the perl level handler now--
1348 * with risk we may be in malloc() etc. */
1349 (*PL_sighandlerp)(sig);
1351 S_raise_signal(aTHX_ sig);
1354 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1356 Perl_csighandler_init(void)
1359 if (PL_sig_handlers_initted) return;
1361 for (sig = 1; sig < SIG_SIZE; sig++) {
1362 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1364 PL_sig_defaulting[sig] = 1;
1365 (void) rsignal(sig, PL_csighandlerp);
1367 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1368 PL_sig_ignoring[sig] = 0;
1371 PL_sig_handlers_initted = 1;
1376 Perl_despatch_signals(pTHX)
1381 for (sig = 1; sig < SIG_SIZE; sig++) {
1382 if (PL_psig_pend[sig]) {
1383 PERL_BLOCKSIG_ADD(set, sig);
1384 PL_psig_pend[sig] = 0;
1385 PERL_BLOCKSIG_BLOCK(set);
1386 (*PL_sighandlerp)(sig);
1387 PERL_BLOCKSIG_UNBLOCK(set);
1393 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1398 /* Need to be careful with SvREFCNT_dec(), because that can have side
1399 * effects (due to closures). We must make sure that the new disposition
1400 * is in place before it is called.
1404 #ifdef HAS_SIGPROCMASK
1409 register const char *s = MgPV_const(mg,len);
1411 if (strEQ(s,"__DIE__"))
1413 else if (strEQ(s,"__WARN__"))
1416 Perl_croak(aTHX_ "No such hook: %s", s);
1419 if (*svp != PERL_WARNHOOK_FATAL)
1425 i = whichsig(s); /* ...no, a brick */
1427 if (ckWARN(WARN_SIGNAL))
1428 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1431 #ifdef HAS_SIGPROCMASK
1432 /* Avoid having the signal arrive at a bad time, if possible. */
1435 sigprocmask(SIG_BLOCK, &set, &save);
1437 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1438 SAVEFREESV(save_sv);
1439 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1442 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1443 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1445 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1446 PL_sig_ignoring[i] = 0;
1448 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1449 PL_sig_defaulting[i] = 0;
1451 SvREFCNT_dec(PL_psig_name[i]);
1452 to_dec = PL_psig_ptr[i];
1453 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1454 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1455 PL_psig_name[i] = newSVpvn(s, len);
1456 SvREADONLY_on(PL_psig_name[i]);
1458 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1460 (void)rsignal(i, PL_csighandlerp);
1461 #ifdef HAS_SIGPROCMASK
1466 *svp = SvREFCNT_inc_simple_NN(sv);
1468 SvREFCNT_dec(to_dec);
1471 s = SvOK(sv) ? SvPV_force(sv,len) : "DEFAULT";
1472 if (strEQ(s,"IGNORE")) {
1474 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1475 PL_sig_ignoring[i] = 1;
1476 (void)rsignal(i, PL_csighandlerp);
1478 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1482 else if (strEQ(s,"DEFAULT") || !*s) {
1484 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1486 PL_sig_defaulting[i] = 1;
1487 (void)rsignal(i, PL_csighandlerp);
1490 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1495 * We should warn if HINT_STRICT_REFS, but without
1496 * access to a known hint bit in a known OP, we can't
1497 * tell whether HINT_STRICT_REFS is in force or not.
1499 if (!strchr(s,':') && !strchr(s,'\''))
1500 Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"));
1502 (void)rsignal(i, PL_csighandlerp);
1504 *svp = SvREFCNT_inc_simple_NN(sv);
1506 #ifdef HAS_SIGPROCMASK
1511 SvREFCNT_dec(to_dec);
1514 #endif /* !PERL_MICRO */
1517 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1520 PERL_UNUSED_ARG(sv);
1521 PERL_UNUSED_ARG(mg);
1522 PL_sub_generation++;
1527 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1530 PERL_UNUSED_ARG(sv);
1531 PERL_UNUSED_ARG(mg);
1532 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1533 PL_amagic_generation++;
1539 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1541 HV * const hv = (HV*)LvTARG(sv);
1543 PERL_UNUSED_ARG(mg);
1546 (void) hv_iterinit(hv);
1547 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1550 while (hv_iternext(hv))
1555 sv_setiv(sv, (IV)i);
1560 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1562 PERL_UNUSED_ARG(mg);
1564 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1569 /* caller is responsible for stack switching/cleanup */
1571 S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
1578 PUSHs(SvTIED_obj(sv, mg));
1581 if (mg->mg_len >= 0)
1582 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1583 else if (mg->mg_len == HEf_SVKEY)
1584 PUSHs((SV*)mg->mg_ptr);
1586 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1587 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1595 return call_method(meth, flags);
1599 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1605 PUSHSTACKi(PERLSI_MAGIC);
1607 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1608 sv_setsv(sv, *PL_stack_sp--);
1618 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1621 mg->mg_flags |= MGf_GSKIP;
1622 magic_methpack(sv,mg,"FETCH");
1627 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1631 PUSHSTACKi(PERLSI_MAGIC);
1632 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1639 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1641 return magic_methpack(sv,mg,"DELETE");
1646 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1653 PUSHSTACKi(PERLSI_MAGIC);
1654 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1655 sv = *PL_stack_sp--;
1656 retval = (U32) SvIV(sv)-1;
1665 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1670 PUSHSTACKi(PERLSI_MAGIC);
1672 XPUSHs(SvTIED_obj(sv, mg));
1674 call_method("CLEAR", G_SCALAR|G_DISCARD);
1682 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1685 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1689 PUSHSTACKi(PERLSI_MAGIC);
1692 PUSHs(SvTIED_obj(sv, mg));
1697 if (call_method(meth, G_SCALAR))
1698 sv_setsv(key, *PL_stack_sp--);
1707 Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
1709 return magic_methpack(sv,mg,"EXISTS");
1713 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1717 SV * const tied = SvTIED_obj((SV*)hv, mg);
1718 HV * const pkg = SvSTASH((SV*)SvRV(tied));
1720 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1722 if (HvEITER_get(hv))
1723 /* we are in an iteration so the hash cannot be empty */
1725 /* no xhv_eiter so now use FIRSTKEY */
1726 key = sv_newmortal();
1727 magic_nextpack((SV*)hv, mg, key);
1728 HvEITER_set(hv, NULL); /* need to reset iterator */
1729 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1732 /* there is a SCALAR method that we can call */
1734 PUSHSTACKi(PERLSI_MAGIC);
1740 if (call_method("SCALAR", G_SCALAR))
1741 retval = *PL_stack_sp--;
1743 retval = &PL_sv_undef;
1750 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1753 GV * const gv = PL_DBline;
1754 const I32 i = SvTRUE(sv);
1755 SV ** const svp = av_fetch(GvAV(gv),
1756 atoi(MgPV_nolen_const(mg)), FALSE);
1757 if (svp && SvIOKp(*svp)) {
1758 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1760 /* set or clear breakpoint in the relevant control op */
1762 o->op_flags |= OPf_SPECIAL;
1764 o->op_flags &= ~OPf_SPECIAL;
1771 Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1774 const AV * const obj = (AV*)mg->mg_obj;
1776 sv_setiv(sv, AvFILL(obj) + CopARYBASE_get(PL_curcop));
1784 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1787 AV * const obj = (AV*)mg->mg_obj;
1789 av_fill(obj, SvIV(sv) - CopARYBASE_get(PL_curcop));
1791 if (ckWARN(WARN_MISC))
1792 Perl_warner(aTHX_ packWARN(WARN_MISC),
1793 "Attempt to set length of freed array");
1799 Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1802 PERL_UNUSED_ARG(sv);
1803 /* during global destruction, mg_obj may already have been freed */
1804 if (PL_in_clean_all)
1807 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1810 /* arylen scalar holds a pointer back to the array, but doesn't own a
1811 reference. Hence the we (the array) are about to go away with it
1812 still pointing at us. Clear its pointer, else it would be pointing
1813 at free memory. See the comment in sv_magic about reference loops,
1814 and why it can't own a reference to us. */
1821 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1824 SV* const lsv = LvTARG(sv);
1825 PERL_UNUSED_ARG(mg);
1827 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1828 MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
1829 if (found && found->mg_len >= 0) {
1830 I32 i = found->mg_len;
1832 sv_pos_b2u(lsv, &i);
1833 sv_setiv(sv, i + CopARYBASE_get(PL_curcop));
1842 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1845 SV* const lsv = LvTARG(sv);
1851 PERL_UNUSED_ARG(mg);
1853 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1854 found = mg_find(lsv, PERL_MAGIC_regex_global);
1860 #ifdef PERL_OLD_COPY_ON_WRITE
1862 sv_force_normal_flags(lsv, 0);
1864 found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
1867 else if (!SvOK(sv)) {
1871 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1873 pos = SvIV(sv) - CopARYBASE_get(PL_curcop);
1876 ulen = sv_len_utf8(lsv);
1886 else if (pos > (SSize_t)len)
1891 sv_pos_u2b(lsv, &p, 0);
1895 found->mg_len = pos;
1896 found->mg_flags &= ~MGf_MINMATCH;
1902 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1905 PERL_UNUSED_ARG(mg);
1909 if (isGV_with_GP(sv)) {
1910 /* We're actually already a typeglob, so don't need the stuff below.
1914 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
1919 GvGP(sv) = gp_ref(GvGP(gv));
1924 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1927 SV * const lsv = LvTARG(sv);
1928 const char * const tmps = SvPV_const(lsv,len);
1929 I32 offs = LvTARGOFF(sv);
1930 I32 rem = LvTARGLEN(sv);
1931 PERL_UNUSED_ARG(mg);
1934 sv_pos_u2b(lsv, &offs, &rem);
1935 if (offs > (I32)len)
1937 if (rem + offs > (I32)len)
1939 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1946 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1950 const char * const tmps = SvPV_const(sv, len);
1951 SV * const lsv = LvTARG(sv);
1952 I32 lvoff = LvTARGOFF(sv);
1953 I32 lvlen = LvTARGLEN(sv);
1954 PERL_UNUSED_ARG(mg);
1957 sv_utf8_upgrade(lsv);
1958 sv_pos_u2b(lsv, &lvoff, &lvlen);
1959 sv_insert(lsv, lvoff, lvlen, tmps, len);
1960 LvTARGLEN(sv) = sv_len_utf8(sv);
1963 else if (lsv && SvUTF8(lsv)) {
1965 sv_pos_u2b(lsv, &lvoff, &lvlen);
1966 LvTARGLEN(sv) = len;
1967 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
1968 sv_insert(lsv, lvoff, lvlen, utf8, len);
1972 sv_insert(lsv, lvoff, lvlen, tmps, len);
1973 LvTARGLEN(sv) = len;
1981 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1984 PERL_UNUSED_ARG(sv);
1985 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
1990 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1993 PERL_UNUSED_ARG(sv);
1994 /* update taint status unless we're restoring at scope exit */
1995 if (PL_localizing != 2) {
2005 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
2007 SV * const lsv = LvTARG(sv);
2008 PERL_UNUSED_ARG(mg);
2011 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
2019 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
2021 PERL_UNUSED_ARG(mg);
2022 do_vecset(sv); /* XXX slurp this routine */
2027 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2031 if (LvTARGLEN(sv)) {
2033 SV * const ahv = LvTARG(sv);
2034 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
2039 AV* const av = (AV*)LvTARG(sv);
2040 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
2041 targ = AvARRAY(av)[LvTARGOFF(sv)];
2043 if (targ && (targ != &PL_sv_undef)) {
2044 /* somebody else defined it for us */
2045 SvREFCNT_dec(LvTARG(sv));
2046 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2048 SvREFCNT_dec(mg->mg_obj);
2050 mg->mg_flags &= ~MGf_REFCOUNTED;
2055 sv_setsv(sv, targ ? targ : &PL_sv_undef);
2060 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2062 PERL_UNUSED_ARG(mg);
2066 sv_setsv(LvTARG(sv), sv);
2067 SvSETMAGIC(LvTARG(sv));
2073 Perl_vivify_defelem(pTHX_ SV *sv)
2079 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2082 SV * const ahv = LvTARG(sv);
2083 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
2086 if (!value || value == &PL_sv_undef)
2087 Perl_croak(aTHX_ PL_no_helem_sv, mg->mg_obj);
2090 AV* const av = (AV*)LvTARG(sv);
2091 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2092 LvTARG(sv) = NULL; /* array can't be extended */
2094 SV* const * const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2095 if (!svp || (value = *svp) == &PL_sv_undef)
2096 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2099 SvREFCNT_inc_simple_void(value);
2100 SvREFCNT_dec(LvTARG(sv));
2103 SvREFCNT_dec(mg->mg_obj);
2105 mg->mg_flags &= ~MGf_REFCOUNTED;
2109 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2111 return Perl_sv_kill_backrefs(aTHX_ sv, (AV*)mg->mg_obj);
2115 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2117 PERL_UNUSED_CONTEXT;
2124 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
2126 PERL_UNUSED_ARG(mg);
2127 sv_unmagic(sv, PERL_MAGIC_bm);
2134 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
2136 PERL_UNUSED_ARG(mg);
2137 sv_unmagic(sv, PERL_MAGIC_fm);
2143 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2145 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2147 if (uf && uf->uf_set)
2148 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2153 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2155 PERL_UNUSED_ARG(mg);
2156 sv_unmagic(sv, PERL_MAGIC_qr);
2161 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
2164 regexp * const re = (regexp *)mg->mg_obj;
2165 PERL_UNUSED_ARG(sv);
2171 #ifdef USE_LOCALE_COLLATE
2173 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2176 * RenE<eacute> Descartes said "I think not."
2177 * and vanished with a faint plop.
2179 PERL_UNUSED_CONTEXT;
2180 PERL_UNUSED_ARG(sv);
2182 Safefree(mg->mg_ptr);
2188 #endif /* USE_LOCALE_COLLATE */
2190 /* Just clear the UTF-8 cache data. */
2192 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2194 PERL_UNUSED_CONTEXT;
2195 PERL_UNUSED_ARG(sv);
2196 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2198 mg->mg_len = -1; /* The mg_len holds the len cache. */
2203 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2206 register const char *s;
2209 switch (*mg->mg_ptr) {
2210 case '\001': /* ^A */
2211 sv_setsv(PL_bodytarget, sv);
2213 case '\003': /* ^C */
2214 PL_minus_c = (bool)SvIV(sv);
2217 case '\004': /* ^D */
2219 s = SvPV_nolen_const(sv);
2220 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2221 DEBUG_x(dump_all());
2223 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2226 case '\005': /* ^E */
2227 if (*(mg->mg_ptr+1) == '\0') {
2228 #ifdef MACOS_TRADITIONAL
2229 gMacPerl_OSErr = SvIV(sv);
2232 set_vaxc_errno(SvIV(sv));
2235 SetLastError( SvIV(sv) );
2238 os2_setsyserrno(SvIV(sv));
2240 /* will anyone ever use this? */
2241 SETERRNO(SvIV(sv), 4);
2247 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2249 SvREFCNT_dec(PL_encoding);
2250 if (SvOK(sv) || SvGMAGICAL(sv)) {
2251 PL_encoding = newSVsv(sv);
2258 case '\006': /* ^F */
2259 PL_maxsysfd = SvIV(sv);
2261 case '\010': /* ^H */
2262 PL_hints = SvIV(sv);
2264 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2265 Safefree(PL_inplace);
2266 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2268 case '\017': /* ^O */
2269 if (*(mg->mg_ptr+1) == '\0') {
2270 Safefree(PL_osname);
2273 TAINT_PROPER("assigning to $^O");
2274 PL_osname = savesvpv(sv);
2277 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2278 PL_compiling.cop_hints |= HINT_LEXICAL_IO;
2279 PL_hints |= HINT_LOCALIZE_HH | HINT_LEXICAL_IO;
2280 PL_compiling.cop_hints_hash
2281 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2282 sv_2mortal(newSVpvs("open")), sv);
2285 case '\020': /* ^P */
2286 PL_perldb = SvIV(sv);
2287 if (PL_perldb && !PL_DBsingle)
2290 case '\024': /* ^T */
2292 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2294 PL_basetime = (Time_t)SvIV(sv);
2297 case '\025': /* ^UTF8CACHE */
2298 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2299 PL_utf8cache = (signed char) sv_2iv(sv);
2302 case '\027': /* ^W & $^WARNING_BITS */
2303 if (*(mg->mg_ptr+1) == '\0') {
2304 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2306 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2307 | (i ? G_WARN_ON : G_WARN_OFF) ;
2310 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2311 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2312 if (!SvPOK(sv) && PL_localizing) {
2313 sv_setpvn(sv, WARN_NONEstring, WARNsize);
2314 PL_compiling.cop_warnings = pWARN_NONE;
2319 int accumulate = 0 ;
2320 int any_fatals = 0 ;
2321 const char * const ptr = SvPV_const(sv, len) ;
2322 for (i = 0 ; i < len ; ++i) {
2323 accumulate |= ptr[i] ;
2324 any_fatals |= (ptr[i] & 0xAA) ;
2327 if (!specialWARN(PL_compiling.cop_warnings))
2328 PerlMemShared_free(PL_compiling.cop_warnings);
2329 PL_compiling.cop_warnings = pWARN_NONE;
2331 /* Yuck. I can't see how to abstract this: */
2332 else if (isWARN_on(((STRLEN *)SvPV_nolen_const(sv)) - 1,
2333 WARN_ALL) && !any_fatals) {
2334 if (!specialWARN(PL_compiling.cop_warnings))
2335 PerlMemShared_free(PL_compiling.cop_warnings);
2336 PL_compiling.cop_warnings = pWARN_ALL;
2337 PL_dowarn |= G_WARN_ONCE ;
2341 const char *const p = SvPV_const(sv, len);
2343 PL_compiling.cop_warnings
2344 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
2347 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2348 PL_dowarn |= G_WARN_ONCE ;
2356 if (PL_localizing) {
2357 if (PL_localizing == 1)
2358 SAVESPTR(PL_last_in_gv);
2360 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2361 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2364 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2365 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2366 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2369 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2370 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2371 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2374 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
2377 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2378 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2379 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2382 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
2386 IO * const io = GvIOp(PL_defoutgv);
2389 if ((SvIV(sv)) == 0)
2390 IoFLAGS(io) &= ~IOf_FLUSH;
2392 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2393 PerlIO *ofp = IoOFP(io);
2395 (void)PerlIO_flush(ofp);
2396 IoFLAGS(io) |= IOf_FLUSH;
2402 SvREFCNT_dec(PL_rs);
2403 PL_rs = newSVsv(sv);
2407 SvREFCNT_dec(PL_ors_sv);
2408 if (SvOK(sv) || SvGMAGICAL(sv)) {
2409 PL_ors_sv = newSVsv(sv);
2417 SvREFCNT_dec(PL_ofs_sv);
2418 if (SvOK(sv) || SvGMAGICAL(sv)) {
2419 PL_ofs_sv = newSVsv(sv);
2426 CopARYBASE_set(&PL_compiling, SvIV(sv));
2429 #ifdef COMPLEX_STATUS
2430 if (PL_localizing == 2) {
2431 PL_statusvalue = LvTARGOFF(sv);
2432 PL_statusvalue_vms = LvTARGLEN(sv);
2436 #ifdef VMSISH_STATUS
2438 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2441 STATUS_UNIX_EXIT_SET(SvIV(sv));
2446 # define PERL_VMS_BANG vaxc$errno
2448 # define PERL_VMS_BANG 0
2450 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2451 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2456 if (PL_delaymagic) {
2457 PL_delaymagic |= DM_RUID;
2458 break; /* don't do magic till later */
2461 (void)setruid((Uid_t)PL_uid);
2464 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2466 #ifdef HAS_SETRESUID
2467 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2469 if (PL_uid == PL_euid) { /* special case $< = $> */
2471 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2472 if (PL_uid != 0 && PerlProc_getuid() == 0)
2473 (void)PerlProc_setuid(0);
2475 (void)PerlProc_setuid(PL_uid);
2477 PL_uid = PerlProc_getuid();
2478 Perl_croak(aTHX_ "setruid() not implemented");
2483 PL_uid = PerlProc_getuid();
2484 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2488 if (PL_delaymagic) {
2489 PL_delaymagic |= DM_EUID;
2490 break; /* don't do magic till later */
2493 (void)seteuid((Uid_t)PL_euid);
2496 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2498 #ifdef HAS_SETRESUID
2499 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2501 if (PL_euid == PL_uid) /* special case $> = $< */
2502 PerlProc_setuid(PL_euid);
2504 PL_euid = PerlProc_geteuid();
2505 Perl_croak(aTHX_ "seteuid() not implemented");
2510 PL_euid = PerlProc_geteuid();
2511 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2515 if (PL_delaymagic) {
2516 PL_delaymagic |= DM_RGID;
2517 break; /* don't do magic till later */
2520 (void)setrgid((Gid_t)PL_gid);
2523 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2525 #ifdef HAS_SETRESGID
2526 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2528 if (PL_gid == PL_egid) /* special case $( = $) */
2529 (void)PerlProc_setgid(PL_gid);
2531 PL_gid = PerlProc_getgid();
2532 Perl_croak(aTHX_ "setrgid() not implemented");
2537 PL_gid = PerlProc_getgid();
2538 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2541 #ifdef HAS_SETGROUPS
2543 const char *p = SvPV_const(sv, len);
2544 Groups_t *gary = NULL;
2549 for (i = 0; i < NGROUPS; ++i) {
2550 while (*p && !isSPACE(*p))
2557 Newx(gary, i + 1, Groups_t);
2559 Renew(gary, i + 1, Groups_t);
2563 (void)setgroups(i, gary);
2566 #else /* HAS_SETGROUPS */
2568 #endif /* HAS_SETGROUPS */
2569 if (PL_delaymagic) {
2570 PL_delaymagic |= DM_EGID;
2571 break; /* don't do magic till later */
2574 (void)setegid((Gid_t)PL_egid);
2577 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2579 #ifdef HAS_SETRESGID
2580 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2582 if (PL_egid == PL_gid) /* special case $) = $( */
2583 (void)PerlProc_setgid(PL_egid);
2585 PL_egid = PerlProc_getegid();
2586 Perl_croak(aTHX_ "setegid() not implemented");
2591 PL_egid = PerlProc_getegid();
2592 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2595 PL_chopset = SvPV_force(sv,len);
2597 #ifndef MACOS_TRADITIONAL
2599 LOCK_DOLLARZERO_MUTEX;
2600 #ifdef HAS_SETPROCTITLE
2601 /* The BSDs don't show the argv[] in ps(1) output, they
2602 * show a string from the process struct and provide
2603 * the setproctitle() routine to manipulate that. */
2604 if (PL_origalen != 1) {
2605 s = SvPV_const(sv, len);
2606 # if __FreeBSD_version > 410001
2607 /* The leading "-" removes the "perl: " prefix,
2608 * but not the "(perl) suffix from the ps(1)
2609 * output, because that's what ps(1) shows if the
2610 * argv[] is modified. */
2611 setproctitle("-%s", s);
2612 # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2613 /* This doesn't really work if you assume that
2614 * $0 = 'foobar'; will wipe out 'perl' from the $0
2615 * because in ps(1) output the result will be like
2616 * sprintf("perl: %s (perl)", s)
2617 * I guess this is a security feature:
2618 * one (a user process) cannot get rid of the original name.
2620 setproctitle("%s", s);
2623 #elif defined(__hpux) && defined(PSTAT_SETCMD)
2624 if (PL_origalen != 1) {
2626 s = SvPV_const(sv, len);
2627 un.pst_command = (char *)s;
2628 pstat(PSTAT_SETCMD, un, len, 0, 0);
2631 if (PL_origalen > 1) {
2632 /* PL_origalen is set in perl_parse(). */
2633 s = SvPV_force(sv,len);
2634 if (len >= (STRLEN)PL_origalen-1) {
2635 /* Longer than original, will be truncated. We assume that
2636 * PL_origalen bytes are available. */
2637 Copy(s, PL_origargv[0], PL_origalen-1, char);
2640 /* Shorter than original, will be padded. */
2642 /* Special case for Mac OS X: see [perl #38868] */
2645 /* Is the space counterintuitive? Yes.
2646 * (You were expecting \0?)
2647 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2649 const int pad = ' ';
2651 Copy(s, PL_origargv[0], len, char);
2652 PL_origargv[0][len] = 0;
2653 memset(PL_origargv[0] + len + 1,
2654 pad, PL_origalen - len - 1);
2656 PL_origargv[0][PL_origalen-1] = 0;
2657 for (i = 1; i < PL_origargc; i++)
2661 UNLOCK_DOLLARZERO_MUTEX;
2669 Perl_whichsig(pTHX_ const char *sig)
2671 register char* const* sigv;
2672 PERL_UNUSED_CONTEXT;
2674 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
2675 if (strEQ(sig,*sigv))
2676 return PL_sig_num[sigv - (char* const*)PL_sig_name];
2678 if (strEQ(sig,"CHLD"))
2682 if (strEQ(sig,"CLD"))
2689 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2690 Perl_sighandler(int sig, ...)
2692 Perl_sighandler(int sig)
2695 #ifdef PERL_GET_SIG_CONTEXT
2696 dTHXa(PERL_GET_SIG_CONTEXT);
2703 SV * const tSv = PL_Sv;
2707 XPV * const tXpv = PL_Xpv;
2709 if (PL_savestack_ix + 15 <= PL_savestack_max)
2711 if (PL_markstack_ptr < PL_markstack_max - 2)
2713 if (PL_scopestack_ix < PL_scopestack_max - 3)
2716 if (!PL_psig_ptr[sig]) {
2717 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2722 /* Max number of items pushed there is 3*n or 4. We cannot fix
2723 infinity, so we fix 4 (in fact 5): */
2725 PL_savestack_ix += 5; /* Protect save in progress. */
2726 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
2729 PL_markstack_ptr++; /* Protect mark. */
2731 PL_scopestack_ix += 1;
2732 /* sv_2cv is too complicated, try a simpler variant first: */
2733 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2734 || SvTYPE(cv) != SVt_PVCV) {
2736 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
2739 if (!cv || !CvROOT(cv)) {
2740 if (ckWARN(WARN_SIGNAL))
2741 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2742 PL_sig_name[sig], (gv ? GvENAME(gv)
2749 if(PL_psig_name[sig]) {
2750 sv = SvREFCNT_inc_NN(PL_psig_name[sig]);
2752 #if !defined(PERL_IMPLICIT_CONTEXT)
2756 sv = sv_newmortal();
2757 sv_setpv(sv,PL_sig_name[sig]);
2760 PUSHSTACKi(PERLSI_SIGNAL);
2763 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2765 struct sigaction oact;
2767 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2771 va_start(args, sig);
2772 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2775 SV *rv = newRV_noinc((SV*)sih);
2776 /* The siginfo fields signo, code, errno, pid, uid,
2777 * addr, status, and band are defined by POSIX/SUSv3. */
2778 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2779 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
2780 #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. */
2781 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
2782 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
2783 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2784 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2785 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
2786 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
2790 PUSHs(newSVpv((char *)sip, sizeof(*sip)));
2799 call_sv((SV*)cv, G_DISCARD|G_EVAL);
2802 if (SvTRUE(ERRSV)) {
2804 #ifdef HAS_SIGPROCMASK
2805 /* Handler "died", for example to get out of a restart-able read().
2806 * Before we re-do that on its behalf re-enable the signal which was
2807 * blocked by the system when we entered.
2811 sigaddset(&set,sig);
2812 sigprocmask(SIG_UNBLOCK, &set, NULL);
2814 /* Not clear if this will work */
2815 (void)rsignal(sig, SIG_IGN);
2816 (void)rsignal(sig, PL_csighandlerp);
2818 #endif /* !PERL_MICRO */
2819 Perl_die(aTHX_ NULL);
2823 PL_savestack_ix -= 8; /* Unprotect save in progress. */
2827 PL_scopestack_ix -= 1;
2830 PL_op = myop; /* Apparently not needed... */
2832 PL_Sv = tSv; /* Restore global temporaries. */
2839 S_restore_magic(pTHX_ const void *p)
2842 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2843 SV* const sv = mgs->mgs_sv;
2848 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2850 #ifdef PERL_OLD_COPY_ON_WRITE
2851 /* While magic was saved (and off) sv_setsv may well have seen
2852 this SV as a prime candidate for COW. */
2854 sv_force_normal_flags(sv, 0);
2858 SvFLAGS(sv) |= mgs->mgs_flags;
2861 if (SvGMAGICAL(sv)) {
2862 /* downgrade public flags to private,
2863 and discard any other private flags */
2865 const U32 pubflags = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2867 SvFLAGS(sv) &= ~( pubflags | (SVp_IOK|SVp_NOK|SVp_POK) );
2868 SvFLAGS(sv) |= ( pubflags << PRIVSHIFT );
2873 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2875 /* If we're still on top of the stack, pop us off. (That condition
2876 * will be satisfied if restore_magic was called explicitly, but *not*
2877 * if it's being called via leave_scope.)
2878 * The reason for doing this is that otherwise, things like sv_2cv()
2879 * may leave alloc gunk on the savestack, and some code
2880 * (e.g. sighandler) doesn't expect that...
2882 if (PL_savestack_ix == mgs->mgs_ss_ix)
2884 I32 popval = SSPOPINT;
2885 assert(popval == SAVEt_DESTRUCTOR_X);
2886 PL_savestack_ix -= 2;
2888 assert(popval == SAVEt_ALLOC);
2890 PL_savestack_ix -= popval;
2896 S_unwind_handler_stack(pTHX_ const void *p)
2899 const U32 flags = *(const U32*)p;
2902 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2903 #if !defined(PERL_IMPLICIT_CONTEXT)
2905 SvREFCNT_dec(PL_sig_sv);
2910 =for apidoc magic_sethint
2912 Triggered by a store to %^H, records the key/value pair to
2913 C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
2914 anything that would need a deep copy. Maybe we should warn if we find a
2920 Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
2923 assert(mg->mg_len == HEf_SVKEY);
2925 /* mg->mg_obj isn't being used. If needed, it would be possible to store
2926 an alternative leaf in there, with PL_compiling.cop_hints being used if
2927 it's NULL. If needed for threads, the alternative could lock a mutex,
2928 or take other more complex action. */
2930 /* Something changed in %^H, so it will need to be restored on scope exit.
2931 Doing this here saves a lot of doing it manually in perl code (and
2932 forgetting to do it, and consequent subtle errors. */
2933 PL_hints |= HINT_LOCALIZE_HH;
2934 PL_compiling.cop_hints_hash
2935 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2936 (SV *)mg->mg_ptr, sv);
2941 =for apidoc magic_sethint
2943 Triggered by a delete from %^H, records the key to
2944 C<PL_compiling.cop_hints_hash>.
2949 Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
2952 PERL_UNUSED_ARG(sv);
2954 assert(mg->mg_len == HEf_SVKEY);
2956 PERL_UNUSED_ARG(sv);
2958 PL_hints |= HINT_LOCALIZE_HH;
2959 PL_compiling.cop_hints_hash
2960 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2961 (SV *)mg->mg_ptr, &PL_sv_placeholder);
2967 * c-indentation-style: bsd
2969 * indent-tabs-mode: t
2972 * ex: set ts=8 sts=4 sw=4 noet: