xref: /openbsd-src/gnu/usr.bin/perl/mg.c (revision 50b7afb2c2c0993b0894d4e34bf857cb13ed9c80)
1 /*    mg.c
2  *
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
5  *
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.
8  *
9  */
10 
11 /*
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.
14  *
15  *     [p.363 of _The Lord of the Rings_, II/vii: "The Mirror of Galadriel"]
16  */
17 
18 /*
19 =head1 Magical Functions
20 
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).
30 
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
36 tie.
37 
38 */
39 
40 #include "EXTERN.h"
41 #define PERL_IN_MG_C
42 #include "perl.h"
43 
44 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
45 #  ifdef I_GRP
46 #    include <grp.h>
47 #  endif
48 #endif
49 
50 #if defined(HAS_SETGROUPS)
51 #  ifndef NGROUPS
52 #    define NGROUPS 32
53 #  endif
54 #endif
55 
56 #ifdef __hpux
57 #  include <sys/pstat.h>
58 #endif
59 
60 #ifdef HAS_PRCTL_SET_NAME
61 #  include <sys/prctl.h>
62 #endif
63 
64 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
65 Signal_t Perl_csighandler(int sig, siginfo_t *, void *);
66 #else
67 Signal_t Perl_csighandler(int sig);
68 #endif
69 
70 #ifdef __Lynx__
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);
76 #endif
77 
78 /*
79  * Pre-magic setup and post-magic takedown.
80  * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
81  */
82 
83 struct magic_state {
84     SV* mgs_sv;
85     I32 mgs_ss_ix;
86     U32 mgs_magical;
87     bool mgs_readonly;
88     bool mgs_bumped;
89 };
90 /* MGS is typedef'ed to struct magic_state in perl.h */
91 
92 STATIC void
93 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
94 {
95     dVAR;
96     MGS* mgs;
97     bool bumped = FALSE;
98 
99     PERL_ARGS_ASSERT_SAVE_MAGIC;
100 
101     assert(SvMAGICAL(sv));
102 
103     /* we shouldn't really be called here with RC==0, but it can sometimes
104      * happen via mg_clear() (which also shouldn't be called when RC==0,
105      * but it can happen). Handle this case gracefully(ish) by not RC++
106      * and thus avoiding the resultant double free */
107     if (SvREFCNT(sv) > 0) {
108     /* guard against sv getting freed midway through the mg clearing,
109      * by holding a private reference for the duration. */
110 	SvREFCNT_inc_simple_void_NN(sv);
111 	bumped = TRUE;
112     }
113 
114     SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
115 
116     mgs = SSPTR(mgs_ix, MGS*);
117     mgs->mgs_sv = sv;
118     mgs->mgs_magical = SvMAGICAL(sv);
119     mgs->mgs_readonly = SvREADONLY(sv) && !SvIsCOW(sv);
120     mgs->mgs_ss_ix = PL_savestack_ix;   /* points after the saved destructor */
121     mgs->mgs_bumped = bumped;
122 
123     SvMAGICAL_off(sv);
124     /* Turning READONLY off for a copy-on-write scalar (including shared
125        hash keys) is a bad idea.  */
126     if (!SvIsCOW(sv)) SvREADONLY_off(sv);
127 }
128 
129 /*
130 =for apidoc mg_magical
131 
132 Turns on the magical status of an SV.  See C<sv_magic>.
133 
134 =cut
135 */
136 
137 void
138 Perl_mg_magical(pTHX_ SV *sv)
139 {
140     const MAGIC* mg;
141     PERL_ARGS_ASSERT_MG_MAGICAL;
142     PERL_UNUSED_CONTEXT;
143 
144     SvMAGICAL_off(sv);
145     if ((mg = SvMAGIC(sv))) {
146 	do {
147 	    const MGVTBL* const vtbl = mg->mg_virtual;
148 	    if (vtbl) {
149 		if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
150 		    SvGMAGICAL_on(sv);
151 		if (vtbl->svt_set)
152 		    SvSMAGICAL_on(sv);
153 		if (vtbl->svt_clear)
154 		    SvRMAGICAL_on(sv);
155 	    }
156 	} while ((mg = mg->mg_moremagic));
157 	if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)))
158 	    SvRMAGICAL_on(sv);
159     }
160 }
161 
162 /*
163 =for apidoc mg_get
164 
165 Do magic before a value is retrieved from the SV.  The type of SV must
166 be >= SVt_PVMG. See C<sv_magic>.
167 
168 =cut
169 */
170 
171 int
172 Perl_mg_get(pTHX_ SV *sv)
173 {
174     dVAR;
175     const I32 mgs_ix = SSNEW(sizeof(MGS));
176     bool saved = FALSE;
177     bool have_new = 0;
178     MAGIC *newmg, *head, *cur, *mg;
179 
180     PERL_ARGS_ASSERT_MG_GET;
181 
182     if (PL_localizing == 1 && sv == DEFSV) return 0;
183 
184     /* We must call svt_get(sv, mg) for each valid entry in the linked
185        list of magic. svt_get() may delete the current entry, add new
186        magic to the head of the list, or upgrade the SV. AMS 20010810 */
187 
188     newmg = cur = head = mg = SvMAGIC(sv);
189     while (mg) {
190 	const MGVTBL * const vtbl = mg->mg_virtual;
191 	MAGIC * const nextmg = mg->mg_moremagic;	/* it may delete itself */
192 
193 	if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
194 
195 	    /* taint's mg get is so dumb it doesn't need flag saving */
196 	    if (!saved && mg->mg_type != PERL_MAGIC_taint) {
197 		save_magic(mgs_ix, sv);
198 		saved = TRUE;
199 	    }
200 
201 	    vtbl->svt_get(aTHX_ sv, mg);
202 
203 	    /* guard against magic having been deleted - eg FETCH calling
204 	     * untie */
205 	    if (!SvMAGIC(sv)) {
206 		(SSPTR(mgs_ix, MGS *))->mgs_magical = 0; /* recalculate flags */
207 		break;
208 	    }
209 
210 	    /* recalculate flags if this entry was deleted. */
211 	    if (mg->mg_flags & MGf_GSKIP)
212 		(SSPTR(mgs_ix, MGS *))->mgs_magical = 0;
213 	}
214 	else if (vtbl == &PL_vtbl_utf8) {
215 	    /* get-magic can reallocate the PV */
216 	    magic_setutf8(sv, mg);
217 	}
218 
219 	mg = nextmg;
220 
221 	if (have_new) {
222 	    /* Have we finished with the new entries we saw? Start again
223 	       where we left off (unless there are more new entries). */
224 	    if (mg == head) {
225 		have_new = 0;
226 		mg   = cur;
227 		head = newmg;
228 	    }
229 	}
230 
231 	/* Were any new entries added? */
232 	if (!have_new && (newmg = SvMAGIC(sv)) != head) {
233 	    have_new = 1;
234 	    cur = mg;
235 	    mg  = newmg;
236 	    (SSPTR(mgs_ix, MGS *))->mgs_magical = 0; /* recalculate flags */
237 	}
238     }
239 
240     if (saved)
241 	restore_magic(INT2PTR(void *, (IV)mgs_ix));
242 
243     return 0;
244 }
245 
246 /*
247 =for apidoc mg_set
248 
249 Do magic after a value is assigned to the SV.  See C<sv_magic>.
250 
251 =cut
252 */
253 
254 int
255 Perl_mg_set(pTHX_ SV *sv)
256 {
257     dVAR;
258     const I32 mgs_ix = SSNEW(sizeof(MGS));
259     MAGIC* mg;
260     MAGIC* nextmg;
261 
262     PERL_ARGS_ASSERT_MG_SET;
263 
264     if (PL_localizing == 2 && sv == DEFSV) return 0;
265 
266     save_magic(mgs_ix, sv);
267 
268     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
269         const MGVTBL* vtbl = mg->mg_virtual;
270 	nextmg = mg->mg_moremagic;	/* it may delete itself */
271 	if (mg->mg_flags & MGf_GSKIP) {
272 	    mg->mg_flags &= ~MGf_GSKIP;	/* setting requires another read */
273 	    (SSPTR(mgs_ix, MGS*))->mgs_magical = 0;
274 	}
275 	if (PL_localizing == 2
276 	    && PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
277 	    continue;
278 	if (vtbl && vtbl->svt_set)
279 	    vtbl->svt_set(aTHX_ sv, mg);
280     }
281 
282     restore_magic(INT2PTR(void*, (IV)mgs_ix));
283     return 0;
284 }
285 
286 /*
287 =for apidoc mg_length
288 
289 This function is deprecated.
290 
291 It reports on the SV's length in bytes, calling length magic if available,
292 but does not set the UTF8 flag on the sv.  It will fall back to 'get'
293 magic if there is no 'length' magic, but with no indication as to
294 whether it called 'get' magic.  It assumes the sv is a PVMG or
295 higher.  Use sv_len() instead.
296 
297 =cut
298 */
299 
300 U32
301 Perl_mg_length(pTHX_ SV *sv)
302 {
303     dVAR;
304     MAGIC* mg;
305     STRLEN len;
306 
307     PERL_ARGS_ASSERT_MG_LENGTH;
308 
309     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
310         const MGVTBL * const vtbl = mg->mg_virtual;
311 	if (vtbl && vtbl->svt_len) {
312             const I32 mgs_ix = SSNEW(sizeof(MGS));
313 	    save_magic(mgs_ix, sv);
314 	    /* omit MGf_GSKIP -- not changed here */
315 	    len = vtbl->svt_len(aTHX_ sv, mg);
316 	    restore_magic(INT2PTR(void*, (IV)mgs_ix));
317 	    return len;
318 	}
319     }
320 
321     (void)SvPV_const(sv, len);
322     return len;
323 }
324 
325 I32
326 Perl_mg_size(pTHX_ SV *sv)
327 {
328     MAGIC* mg;
329 
330     PERL_ARGS_ASSERT_MG_SIZE;
331 
332     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
333         const MGVTBL* const vtbl = mg->mg_virtual;
334 	if (vtbl && vtbl->svt_len) {
335             const I32 mgs_ix = SSNEW(sizeof(MGS));
336             I32 len;
337 	    save_magic(mgs_ix, sv);
338 	    /* omit MGf_GSKIP -- not changed here */
339 	    len = vtbl->svt_len(aTHX_ sv, mg);
340 	    restore_magic(INT2PTR(void*, (IV)mgs_ix));
341 	    return len;
342 	}
343     }
344 
345     switch(SvTYPE(sv)) {
346 	case SVt_PVAV:
347 	    return AvFILLp((const AV *) sv); /* Fallback to non-tied array */
348 	case SVt_PVHV:
349 	    /* FIXME */
350 	default:
351 	    Perl_croak(aTHX_ "Size magic not implemented");
352 	    break;
353     }
354     return 0;
355 }
356 
357 /*
358 =for apidoc mg_clear
359 
360 Clear something magical that the SV represents.  See C<sv_magic>.
361 
362 =cut
363 */
364 
365 int
366 Perl_mg_clear(pTHX_ SV *sv)
367 {
368     const I32 mgs_ix = SSNEW(sizeof(MGS));
369     MAGIC* mg;
370     MAGIC *nextmg;
371 
372     PERL_ARGS_ASSERT_MG_CLEAR;
373 
374     save_magic(mgs_ix, sv);
375 
376     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
377         const MGVTBL* const vtbl = mg->mg_virtual;
378 	/* omit GSKIP -- never set here */
379 
380 	nextmg = mg->mg_moremagic; /* it may delete itself */
381 
382 	if (vtbl && vtbl->svt_clear)
383 	    vtbl->svt_clear(aTHX_ sv, mg);
384     }
385 
386     restore_magic(INT2PTR(void*, (IV)mgs_ix));
387     return 0;
388 }
389 
390 static MAGIC*
391 S_mg_findext_flags(pTHX_ const SV *sv, int type, const MGVTBL *vtbl, U32 flags)
392 {
393     PERL_UNUSED_CONTEXT;
394 
395     assert(flags <= 1);
396 
397     if (sv) {
398 	MAGIC *mg;
399 
400 	for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
401 	    if (mg->mg_type == type && (!flags || mg->mg_virtual == vtbl)) {
402 		return mg;
403 	    }
404 	}
405     }
406 
407     return NULL;
408 }
409 
410 /*
411 =for apidoc mg_find
412 
413 Finds the magic pointer for type matching the SV.  See C<sv_magic>.
414 
415 =cut
416 */
417 
418 MAGIC*
419 Perl_mg_find(pTHX_ const SV *sv, int type)
420 {
421     return S_mg_findext_flags(aTHX_ sv, type, NULL, 0);
422 }
423 
424 /*
425 =for apidoc mg_findext
426 
427 Finds the magic pointer of C<type> with the given C<vtbl> for the C<SV>.  See
428 C<sv_magicext>.
429 
430 =cut
431 */
432 
433 MAGIC*
434 Perl_mg_findext(pTHX_ const SV *sv, int type, const MGVTBL *vtbl)
435 {
436     return S_mg_findext_flags(aTHX_ sv, type, vtbl, 1);
437 }
438 
439 /*
440 =for apidoc mg_copy
441 
442 Copies the magic from one SV to another.  See C<sv_magic>.
443 
444 =cut
445 */
446 
447 int
448 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
449 {
450     int count = 0;
451     MAGIC* mg;
452 
453     PERL_ARGS_ASSERT_MG_COPY;
454 
455     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
456         const MGVTBL* const vtbl = mg->mg_virtual;
457 	if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
458 	    count += vtbl->svt_copy(aTHX_ sv, mg, nsv, key, klen);
459 	}
460 	else {
461 	    const char type = mg->mg_type;
462 	    if (isUPPER(type) && type != PERL_MAGIC_uvar) {
463 		sv_magic(nsv,
464 		     (type == PERL_MAGIC_tied)
465 			? SvTIED_obj(sv, mg)
466 			: (type == PERL_MAGIC_regdata && mg->mg_obj)
467 			    ? sv
468 			    : mg->mg_obj,
469 		     toLOWER(type), key, klen);
470 		count++;
471 	    }
472 	}
473     }
474     return count;
475 }
476 
477 /*
478 =for apidoc mg_localize
479 
480 Copy some of the magic from an existing SV to new localized version of that
481 SV. Container magic (eg %ENV, $1, tie) gets copied, value magic doesn't (eg
482 taint, pos).
483 
484 If setmagic is false then no set magic will be called on the new (empty) SV.
485 This typically means that assignment will soon follow (e.g. 'local $x = $y'),
486 and that will handle the magic.
487 
488 =cut
489 */
490 
491 void
492 Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic)
493 {
494     dVAR;
495     MAGIC *mg;
496 
497     PERL_ARGS_ASSERT_MG_LOCALIZE;
498 
499     if (nsv == DEFSV)
500 	return;
501 
502     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
503 	const MGVTBL* const vtbl = mg->mg_virtual;
504 	if (PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
505 	    continue;
506 
507 	if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
508 	    (void)vtbl->svt_local(aTHX_ nsv, mg);
509 	else
510 	    sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
511 			    mg->mg_ptr, mg->mg_len);
512 
513 	/* container types should remain read-only across localization */
514 	if (!SvIsCOW(sv)) SvFLAGS(nsv) |= SvREADONLY(sv);
515     }
516 
517     if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
518 	SvFLAGS(nsv) |= SvMAGICAL(sv);
519 	if (setmagic) {
520 	    PL_localizing = 1;
521 	    SvSETMAGIC(nsv);
522 	    PL_localizing = 0;
523 	}
524     }
525 }
526 
527 #define mg_free_struct(sv, mg) S_mg_free_struct(aTHX_ sv, mg)
528 static void
529 S_mg_free_struct(pTHX_ SV *sv, MAGIC *mg)
530 {
531     const MGVTBL* const vtbl = mg->mg_virtual;
532     if (vtbl && vtbl->svt_free)
533 	vtbl->svt_free(aTHX_ sv, mg);
534     if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
535 	if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
536 	    Safefree(mg->mg_ptr);
537 	else if (mg->mg_len == HEf_SVKEY)
538 	    SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
539     }
540     if (mg->mg_flags & MGf_REFCOUNTED)
541 	SvREFCNT_dec(mg->mg_obj);
542     Safefree(mg);
543 }
544 
545 /*
546 =for apidoc mg_free
547 
548 Free any magic storage used by the SV.  See C<sv_magic>.
549 
550 =cut
551 */
552 
553 int
554 Perl_mg_free(pTHX_ SV *sv)
555 {
556     MAGIC* mg;
557     MAGIC* moremagic;
558 
559     PERL_ARGS_ASSERT_MG_FREE;
560 
561     for (mg = SvMAGIC(sv); mg; mg = moremagic) {
562 	moremagic = mg->mg_moremagic;
563 	mg_free_struct(sv, mg);
564 	SvMAGIC_set(sv, moremagic);
565     }
566     SvMAGIC_set(sv, NULL);
567     SvMAGICAL_off(sv);
568     return 0;
569 }
570 
571 /*
572 =for apidoc Am|void|mg_free_type|SV *sv|int how
573 
574 Remove any magic of type I<how> from the SV I<sv>.  See L</sv_magic>.
575 
576 =cut
577 */
578 
579 void
580 Perl_mg_free_type(pTHX_ SV *sv, int how)
581 {
582     MAGIC *mg, *prevmg, *moremg;
583     PERL_ARGS_ASSERT_MG_FREE_TYPE;
584     for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
585 	MAGIC *newhead;
586 	moremg = mg->mg_moremagic;
587 	if (mg->mg_type == how) {
588 	    /* temporarily move to the head of the magic chain, in case
589 	       custom free code relies on this historical aspect of mg_free */
590 	    if (prevmg) {
591 		prevmg->mg_moremagic = moremg;
592 		mg->mg_moremagic = SvMAGIC(sv);
593 		SvMAGIC_set(sv, mg);
594 	    }
595 	    newhead = mg->mg_moremagic;
596 	    mg_free_struct(sv, mg);
597 	    SvMAGIC_set(sv, newhead);
598 	    mg = prevmg;
599 	}
600     }
601     mg_magical(sv);
602 }
603 
604 #include <signal.h>
605 
606 U32
607 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
608 {
609     dVAR;
610     PERL_UNUSED_ARG(sv);
611 
612     PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT;
613 
614     if (PL_curpm) {
615 	const REGEXP * const rx = PM_GETRE(PL_curpm);
616 	if (rx) {
617 	    if (mg->mg_obj) {			/* @+ */
618 		/* return the number possible */
619 		return RX_NPARENS(rx);
620 	    } else {				/* @- */
621 		I32 paren = RX_LASTPAREN(rx);
622 
623 		/* return the last filled */
624 		while ( paren >= 0
625 			&& (RX_OFFS(rx)[paren].start == -1
626 			    || RX_OFFS(rx)[paren].end == -1) )
627 		    paren--;
628 		return (U32)paren;
629 	    }
630 	}
631     }
632 
633     return (U32)-1;
634 }
635 
636 /* @-, @+ */
637 
638 int
639 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
640 {
641     dVAR;
642 
643     PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET;
644 
645     if (PL_curpm) {
646 	const REGEXP * const rx = PM_GETRE(PL_curpm);
647 	if (rx) {
648 	    const I32 paren = mg->mg_len;
649 	    I32 s;
650 	    I32 t;
651 	    if (paren < 0)
652 		return 0;
653 	    if (paren <= (I32)RX_NPARENS(rx) &&
654 		(s = RX_OFFS(rx)[paren].start) != -1 &&
655 		(t = RX_OFFS(rx)[paren].end) != -1)
656 		{
657 		    I32 i;
658 		    if (mg->mg_obj)		/* @+ */
659 			i = t;
660 		    else			/* @- */
661 			i = s;
662 
663 		    if (i > 0 && RX_MATCH_UTF8(rx)) {
664 			const char * const b = RX_SUBBEG(rx);
665 			if (b)
666 			    i = RX_SUBCOFFSET(rx) +
667                                     utf8_length((U8*)b,
668                                         (U8*)(b-RX_SUBOFFSET(rx)+i));
669 		    }
670 
671 		    sv_setiv(sv, i);
672 		}
673 	}
674     }
675     return 0;
676 }
677 
678 /* @-, @+ */
679 
680 int
681 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
682 {
683     PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET;
684     PERL_UNUSED_ARG(sv);
685     PERL_UNUSED_ARG(mg);
686     Perl_croak_no_modify();
687     NORETURN_FUNCTION_END;
688 }
689 
690 #define SvRTRIM(sv) STMT_START { \
691     if (SvPOK(sv)) { \
692         STRLEN len = SvCUR(sv); \
693         char * const p = SvPVX(sv); \
694 	while (len > 0 && isSPACE(p[len-1])) \
695 	   --len; \
696 	SvCUR_set(sv, len); \
697 	p[len] = '\0'; \
698     } \
699 } STMT_END
700 
701 void
702 Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
703 {
704     PERL_ARGS_ASSERT_EMULATE_COP_IO;
705 
706     if (!(CopHINTS_get(c) & (HINT_LEXICAL_IO_IN|HINT_LEXICAL_IO_OUT)))
707 	sv_setsv(sv, &PL_sv_undef);
708     else {
709 	sv_setpvs(sv, "");
710 	SvUTF8_off(sv);
711 	if ((CopHINTS_get(c) & HINT_LEXICAL_IO_IN)) {
712 	    SV *const value = cop_hints_fetch_pvs(c, "open<", 0);
713 	    assert(value);
714 	    sv_catsv(sv, value);
715 	}
716 	sv_catpvs(sv, "\0");
717 	if ((CopHINTS_get(c) & HINT_LEXICAL_IO_OUT)) {
718 	    SV *const value = cop_hints_fetch_pvs(c, "open>", 0);
719 	    assert(value);
720 	    sv_catsv(sv, value);
721 	}
722     }
723 }
724 
725 #ifdef VMS
726 #include <descrip.h>
727 #include <starlet.h>
728 #endif
729 
730 int
731 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
732 {
733     dVAR;
734     I32 paren;
735     const char *s = NULL;
736     REGEXP *rx;
737     const char * const remaining = mg->mg_ptr + 1;
738     const char nextchar = *remaining;
739 
740     PERL_ARGS_ASSERT_MAGIC_GET;
741 
742     switch (*mg->mg_ptr) {
743     case '\001':		/* ^A */
744 	if (SvOK(PL_bodytarget)) sv_copypv(sv, PL_bodytarget);
745 	else sv_setsv(sv, &PL_sv_undef);
746 	if (SvTAINTED(PL_bodytarget))
747 	    SvTAINTED_on(sv);
748 	break;
749     case '\003':		/* ^C, ^CHILD_ERROR_NATIVE */
750 	if (nextchar == '\0') {
751 	    sv_setiv(sv, (IV)PL_minus_c);
752 	}
753 	else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
754 	    sv_setiv(sv, (IV)STATUS_NATIVE);
755         }
756 	break;
757 
758     case '\004':		/* ^D */
759 	sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
760 	break;
761     case '\005':  /* ^E */
762 	 if (nextchar == '\0') {
763 #if defined(VMS)
764 	     {
765 		  char msg[255];
766 		  $DESCRIPTOR(msgdsc,msg);
767 		  sv_setnv(sv,(NV) vaxc$errno);
768 		  if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
769 		       sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
770 		  else
771 		       sv_setpvs(sv,"");
772 	     }
773 #elif defined(OS2)
774 	     if (!(_emx_env & 0x200)) {	/* Under DOS */
775 		  sv_setnv(sv, (NV)errno);
776 		  sv_setpv(sv, errno ? Strerror(errno) : "");
777 	     } else {
778 		  if (errno != errno_isOS2) {
779 		       const int tmp = _syserrno();
780 		       if (tmp)	/* 2nd call to _syserrno() makes it 0 */
781 			    Perl_rc = tmp;
782 		  }
783 		  sv_setnv(sv, (NV)Perl_rc);
784 		  sv_setpv(sv, os2error(Perl_rc));
785 	     }
786 #elif defined(WIN32)
787 	     {
788 		  const DWORD dwErr = GetLastError();
789 		  sv_setnv(sv, (NV)dwErr);
790 		  if (dwErr) {
791 		       PerlProc_GetOSError(sv, dwErr);
792 		  }
793 		  else
794 		       sv_setpvs(sv, "");
795 		  SetLastError(dwErr);
796 	     }
797 #else
798 	     {
799 		 dSAVE_ERRNO;
800 		 sv_setnv(sv, (NV)errno);
801 		 sv_setpv(sv, errno ? Strerror(errno) : "");
802 		 RESTORE_ERRNO;
803 	     }
804 #endif
805 	     SvRTRIM(sv);
806 	     SvNOK_on(sv);	/* what a wonderful hack! */
807 	 }
808 	 else if (strEQ(remaining, "NCODING"))
809 	      sv_setsv(sv, PL_encoding);
810 	 break;
811     case '\006':		/* ^F */
812 	sv_setiv(sv, (IV)PL_maxsysfd);
813 	break;
814     case '\007':		/* ^GLOBAL_PHASE */
815 	if (strEQ(remaining, "LOBAL_PHASE")) {
816 	    sv_setpvn(sv, PL_phase_names[PL_phase],
817 		      strlen(PL_phase_names[PL_phase]));
818 	}
819 	break;
820     case '\010':		/* ^H */
821 	sv_setiv(sv, (IV)PL_hints);
822 	break;
823     case '\011':		/* ^I */ /* NOT \t in EBCDIC */
824 	sv_setpv(sv, PL_inplace); /* Will undefine sv if PL_inplace is NULL */
825 	break;
826     case '\014':		/* ^LAST_FH */
827 	if (strEQ(remaining, "AST_FH")) {
828 	    if (PL_last_in_gv) {
829 		assert(isGV_with_GP(PL_last_in_gv));
830 		SV_CHECK_THINKFIRST_COW_DROP(sv);
831 		prepare_SV_for_RV(sv);
832 		SvOK_off(sv);
833 		SvRV_set(sv, SvREFCNT_inc_simple_NN(PL_last_in_gv));
834 		SvROK_on(sv);
835 		sv_rvweaken(sv);
836 	    }
837 	    else sv_setsv_nomg(sv, NULL);
838 	}
839 	break;
840     case '\017':		/* ^O & ^OPEN */
841 	if (nextchar == '\0') {
842 	    sv_setpv(sv, PL_osname);
843 	    SvTAINTED_off(sv);
844 	}
845 	else if (strEQ(remaining, "PEN")) {
846 	    Perl_emulate_cop_io(aTHX_ &PL_compiling, sv);
847 	}
848 	break;
849     case '\020':
850 	if (nextchar == '\0') {       /* ^P */
851 	    sv_setiv(sv, (IV)PL_perldb);
852 	} else if (strEQ(remaining, "REMATCH")) { /* $^PREMATCH */
853 
854             paren = RX_BUFF_IDX_CARET_PREMATCH;
855 	    goto do_numbuf_fetch;
856 	} else if (strEQ(remaining, "OSTMATCH")) { /* $^POSTMATCH */
857             paren = RX_BUFF_IDX_CARET_POSTMATCH;
858 	    goto do_numbuf_fetch;
859 	}
860 	break;
861     case '\023':		/* ^S */
862 	if (nextchar == '\0') {
863 	    if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING)
864 		SvOK_off(sv);
865 	    else if (PL_in_eval)
866  		sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
867 	    else
868 		sv_setiv(sv, 0);
869 	}
870 	break;
871     case '\024':		/* ^T */
872 	if (nextchar == '\0') {
873 #ifdef BIG_TIME
874             sv_setnv(sv, PL_basetime);
875 #else
876             sv_setiv(sv, (IV)PL_basetime);
877 #endif
878         }
879 	else if (strEQ(remaining, "AINT"))
880             sv_setiv(sv, TAINTING_get
881 		    ? (TAINT_WARN_get || PL_unsafe ? -1 : 1)
882 		    : 0);
883         break;
884     case '\025':		/* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
885 	if (strEQ(remaining, "NICODE"))
886 	    sv_setuv(sv, (UV) PL_unicode);
887 	else if (strEQ(remaining, "TF8LOCALE"))
888 	    sv_setuv(sv, (UV) PL_utf8locale);
889 	else if (strEQ(remaining, "TF8CACHE"))
890 	    sv_setiv(sv, (IV) PL_utf8cache);
891         break;
892     case '\027':		/* ^W  & $^WARNING_BITS */
893 	if (nextchar == '\0')
894 	    sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
895 	else if (strEQ(remaining, "ARNING_BITS")) {
896 	    if (PL_compiling.cop_warnings == pWARN_NONE) {
897 	        sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
898 	    }
899 	    else if (PL_compiling.cop_warnings == pWARN_STD) {
900 		sv_setsv(sv, &PL_sv_undef);
901 		break;
902 	    }
903             else if (PL_compiling.cop_warnings == pWARN_ALL) {
904 		/* Get the bit mask for $warnings::Bits{all}, because
905 		 * it could have been extended by warnings::register */
906 		HV * const bits = get_hv("warnings::Bits", 0);
907 		SV ** const bits_all = bits ? hv_fetchs(bits, "all", FALSE) : NULL;
908 		if (bits_all)
909 		    sv_copypv(sv, *bits_all);
910 	        else
911 		    sv_setpvn(sv, WARN_ALLstring, WARNsize);
912 	    }
913             else {
914 	        sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
915 			  *PL_compiling.cop_warnings);
916 	    }
917 	}
918 	break;
919     case '\015': /* $^MATCH */
920 	if (strEQ(remaining, "ATCH")) {
921             paren = RX_BUFF_IDX_CARET_FULLMATCH;
922 	    goto do_numbuf_fetch;
923         }
924 
925     case '1': case '2': case '3': case '4':
926     case '5': case '6': case '7': case '8': case '9': case '&':
927         /*
928          * Pre-threads, this was paren = atoi(GvENAME((const GV *)mg->mg_obj));
929          * XXX Does the new way break anything?
930          */
931         paren = atoi(mg->mg_ptr); /* $& is in [0] */
932       do_numbuf_fetch:
933         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
934             CALLREG_NUMBUF_FETCH(rx,paren,sv);
935             break;
936         }
937         sv_setsv(sv,&PL_sv_undef);
938 	break;
939     case '+':
940 	if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
941 	    paren = RX_LASTPAREN(rx);
942 	    if (paren)
943                 goto do_numbuf_fetch;
944 	}
945 	sv_setsv(sv,&PL_sv_undef);
946 	break;
947     case '\016':		/* ^N */
948 	if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
949 	    paren = RX_LASTCLOSEPAREN(rx);
950 	    if (paren)
951                 goto do_numbuf_fetch;
952 	}
953 	sv_setsv(sv,&PL_sv_undef);
954 	break;
955     case '`':
956         paren = RX_BUFF_IDX_PREMATCH;
957         goto do_numbuf_fetch;
958     case '\'':
959         paren = RX_BUFF_IDX_POSTMATCH;
960         goto do_numbuf_fetch;
961     case '.':
962 	if (GvIO(PL_last_in_gv)) {
963 	    sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
964 	}
965 	break;
966     case '?':
967 	{
968 	    sv_setiv(sv, (IV)STATUS_CURRENT);
969 #ifdef COMPLEX_STATUS
970 	    SvUPGRADE(sv, SVt_PVLV);
971 	    LvTARGOFF(sv) = PL_statusvalue;
972 	    LvTARGLEN(sv) = PL_statusvalue_vms;
973 #endif
974 	}
975 	break;
976     case '^':
977 	if (GvIOp(PL_defoutgv))
978 		s = IoTOP_NAME(GvIOp(PL_defoutgv));
979 	if (s)
980 	    sv_setpv(sv,s);
981 	else {
982 	    sv_setpv(sv,GvENAME(PL_defoutgv));
983 	    sv_catpvs(sv,"_TOP");
984 	}
985 	break;
986     case '~':
987 	if (GvIOp(PL_defoutgv))
988 	    s = IoFMT_NAME(GvIOp(PL_defoutgv));
989 	if (!s)
990 	    s = GvENAME(PL_defoutgv);
991 	sv_setpv(sv,s);
992 	break;
993     case '=':
994 	if (GvIO(PL_defoutgv))
995 	    sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
996 	break;
997     case '-':
998 	if (GvIO(PL_defoutgv))
999 	    sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
1000 	break;
1001     case '%':
1002 	if (GvIO(PL_defoutgv))
1003 	    sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
1004 	break;
1005     case ':':
1006 	break;
1007     case '/':
1008 	break;
1009     case '[':
1010 	sv_setiv(sv, 0);
1011 	break;
1012     case '|':
1013 	if (GvIO(PL_defoutgv))
1014 	    sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
1015 	break;
1016     case '\\':
1017 	if (PL_ors_sv)
1018 	    sv_copypv(sv, PL_ors_sv);
1019 	else
1020 	    sv_setsv(sv, &PL_sv_undef);
1021 	break;
1022     case '$': /* $$ */
1023 	{
1024 	    IV const pid = (IV)PerlProc_getpid();
1025 	    if (isGV(mg->mg_obj) || SvIV(mg->mg_obj) != pid) {
1026 		/* never set manually, or at least not since last fork */
1027 		sv_setiv(sv, pid);
1028 		/* never unsafe, even if reading in a tainted expression */
1029 		SvTAINTED_off(sv);
1030 	    }
1031 	    /* else a value has been assigned manually, so do nothing */
1032 	}
1033 	break;
1034 
1035     case '!':
1036 	{
1037 	dSAVE_ERRNO;
1038 #ifdef VMS
1039 	sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
1040 #else
1041 	sv_setnv(sv, (NV)errno);
1042 #endif
1043 #ifdef OS2
1044 	if (errno == errno_isOS2 || errno == errno_isOS2_set)
1045 	    sv_setpv(sv, os2error(Perl_rc));
1046 	else
1047 #endif
1048 	sv_setpv(sv, errno ? Strerror(errno) : "");
1049 	RESTORE_ERRNO;
1050 	}
1051 
1052 	SvRTRIM(sv);
1053 	SvNOK_on(sv);	/* what a wonderful hack! */
1054 	break;
1055     case '<':
1056 	sv_setiv(sv, (IV)PerlProc_getuid());
1057 	break;
1058     case '>':
1059 	sv_setiv(sv, (IV)PerlProc_geteuid());
1060 	break;
1061     case '(':
1062 	sv_setiv(sv, (IV)PerlProc_getgid());
1063 	goto add_groups;
1064     case ')':
1065 	sv_setiv(sv, (IV)PerlProc_getegid());
1066       add_groups:
1067 #ifdef HAS_GETGROUPS
1068 	{
1069 	    Groups_t *gary = NULL;
1070 	    I32 i, num_groups = getgroups(0, gary);
1071             Newx(gary, num_groups, Groups_t);
1072             num_groups = getgroups(num_groups, gary);
1073 	    for (i = 0; i < num_groups; i++)
1074 		Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
1075             Safefree(gary);
1076 	}
1077 	(void)SvIOK_on(sv);	/* what a wonderful hack! */
1078 #endif
1079 	break;
1080     case '0':
1081 	break;
1082     }
1083     return 0;
1084 }
1085 
1086 int
1087 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1088 {
1089     struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1090 
1091     PERL_ARGS_ASSERT_MAGIC_GETUVAR;
1092 
1093     if (uf && uf->uf_val)
1094 	(*uf->uf_val)(aTHX_ uf->uf_index, sv);
1095     return 0;
1096 }
1097 
1098 int
1099 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1100 {
1101     dVAR;
1102     STRLEN len = 0, klen;
1103     const char * const key = MgPV_const(mg,klen);
1104     const char *s = "";
1105 
1106     PERL_ARGS_ASSERT_MAGIC_SETENV;
1107 
1108     SvGETMAGIC(sv);
1109     if (SvOK(sv)) {
1110         /* defined environment variables are byte strings; unfortunately
1111            there is no SvPVbyte_force_nomg(), so we must do this piecewise */
1112         (void)SvPV_force_nomg_nolen(sv);
1113         sv_utf8_downgrade(sv, /* fail_ok */ TRUE);
1114         if (SvUTF8(sv)) {
1115             Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv");
1116             SvUTF8_off(sv);
1117         }
1118         s = SvPVX(sv);
1119         len = SvCUR(sv);
1120     }
1121     my_setenv(key, s); /* does the deed */
1122 
1123 #ifdef DYNAMIC_ENV_FETCH
1124      /* We just undefd an environment var.  Is a replacement */
1125      /* waiting in the wings? */
1126     if (!len) {
1127 	SV ** const valp = hv_fetch(GvHVn(PL_envgv), key, klen, FALSE);
1128 	if (valp)
1129 	    s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1130     }
1131 #endif
1132 
1133 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
1134 			    /* And you'll never guess what the dog had */
1135 			    /*   in its mouth... */
1136     if (TAINTING_get) {
1137 	MgTAINTEDDIR_off(mg);
1138 #ifdef VMS
1139 	if (s && klen == 8 && strEQ(key, "DCL$PATH")) {
1140 	    char pathbuf[256], eltbuf[256], *cp, *elt;
1141 	    int i = 0, j = 0;
1142 
1143 	    my_strlcpy(eltbuf, s, sizeof(eltbuf));
1144 	    elt = eltbuf;
1145 	    do {          /* DCL$PATH may be a search list */
1146 		while (1) {   /* as may dev portion of any element */
1147 		    if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1148 			if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1149 			     cando_by_name(S_IWUSR,0,elt) ) {
1150 			    MgTAINTEDDIR_on(mg);
1151 			    return 0;
1152 			}
1153 		    }
1154 		    if ((cp = strchr(elt, ':')) != NULL)
1155 			*cp = '\0';
1156 		    if (my_trnlnm(elt, eltbuf, j++))
1157 			elt = eltbuf;
1158 		    else
1159 			break;
1160 		}
1161 		j = 0;
1162 	    } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1163 	}
1164 #endif /* VMS */
1165 	if (s && klen == 4 && strEQ(key,"PATH")) {
1166 	    const char * const strend = s + len;
1167 
1168 	    while (s < strend) {
1169 		char tmpbuf[256];
1170 		Stat_t st;
1171 		I32 i;
1172 #ifdef VMS  /* Hmm.  How do we get $Config{path_sep} from C? */
1173 		const char path_sep = '|';
1174 #else
1175 		const char path_sep = ':';
1176 #endif
1177 		s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
1178 			     s, strend, path_sep, &i);
1179 		s++;
1180 		if (i >= (I32)sizeof tmpbuf   /* too long -- assume the worst */
1181 #ifdef VMS
1182 		      || !strchr(tmpbuf, ':') /* no colon thus no device name -- assume relative path */
1183 #else
1184 		      || *tmpbuf != '/'       /* no starting slash -- assume relative path */
1185 #endif
1186 		      || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1187 		    MgTAINTEDDIR_on(mg);
1188 		    return 0;
1189 		}
1190 	    }
1191 	}
1192     }
1193 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1194 
1195     return 0;
1196 }
1197 
1198 int
1199 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1200 {
1201     PERL_ARGS_ASSERT_MAGIC_CLEARENV;
1202     PERL_UNUSED_ARG(sv);
1203     my_setenv(MgPV_nolen_const(mg),NULL);
1204     return 0;
1205 }
1206 
1207 int
1208 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1209 {
1210     dVAR;
1211     PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV;
1212     PERL_UNUSED_ARG(mg);
1213 #if defined(VMS)
1214     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1215 #else
1216     if (PL_localizing) {
1217 	HE* entry;
1218 	my_clearenv();
1219 	hv_iterinit(MUTABLE_HV(sv));
1220 	while ((entry = hv_iternext(MUTABLE_HV(sv)))) {
1221 	    I32 keylen;
1222 	    my_setenv(hv_iterkey(entry, &keylen),
1223 		      SvPV_nolen_const(hv_iterval(MUTABLE_HV(sv), entry)));
1224 	}
1225     }
1226 #endif
1227     return 0;
1228 }
1229 
1230 int
1231 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1232 {
1233     dVAR;
1234     PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV;
1235     PERL_UNUSED_ARG(sv);
1236     PERL_UNUSED_ARG(mg);
1237 #if defined(VMS)
1238     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1239 #else
1240     my_clearenv();
1241 #endif
1242     return 0;
1243 }
1244 
1245 #ifndef PERL_MICRO
1246 #ifdef HAS_SIGPROCMASK
1247 static void
1248 restore_sigmask(pTHX_ SV *save_sv)
1249 {
1250     const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1251     (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1252 }
1253 #endif
1254 int
1255 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1256 {
1257     dVAR;
1258     /* Are we fetching a signal entry? */
1259     int i = (I16)mg->mg_private;
1260 
1261     PERL_ARGS_ASSERT_MAGIC_GETSIG;
1262 
1263     if (!i) {
1264         STRLEN siglen;
1265         const char * sig = MgPV_const(mg, siglen);
1266         mg->mg_private = i = whichsig_pvn(sig, siglen);
1267     }
1268 
1269     if (i > 0) {
1270     	if(PL_psig_ptr[i])
1271     	    sv_setsv(sv,PL_psig_ptr[i]);
1272     	else {
1273 	    Sighandler_t sigstate = rsignal_state(i);
1274 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1275 	    if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1276 		sigstate = SIG_IGN;
1277 #endif
1278 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1279 	    if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1280 		sigstate = SIG_DFL;
1281 #endif
1282     	    /* cache state so we don't fetch it again */
1283     	    if(sigstate == (Sighandler_t) SIG_IGN)
1284     	    	sv_setpvs(sv,"IGNORE");
1285     	    else
1286     	    	sv_setsv(sv,&PL_sv_undef);
1287 	    PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1288     	    SvTEMP_off(sv);
1289     	}
1290     }
1291     return 0;
1292 }
1293 int
1294 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1295 {
1296     PERL_ARGS_ASSERT_MAGIC_CLEARSIG;
1297 
1298     magic_setsig(NULL, mg);
1299     return sv_unmagic(sv, mg->mg_type);
1300 }
1301 
1302 Signal_t
1303 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1304 Perl_csighandler(int sig, siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
1305 #else
1306 Perl_csighandler(int sig)
1307 #endif
1308 {
1309 #ifdef PERL_GET_SIG_CONTEXT
1310     dTHXa(PERL_GET_SIG_CONTEXT);
1311 #else
1312     dTHX;
1313 #endif
1314 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1315     (void) rsignal(sig, PL_csighandlerp);
1316     if (PL_sig_ignoring[sig]) return;
1317 #endif
1318 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1319     if (PL_sig_defaulting[sig])
1320 #ifdef KILL_BY_SIGPRC
1321             exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1322 #else
1323             exit(1);
1324 #endif
1325 #endif
1326     if (
1327 #ifdef SIGILL
1328 	   sig == SIGILL ||
1329 #endif
1330 #ifdef SIGBUS
1331 	   sig == SIGBUS ||
1332 #endif
1333 #ifdef SIGSEGV
1334 	   sig == SIGSEGV ||
1335 #endif
1336 	   (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1337 	/* Call the perl level handler now--
1338 	 * with risk we may be in malloc() or being destructed etc. */
1339 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1340 	(*PL_sighandlerp)(sig, NULL, NULL);
1341 #else
1342 	(*PL_sighandlerp)(sig);
1343 #endif
1344     else {
1345 	if (!PL_psig_pend) return;
1346 	/* Set a flag to say this signal is pending, that is awaiting delivery after
1347 	 * the current Perl opcode completes */
1348 	PL_psig_pend[sig]++;
1349 
1350 #ifndef SIG_PENDING_DIE_COUNT
1351 #  define SIG_PENDING_DIE_COUNT 120
1352 #endif
1353 	/* Add one to say _a_ signal is pending */
1354 	if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1355 	    Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1356 		       (unsigned long)SIG_PENDING_DIE_COUNT);
1357     }
1358 }
1359 
1360 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1361 void
1362 Perl_csighandler_init(void)
1363 {
1364     int sig;
1365     if (PL_sig_handlers_initted) return;
1366 
1367     for (sig = 1; sig < SIG_SIZE; sig++) {
1368 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1369         dTHX;
1370         PL_sig_defaulting[sig] = 1;
1371         (void) rsignal(sig, PL_csighandlerp);
1372 #endif
1373 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1374         PL_sig_ignoring[sig] = 0;
1375 #endif
1376     }
1377     PL_sig_handlers_initted = 1;
1378 }
1379 #endif
1380 
1381 #if defined HAS_SIGPROCMASK
1382 static void
1383 unblock_sigmask(pTHX_ void* newset)
1384 {
1385     sigprocmask(SIG_UNBLOCK, (sigset_t*)newset, NULL);
1386 }
1387 #endif
1388 
1389 void
1390 Perl_despatch_signals(pTHX)
1391 {
1392     dVAR;
1393     int sig;
1394     PL_sig_pending = 0;
1395     for (sig = 1; sig < SIG_SIZE; sig++) {
1396 	if (PL_psig_pend[sig]) {
1397 	    dSAVE_ERRNO;
1398 #ifdef HAS_SIGPROCMASK
1399 	    /* From sigaction(2) (FreeBSD man page):
1400 	     * | Signal routines normally execute with the signal that
1401 	     * | caused their invocation blocked, but other signals may
1402 	     * | yet occur.
1403 	     * Emulation of this behavior (from within Perl) is enabled
1404 	     * using sigprocmask
1405 	     */
1406 	    int was_blocked;
1407 	    sigset_t newset, oldset;
1408 
1409 	    sigemptyset(&newset);
1410 	    sigaddset(&newset, sig);
1411 	    sigprocmask(SIG_BLOCK, &newset, &oldset);
1412 	    was_blocked = sigismember(&oldset, sig);
1413 	    if (!was_blocked) {
1414 		SV* save_sv = newSVpvn((char *)(&newset), sizeof(sigset_t));
1415 		ENTER;
1416 		SAVEFREESV(save_sv);
1417 		SAVEDESTRUCTOR_X(unblock_sigmask, SvPV_nolen(save_sv));
1418 	    }
1419 #endif
1420  	    PL_psig_pend[sig] = 0;
1421 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1422 	    (*PL_sighandlerp)(sig, NULL, NULL);
1423 #else
1424 	    (*PL_sighandlerp)(sig);
1425 #endif
1426 #ifdef HAS_SIGPROCMASK
1427 	    if (!was_blocked)
1428 		LEAVE;
1429 #endif
1430 	    RESTORE_ERRNO;
1431 	}
1432     }
1433 }
1434 
1435 /* sv of NULL signifies that we're acting as magic_clearsig.  */
1436 int
1437 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1438 {
1439     dVAR;
1440     I32 i;
1441     SV** svp = NULL;
1442     /* Need to be careful with SvREFCNT_dec(), because that can have side
1443      * effects (due to closures). We must make sure that the new disposition
1444      * is in place before it is called.
1445      */
1446     SV* to_dec = NULL;
1447     STRLEN len;
1448 #ifdef HAS_SIGPROCMASK
1449     sigset_t set, save;
1450     SV* save_sv;
1451 #endif
1452     const char *s = MgPV_const(mg,len);
1453 
1454     PERL_ARGS_ASSERT_MAGIC_SETSIG;
1455 
1456     if (*s == '_') {
1457         if (memEQs(s, len, "__DIE__"))
1458 	    svp = &PL_diehook;
1459 	else if (memEQs(s, len, "__WARN__")
1460 		 && (sv ? 1 : PL_warnhook != PERL_WARNHOOK_FATAL)) {
1461 	    /* Merge the existing behaviours, which are as follows:
1462 	       magic_setsig, we always set svp to &PL_warnhook
1463 	       (hence we always change the warnings handler)
1464 	       For magic_clearsig, we don't change the warnings handler if it's
1465 	       set to the &PL_warnhook.  */
1466 	    svp = &PL_warnhook;
1467         } else if (sv) {
1468             SV *tmp = sv_newmortal();
1469             Perl_croak(aTHX_ "No such hook: %s",
1470                                 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1471         }
1472 	i = 0;
1473 	if (svp && *svp) {
1474 	    if (*svp != PERL_WARNHOOK_FATAL)
1475 		to_dec = *svp;
1476 	    *svp = NULL;
1477 	}
1478     }
1479     else {
1480 	i = (I16)mg->mg_private;
1481 	if (!i) {
1482 	    i = whichsig_pvn(s, len);   /* ...no, a brick */
1483 	    mg->mg_private = (U16)i;
1484 	}
1485 	if (i <= 0) {
1486 	    if (sv) {
1487                 SV *tmp = sv_newmortal();
1488 		Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s",
1489                                             pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1490             }
1491 	    return 0;
1492 	}
1493 #ifdef HAS_SIGPROCMASK
1494 	/* Avoid having the signal arrive at a bad time, if possible. */
1495 	sigemptyset(&set);
1496 	sigaddset(&set,i);
1497 	sigprocmask(SIG_BLOCK, &set, &save);
1498 	ENTER;
1499 	save_sv = newSVpvn((char *)(&save), sizeof(sigset_t));
1500 	SAVEFREESV(save_sv);
1501 	SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1502 #endif
1503 	PERL_ASYNC_CHECK();
1504 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1505 	if (!PL_sig_handlers_initted) Perl_csighandler_init();
1506 #endif
1507 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1508 	PL_sig_ignoring[i] = 0;
1509 #endif
1510 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1511 	PL_sig_defaulting[i] = 0;
1512 #endif
1513 	to_dec = PL_psig_ptr[i];
1514 	if (sv) {
1515 	    PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1516 	    SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1517 
1518 	    /* Signals don't change name during the program's execution, so once
1519 	       they're cached in the appropriate slot of PL_psig_name, they can
1520 	       stay there.
1521 
1522 	       Ideally we'd find some way of making SVs at (C) compile time, or
1523 	       at least, doing most of the work.  */
1524 	    if (!PL_psig_name[i]) {
1525 		PL_psig_name[i] = newSVpvn(s, len);
1526 		SvREADONLY_on(PL_psig_name[i]);
1527 	    }
1528 	} else {
1529 	    SvREFCNT_dec(PL_psig_name[i]);
1530 	    PL_psig_name[i] = NULL;
1531 	    PL_psig_ptr[i] = NULL;
1532 	}
1533     }
1534     if (sv && (isGV_with_GP(sv) || SvROK(sv))) {
1535 	if (i) {
1536 	    (void)rsignal(i, PL_csighandlerp);
1537 	}
1538 	else
1539 	    *svp = SvREFCNT_inc_simple_NN(sv);
1540     } else {
1541 	if (sv && SvOK(sv)) {
1542 	    s = SvPV_force(sv, len);
1543 	} else {
1544 	    sv = NULL;
1545 	}
1546 	if (sv && memEQs(s, len,"IGNORE")) {
1547 	    if (i) {
1548 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1549 		PL_sig_ignoring[i] = 1;
1550 		(void)rsignal(i, PL_csighandlerp);
1551 #else
1552 		(void)rsignal(i, (Sighandler_t) SIG_IGN);
1553 #endif
1554 	    }
1555 	}
1556 	else if (!sv || memEQs(s, len,"DEFAULT") || !len) {
1557 	    if (i) {
1558 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1559 		PL_sig_defaulting[i] = 1;
1560 		(void)rsignal(i, PL_csighandlerp);
1561 #else
1562 		(void)rsignal(i, (Sighandler_t) SIG_DFL);
1563 #endif
1564 	    }
1565 	}
1566 	else {
1567 	    /*
1568 	     * We should warn if HINT_STRICT_REFS, but without
1569 	     * access to a known hint bit in a known OP, we can't
1570 	     * tell whether HINT_STRICT_REFS is in force or not.
1571 	     */
1572 	    if (!strchr(s,':') && !strchr(s,'\''))
1573 		Perl_sv_insert_flags(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"),
1574 				     SV_GMAGIC);
1575 	    if (i)
1576 		(void)rsignal(i, PL_csighandlerp);
1577 	    else
1578 		*svp = SvREFCNT_inc_simple_NN(sv);
1579 	}
1580     }
1581 
1582 #ifdef HAS_SIGPROCMASK
1583     if(i)
1584 	LEAVE;
1585 #endif
1586     SvREFCNT_dec(to_dec);
1587     return 0;
1588 }
1589 #endif /* !PERL_MICRO */
1590 
1591 int
1592 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1593 {
1594     dVAR;
1595     PERL_ARGS_ASSERT_MAGIC_SETISA;
1596     PERL_UNUSED_ARG(sv);
1597 
1598     /* Skip _isaelem because _isa will handle it shortly */
1599     if (PL_delaymagic & DM_ARRAY_ISA && mg->mg_type == PERL_MAGIC_isaelem)
1600 	return 0;
1601 
1602     return magic_clearisa(NULL, mg);
1603 }
1604 
1605 /* sv of NULL signifies that we're acting as magic_setisa.  */
1606 int
1607 Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
1608 {
1609     dVAR;
1610     HV* stash;
1611 
1612     PERL_ARGS_ASSERT_MAGIC_CLEARISA;
1613 
1614     /* Bail out if destruction is going on */
1615     if(PL_phase == PERL_PHASE_DESTRUCT) return 0;
1616 
1617     if (sv)
1618 	av_clear(MUTABLE_AV(sv));
1619 
1620     if (SvTYPE(mg->mg_obj) != SVt_PVGV && SvSMAGICAL(mg->mg_obj))
1621 	/* This occurs with setisa_elem magic, which calls this
1622 	   same function. */
1623 	mg = mg_find(mg->mg_obj, PERL_MAGIC_isa);
1624 
1625     if (SvTYPE(mg->mg_obj) == SVt_PVAV) { /* multiple stashes */
1626 	SV **svp = AvARRAY((AV *)mg->mg_obj);
1627 	I32 items = AvFILLp((AV *)mg->mg_obj) + 1;
1628 	while (items--) {
1629 	    stash = GvSTASH((GV *)*svp++);
1630 	    if (stash && HvENAME(stash)) mro_isa_changed_in(stash);
1631 	}
1632 
1633 	return 0;
1634     }
1635 
1636     stash = GvSTASH(
1637         (const GV *)mg->mg_obj
1638     );
1639 
1640     /* The stash may have been detached from the symbol table, so check its
1641        name before doing anything. */
1642     if (stash && HvENAME_get(stash))
1643 	mro_isa_changed_in(stash);
1644 
1645     return 0;
1646 }
1647 
1648 int
1649 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1650 {
1651     HV * const hv = MUTABLE_HV(LvTARG(sv));
1652     I32 i = 0;
1653 
1654     PERL_ARGS_ASSERT_MAGIC_GETNKEYS;
1655     PERL_UNUSED_ARG(mg);
1656 
1657     if (hv) {
1658          (void) hv_iterinit(hv);
1659          if (! SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
1660 	     i = HvUSEDKEYS(hv);
1661          else {
1662 	     while (hv_iternext(hv))
1663 	         i++;
1664          }
1665     }
1666 
1667     sv_setiv(sv, (IV)i);
1668     return 0;
1669 }
1670 
1671 int
1672 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1673 {
1674     PERL_ARGS_ASSERT_MAGIC_SETNKEYS;
1675     PERL_UNUSED_ARG(mg);
1676     if (LvTARG(sv)) {
1677 	hv_ksplit(MUTABLE_HV(LvTARG(sv)), SvIV(sv));
1678     }
1679     return 0;
1680 }
1681 
1682 /*
1683 =for apidoc magic_methcall
1684 
1685 Invoke a magic method (like FETCH).
1686 
1687 C<sv> and C<mg> are the tied thingy and the tie magic.
1688 
1689 C<meth> is the name of the method to call.
1690 
1691 C<argc> is the number of args (in addition to $self) to pass to the method.
1692 
1693 The C<flags> can be:
1694 
1695     G_DISCARD     invoke method with G_DISCARD flag and don't
1696                   return a value
1697     G_UNDEF_FILL  fill the stack with argc pointers to
1698                   PL_sv_undef
1699 
1700 The arguments themselves are any values following the C<flags> argument.
1701 
1702 Returns the SV (if any) returned by the method, or NULL on failure.
1703 
1704 
1705 =cut
1706 */
1707 
1708 SV*
1709 Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, U32 flags,
1710 		    U32 argc, ...)
1711 {
1712     dVAR;
1713     dSP;
1714     SV* ret = NULL;
1715 
1716     PERL_ARGS_ASSERT_MAGIC_METHCALL;
1717 
1718     ENTER;
1719 
1720     if (flags & G_WRITING_TO_STDERR) {
1721 	SAVETMPS;
1722 
1723 	save_re_context();
1724 	SAVESPTR(PL_stderrgv);
1725 	PL_stderrgv = NULL;
1726     }
1727 
1728     PUSHSTACKi(PERLSI_MAGIC);
1729     PUSHMARK(SP);
1730 
1731     EXTEND(SP, argc+1);
1732     PUSHs(SvTIED_obj(sv, mg));
1733     if (flags & G_UNDEF_FILL) {
1734 	while (argc--) {
1735 	    PUSHs(&PL_sv_undef);
1736 	}
1737     } else if (argc > 0) {
1738 	va_list args;
1739 	va_start(args, argc);
1740 
1741 	do {
1742 	    SV *const sv = va_arg(args, SV *);
1743 	    PUSHs(sv);
1744 	} while (--argc);
1745 
1746 	va_end(args);
1747     }
1748     PUTBACK;
1749     if (flags & G_DISCARD) {
1750 	call_method(meth, G_SCALAR|G_DISCARD);
1751     }
1752     else {
1753 	if (call_method(meth, G_SCALAR))
1754 	    ret = *PL_stack_sp--;
1755     }
1756     POPSTACK;
1757     if (flags & G_WRITING_TO_STDERR)
1758 	FREETMPS;
1759     LEAVE;
1760     return ret;
1761 }
1762 
1763 
1764 /* wrapper for magic_methcall that creates the first arg */
1765 
1766 STATIC SV*
1767 S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, const char *meth, U32 flags,
1768     int n, SV *val)
1769 {
1770     dVAR;
1771     SV* arg1 = NULL;
1772 
1773     PERL_ARGS_ASSERT_MAGIC_METHCALL1;
1774 
1775     if (mg->mg_ptr) {
1776 	if (mg->mg_len >= 0) {
1777 	    arg1 = newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
1778 	}
1779 	else if (mg->mg_len == HEf_SVKEY)
1780 	    arg1 = MUTABLE_SV(mg->mg_ptr);
1781     }
1782     else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1783 	arg1 = newSViv((IV)(mg->mg_len));
1784 	sv_2mortal(arg1);
1785     }
1786     if (!arg1) {
1787 	return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n - 1, val);
1788     }
1789     return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n, arg1, val);
1790 }
1791 
1792 STATIC int
1793 S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
1794 {
1795     dVAR;
1796     SV* ret;
1797 
1798     PERL_ARGS_ASSERT_MAGIC_METHPACK;
1799 
1800     ret = magic_methcall1(sv, mg, meth, 0, 1, NULL);
1801     if (ret)
1802 	sv_setsv(sv, ret);
1803     return 0;
1804 }
1805 
1806 int
1807 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1808 {
1809     PERL_ARGS_ASSERT_MAGIC_GETPACK;
1810 
1811     if (mg->mg_type == PERL_MAGIC_tiedelem)
1812 	mg->mg_flags |= MGf_GSKIP;
1813     magic_methpack(sv,mg,"FETCH");
1814     return 0;
1815 }
1816 
1817 int
1818 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1819 {
1820     dVAR;
1821     MAGIC *tmg;
1822     SV    *val;
1823 
1824     PERL_ARGS_ASSERT_MAGIC_SETPACK;
1825 
1826     /* in the code C<$tied{foo} = $val>, the "thing" that gets passed to
1827      * STORE() is not $val, but rather a PVLV (the sv in this call), whose
1828      * public flags indicate its value based on copying from $val. Doing
1829      * mg_set() on the PVLV temporarily does SvMAGICAL_off(), then calls us.
1830      * So STORE()'s $_[2] arg is a temporarily disarmed PVLV. This goes
1831      * wrong if $val happened to be tainted, as sv hasn't got magic
1832      * enabled, even though taint magic is in the chain. In which case,
1833      * fake up a temporary tainted value (this is easier than temporarily
1834      * re-enabling magic on sv). */
1835 
1836     if (TAINTING_get && (tmg = mg_find(sv, PERL_MAGIC_taint))
1837 	&& (tmg->mg_len & 1))
1838     {
1839 	val = sv_mortalcopy(sv);
1840 	SvTAINTED_on(val);
1841     }
1842     else
1843 	val = sv;
1844 
1845     magic_methcall1(sv, mg, "STORE", G_DISCARD, 2, val);
1846     return 0;
1847 }
1848 
1849 int
1850 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1851 {
1852     PERL_ARGS_ASSERT_MAGIC_CLEARPACK;
1853 
1854     if (mg->mg_type == PERL_MAGIC_tiedscalar) return 0;
1855     return magic_methpack(sv,mg,"DELETE");
1856 }
1857 
1858 
1859 U32
1860 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1861 {
1862     dVAR;
1863     I32 retval = 0;
1864     SV* retsv;
1865 
1866     PERL_ARGS_ASSERT_MAGIC_SIZEPACK;
1867 
1868     retsv = magic_methcall1(sv, mg, "FETCHSIZE", 0, 1, NULL);
1869     if (retsv) {
1870 	retval = SvIV(retsv)-1;
1871 	if (retval < -1)
1872 	    Perl_croak(aTHX_ "FETCHSIZE returned a negative value");
1873     }
1874     return (U32) retval;
1875 }
1876 
1877 int
1878 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1879 {
1880     dVAR;
1881 
1882     PERL_ARGS_ASSERT_MAGIC_WIPEPACK;
1883 
1884     Perl_magic_methcall(aTHX_ sv, mg, "CLEAR", G_DISCARD, 0);
1885     return 0;
1886 }
1887 
1888 int
1889 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1890 {
1891     dVAR;
1892     SV* ret;
1893 
1894     PERL_ARGS_ASSERT_MAGIC_NEXTPACK;
1895 
1896     ret = SvOK(key) ? Perl_magic_methcall(aTHX_ sv, mg, "NEXTKEY", 0, 1, key)
1897 	: Perl_magic_methcall(aTHX_ sv, mg, "FIRSTKEY", 0, 0);
1898     if (ret)
1899 	sv_setsv(key,ret);
1900     return 0;
1901 }
1902 
1903 int
1904 Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
1905 {
1906     PERL_ARGS_ASSERT_MAGIC_EXISTSPACK;
1907 
1908     return magic_methpack(sv,mg,"EXISTS");
1909 }
1910 
1911 SV *
1912 Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1913 {
1914     dVAR;
1915     SV *retval;
1916     SV * const tied = SvTIED_obj(MUTABLE_SV(hv), mg);
1917     HV * const pkg = SvSTASH((const SV *)SvRV(tied));
1918 
1919     PERL_ARGS_ASSERT_MAGIC_SCALARPACK;
1920 
1921     if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1922         SV *key;
1923         if (HvEITER_get(hv))
1924             /* we are in an iteration so the hash cannot be empty */
1925             return &PL_sv_yes;
1926         /* no xhv_eiter so now use FIRSTKEY */
1927         key = sv_newmortal();
1928         magic_nextpack(MUTABLE_SV(hv), mg, key);
1929         HvEITER_set(hv, NULL);     /* need to reset iterator */
1930         return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1931     }
1932 
1933     /* there is a SCALAR method that we can call */
1934     retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(hv), mg, "SCALAR", 0, 0);
1935     if (!retval)
1936 	retval = &PL_sv_undef;
1937     return retval;
1938 }
1939 
1940 int
1941 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1942 {
1943     dVAR;
1944     GV * const gv = PL_DBline;
1945     const I32 i = SvTRUE(sv);
1946     SV ** const svp = av_fetch(GvAV(gv),
1947 		     atoi(MgPV_nolen_const(mg)), FALSE);
1948 
1949     PERL_ARGS_ASSERT_MAGIC_SETDBLINE;
1950 
1951     if (svp && SvIOKp(*svp)) {
1952 	OP * const o = INT2PTR(OP*,SvIVX(*svp));
1953 	if (o) {
1954 #ifdef PERL_DEBUG_READONLY_OPS
1955 	    Slab_to_rw(OpSLAB(o));
1956 #endif
1957 	    /* set or clear breakpoint in the relevant control op */
1958 	    if (i)
1959 		o->op_flags |= OPf_SPECIAL;
1960 	    else
1961 		o->op_flags &= ~OPf_SPECIAL;
1962 #ifdef PERL_DEBUG_READONLY_OPS
1963 	    Slab_to_ro(OpSLAB(o));
1964 #endif
1965 	}
1966     }
1967     return 0;
1968 }
1969 
1970 int
1971 Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
1972 {
1973     dVAR;
1974     AV * const obj = MUTABLE_AV(mg->mg_obj);
1975 
1976     PERL_ARGS_ASSERT_MAGIC_GETARYLEN;
1977 
1978     if (obj) {
1979 	sv_setiv(sv, AvFILL(obj));
1980     } else {
1981 	SvOK_off(sv);
1982     }
1983     return 0;
1984 }
1985 
1986 int
1987 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1988 {
1989     dVAR;
1990     AV * const obj = MUTABLE_AV(mg->mg_obj);
1991 
1992     PERL_ARGS_ASSERT_MAGIC_SETARYLEN;
1993 
1994     if (obj) {
1995 	av_fill(obj, SvIV(sv));
1996     } else {
1997 	Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1998 		       "Attempt to set length of freed array");
1999     }
2000     return 0;
2001 }
2002 
2003 int
2004 Perl_magic_cleararylen_p(pTHX_ SV *sv, MAGIC *mg)
2005 {
2006     dVAR;
2007 
2008     PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P;
2009     PERL_UNUSED_ARG(sv);
2010 
2011     /* Reset the iterator when the array is cleared */
2012 #if IVSIZE == I32SIZE
2013     *((IV *) &(mg->mg_len)) = 0;
2014 #else
2015     if (mg->mg_ptr)
2016         *((IV *) mg->mg_ptr) = 0;
2017 #endif
2018 
2019     return 0;
2020 }
2021 
2022 int
2023 Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
2024 {
2025     dVAR;
2026 
2027     PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P;
2028     PERL_UNUSED_ARG(sv);
2029 
2030     /* during global destruction, mg_obj may already have been freed */
2031     if (PL_in_clean_all)
2032 	return 0;
2033 
2034     mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
2035 
2036     if (mg) {
2037 	/* arylen scalar holds a pointer back to the array, but doesn't own a
2038 	   reference. Hence the we (the array) are about to go away with it
2039 	   still pointing at us. Clear its pointer, else it would be pointing
2040 	   at free memory. See the comment in sv_magic about reference loops,
2041 	   and why it can't own a reference to us.  */
2042 	mg->mg_obj = 0;
2043     }
2044     return 0;
2045 }
2046 
2047 int
2048 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
2049 {
2050     dVAR;
2051     SV* const lsv = LvTARG(sv);
2052 
2053     PERL_ARGS_ASSERT_MAGIC_GETPOS;
2054     PERL_UNUSED_ARG(mg);
2055 
2056     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
2057 	MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
2058 	if (found && found->mg_len >= 0) {
2059 	    I32 i = found->mg_len;
2060 	    if (DO_UTF8(lsv))
2061 		sv_pos_b2u(lsv, &i);
2062 	    sv_setiv(sv, i);
2063 	    return 0;
2064 	}
2065     }
2066     SvOK_off(sv);
2067     return 0;
2068 }
2069 
2070 int
2071 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
2072 {
2073     dVAR;
2074     SV* const lsv = LvTARG(sv);
2075     SSize_t pos;
2076     STRLEN len;
2077     STRLEN ulen = 0;
2078     MAGIC* found;
2079     const char *s;
2080 
2081     PERL_ARGS_ASSERT_MAGIC_SETPOS;
2082     PERL_UNUSED_ARG(mg);
2083 
2084     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
2085 	found = mg_find(lsv, PERL_MAGIC_regex_global);
2086     else
2087 	found = NULL;
2088     if (!found) {
2089 	if (!SvOK(sv))
2090 	    return 0;
2091 #ifdef PERL_OLD_COPY_ON_WRITE
2092     if (SvIsCOW(lsv))
2093         sv_force_normal_flags(lsv, 0);
2094 #endif
2095 	found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
2096 			    NULL, 0);
2097     }
2098     else if (!SvOK(sv)) {
2099 	found->mg_len = -1;
2100 	return 0;
2101     }
2102     s = SvPV_const(lsv, len);
2103 
2104     pos = SvIV(sv);
2105 
2106     if (DO_UTF8(lsv)) {
2107 	ulen = sv_or_pv_len_utf8(lsv, s, len);
2108 	if (ulen)
2109 	    len = ulen;
2110     }
2111 
2112     if (pos < 0) {
2113 	pos += len;
2114 	if (pos < 0)
2115 	    pos = 0;
2116     }
2117     else if (pos > (SSize_t)len)
2118 	pos = len;
2119 
2120     if (ulen) {
2121 	pos = sv_or_pv_pos_u2b(lsv, s, pos, 0);
2122     }
2123 
2124     found->mg_len = pos;
2125     found->mg_flags &= ~MGf_MINMATCH;
2126 
2127     return 0;
2128 }
2129 
2130 int
2131 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
2132 {
2133     STRLEN len;
2134     SV * const lsv = LvTARG(sv);
2135     const char * const tmps = SvPV_const(lsv,len);
2136     STRLEN offs = LvTARGOFF(sv);
2137     STRLEN rem = LvTARGLEN(sv);
2138     const bool negoff = LvFLAGS(sv) & 1;
2139     const bool negrem = LvFLAGS(sv) & 2;
2140 
2141     PERL_ARGS_ASSERT_MAGIC_GETSUBSTR;
2142     PERL_UNUSED_ARG(mg);
2143 
2144     if (!translate_substr_offsets(
2145 	    SvUTF8(lsv) ? sv_or_pv_len_utf8(lsv, tmps, len) : len,
2146 	    negoff ? -(IV)offs : (IV)offs, !negoff,
2147 	    negrem ? -(IV)rem  : (IV)rem,  !negrem, &offs, &rem
2148     )) {
2149 	Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
2150 	sv_setsv_nomg(sv, &PL_sv_undef);
2151 	return 0;
2152     }
2153 
2154     if (SvUTF8(lsv))
2155 	offs = sv_or_pv_pos_u2b(lsv, tmps, offs, &rem);
2156     sv_setpvn(sv, tmps + offs, rem);
2157     if (SvUTF8(lsv))
2158         SvUTF8_on(sv);
2159     return 0;
2160 }
2161 
2162 int
2163 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
2164 {
2165     dVAR;
2166     STRLEN len, lsv_len, oldtarglen, newtarglen;
2167     const char * const tmps = SvPV_const(sv, len);
2168     SV * const lsv = LvTARG(sv);
2169     STRLEN lvoff = LvTARGOFF(sv);
2170     STRLEN lvlen = LvTARGLEN(sv);
2171     const bool negoff = LvFLAGS(sv) & 1;
2172     const bool neglen = LvFLAGS(sv) & 2;
2173 
2174     PERL_ARGS_ASSERT_MAGIC_SETSUBSTR;
2175     PERL_UNUSED_ARG(mg);
2176 
2177     SvGETMAGIC(lsv);
2178     if (SvROK(lsv))
2179 	Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
2180 			    "Attempt to use reference as lvalue in substr"
2181 	);
2182     SvPV_force_nomg(lsv,lsv_len);
2183     if (SvUTF8(lsv)) lsv_len = sv_len_utf8_nomg(lsv);
2184     if (!translate_substr_offsets(
2185 	    lsv_len,
2186 	    negoff ? -(IV)lvoff : (IV)lvoff, !negoff,
2187 	    neglen ? -(IV)lvlen : (IV)lvlen, !neglen, &lvoff, &lvlen
2188     ))
2189 	Perl_croak(aTHX_ "substr outside of string");
2190     oldtarglen = lvlen;
2191     if (DO_UTF8(sv)) {
2192 	sv_utf8_upgrade_nomg(lsv);
2193 	lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2194 	sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
2195 	newtarglen = sv_or_pv_len_utf8(sv, tmps, len);
2196 	SvUTF8_on(lsv);
2197     }
2198     else if (SvUTF8(lsv)) {
2199 	const char *utf8;
2200 	lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2201 	newtarglen = len;
2202 	utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
2203 	sv_insert_flags(lsv, lvoff, lvlen, utf8, len, 0);
2204 	Safefree(utf8);
2205     }
2206     else {
2207 	sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
2208 	newtarglen = len;
2209     }
2210     if (!neglen) LvTARGLEN(sv) = newtarglen;
2211     if (negoff)  LvTARGOFF(sv) += newtarglen - oldtarglen;
2212 
2213     return 0;
2214 }
2215 
2216 int
2217 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
2218 {
2219     dVAR;
2220 
2221     PERL_ARGS_ASSERT_MAGIC_GETTAINT;
2222     PERL_UNUSED_ARG(sv);
2223 #ifdef NO_TAINT_SUPPORT
2224     PERL_UNUSED_ARG(mg);
2225 #endif
2226 
2227     TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
2228     return 0;
2229 }
2230 
2231 int
2232 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
2233 {
2234     dVAR;
2235 
2236     PERL_ARGS_ASSERT_MAGIC_SETTAINT;
2237     PERL_UNUSED_ARG(sv);
2238 
2239     /* update taint status */
2240     if (TAINT_get)
2241 	mg->mg_len |= 1;
2242     else
2243 	mg->mg_len &= ~1;
2244     return 0;
2245 }
2246 
2247 int
2248 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
2249 {
2250     SV * const lsv = LvTARG(sv);
2251 
2252     PERL_ARGS_ASSERT_MAGIC_GETVEC;
2253     PERL_UNUSED_ARG(mg);
2254 
2255     if (lsv)
2256 	sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
2257     else
2258 	SvOK_off(sv);
2259 
2260     return 0;
2261 }
2262 
2263 int
2264 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
2265 {
2266     PERL_ARGS_ASSERT_MAGIC_SETVEC;
2267     PERL_UNUSED_ARG(mg);
2268     do_vecset(sv);	/* XXX slurp this routine */
2269     return 0;
2270 }
2271 
2272 int
2273 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2274 {
2275     dVAR;
2276     SV *targ = NULL;
2277 
2278     PERL_ARGS_ASSERT_MAGIC_GETDEFELEM;
2279 
2280     if (LvTARGLEN(sv)) {
2281 	if (mg->mg_obj) {
2282 	    SV * const ahv = LvTARG(sv);
2283 	    HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, FALSE, 0);
2284             if (he)
2285                 targ = HeVAL(he);
2286 	}
2287 	else {
2288 	    AV *const av = MUTABLE_AV(LvTARG(sv));
2289 	    if ((I32)LvTARGOFF(sv) <= AvFILL(av))
2290 		targ = AvARRAY(av)[LvTARGOFF(sv)];
2291 	}
2292 	if (targ && (targ != &PL_sv_undef)) {
2293 	    /* somebody else defined it for us */
2294 	    SvREFCNT_dec(LvTARG(sv));
2295 	    LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2296 	    LvTARGLEN(sv) = 0;
2297 	    SvREFCNT_dec(mg->mg_obj);
2298 	    mg->mg_obj = NULL;
2299 	    mg->mg_flags &= ~MGf_REFCOUNTED;
2300 	}
2301     }
2302     else
2303 	targ = LvTARG(sv);
2304     sv_setsv(sv, targ ? targ : &PL_sv_undef);
2305     return 0;
2306 }
2307 
2308 int
2309 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2310 {
2311     PERL_ARGS_ASSERT_MAGIC_SETDEFELEM;
2312     PERL_UNUSED_ARG(mg);
2313     if (LvTARGLEN(sv))
2314 	vivify_defelem(sv);
2315     if (LvTARG(sv)) {
2316 	sv_setsv(LvTARG(sv), sv);
2317 	SvSETMAGIC(LvTARG(sv));
2318     }
2319     return 0;
2320 }
2321 
2322 void
2323 Perl_vivify_defelem(pTHX_ SV *sv)
2324 {
2325     dVAR;
2326     MAGIC *mg;
2327     SV *value = NULL;
2328 
2329     PERL_ARGS_ASSERT_VIVIFY_DEFELEM;
2330 
2331     if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2332 	return;
2333     if (mg->mg_obj) {
2334 	SV * const ahv = LvTARG(sv);
2335 	HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, TRUE, 0);
2336         if (he)
2337             value = HeVAL(he);
2338 	if (!value || value == &PL_sv_undef)
2339 	    Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
2340     }
2341     else {
2342 	AV *const av = MUTABLE_AV(LvTARG(sv));
2343 	if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
2344 	    LvTARG(sv) = NULL;	/* array can't be extended */
2345 	else {
2346 	    SV* const * const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
2347 	    if (!svp || (value = *svp) == &PL_sv_undef)
2348 		Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
2349 	}
2350     }
2351     SvREFCNT_inc_simple_void(value);
2352     SvREFCNT_dec(LvTARG(sv));
2353     LvTARG(sv) = value;
2354     LvTARGLEN(sv) = 0;
2355     SvREFCNT_dec(mg->mg_obj);
2356     mg->mg_obj = NULL;
2357     mg->mg_flags &= ~MGf_REFCOUNTED;
2358 }
2359 
2360 int
2361 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2362 {
2363     PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS;
2364     Perl_sv_kill_backrefs(aTHX_ sv, MUTABLE_AV(mg->mg_obj));
2365     return 0;
2366 }
2367 
2368 int
2369 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2370 {
2371     PERL_ARGS_ASSERT_MAGIC_SETMGLOB;
2372     PERL_UNUSED_CONTEXT;
2373     PERL_UNUSED_ARG(sv);
2374     mg->mg_len = -1;
2375     return 0;
2376 }
2377 
2378 int
2379 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2380 {
2381     const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2382 
2383     PERL_ARGS_ASSERT_MAGIC_SETUVAR;
2384 
2385     if (uf && uf->uf_set)
2386 	(*uf->uf_set)(aTHX_ uf->uf_index, sv);
2387     return 0;
2388 }
2389 
2390 int
2391 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2392 {
2393     const char type = mg->mg_type;
2394 
2395     PERL_ARGS_ASSERT_MAGIC_SETREGEXP;
2396 
2397     if (type == PERL_MAGIC_qr) {
2398     } else if (type == PERL_MAGIC_bm) {
2399 	SvTAIL_off(sv);
2400 	SvVALID_off(sv);
2401     } else {
2402 	assert(type == PERL_MAGIC_fm);
2403     }
2404     return sv_unmagic(sv, type);
2405 }
2406 
2407 #ifdef USE_LOCALE_COLLATE
2408 int
2409 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2410 {
2411     PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM;
2412 
2413     /*
2414      * RenE<eacute> Descartes said "I think not."
2415      * and vanished with a faint plop.
2416      */
2417     PERL_UNUSED_CONTEXT;
2418     PERL_UNUSED_ARG(sv);
2419     if (mg->mg_ptr) {
2420 	Safefree(mg->mg_ptr);
2421 	mg->mg_ptr = NULL;
2422 	mg->mg_len = -1;
2423     }
2424     return 0;
2425 }
2426 #endif /* USE_LOCALE_COLLATE */
2427 
2428 /* Just clear the UTF-8 cache data. */
2429 int
2430 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2431 {
2432     PERL_ARGS_ASSERT_MAGIC_SETUTF8;
2433     PERL_UNUSED_CONTEXT;
2434     PERL_UNUSED_ARG(sv);
2435     Safefree(mg->mg_ptr);	/* The mg_ptr holds the pos cache. */
2436     mg->mg_ptr = NULL;
2437     mg->mg_len = -1;		/* The mg_len holds the len cache. */
2438     return 0;
2439 }
2440 
2441 int
2442 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2443 {
2444     dVAR;
2445     const char *s;
2446     I32 paren;
2447     const REGEXP * rx;
2448     const char * const remaining = mg->mg_ptr + 1;
2449     I32 i;
2450     STRLEN len;
2451     MAGIC *tmg;
2452 
2453     PERL_ARGS_ASSERT_MAGIC_SET;
2454 
2455     switch (*mg->mg_ptr) {
2456     case '\015': /* $^MATCH */
2457       if (strEQ(remaining, "ATCH"))
2458           goto do_match;
2459     case '`': /* ${^PREMATCH} caught below */
2460       do_prematch:
2461       paren = RX_BUFF_IDX_PREMATCH;
2462       goto setparen;
2463     case '\'': /* ${^POSTMATCH} caught below */
2464       do_postmatch:
2465       paren = RX_BUFF_IDX_POSTMATCH;
2466       goto setparen;
2467     case '&':
2468       do_match:
2469       paren = RX_BUFF_IDX_FULLMATCH;
2470       goto setparen;
2471     case '1': case '2': case '3': case '4':
2472     case '5': case '6': case '7': case '8': case '9':
2473       paren = atoi(mg->mg_ptr);
2474       setparen:
2475 	if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
2476       setparen_got_rx:
2477             CALLREG_NUMBUF_STORE((REGEXP * const)rx,paren,sv);
2478 	} else {
2479             /* Croak with a READONLY error when a numbered match var is
2480              * set without a previous pattern match. Unless it's C<local $1>
2481              */
2482       croakparen:
2483             if (!PL_localizing) {
2484                 Perl_croak_no_modify();
2485             }
2486         }
2487         break;
2488     case '\001':	/* ^A */
2489 	if (SvOK(sv)) sv_copypv(PL_bodytarget, sv);
2490 	else SvOK_off(PL_bodytarget);
2491 	FmLINES(PL_bodytarget) = 0;
2492 	if (SvPOK(PL_bodytarget)) {
2493 	    char *s = SvPVX(PL_bodytarget);
2494 	    while ( ((s = strchr(s, '\n'))) ) {
2495 		FmLINES(PL_bodytarget)++;
2496 		s++;
2497 	    }
2498 	}
2499 	/* mg_set() has temporarily made sv non-magical */
2500 	if (TAINTING_get) {
2501 	    if ((tmg = mg_find(sv,PERL_MAGIC_taint)) && tmg->mg_len & 1)
2502 		SvTAINTED_on(PL_bodytarget);
2503 	    else
2504 		SvTAINTED_off(PL_bodytarget);
2505 	}
2506 	break;
2507     case '\003':	/* ^C */
2508 	PL_minus_c = cBOOL(SvIV(sv));
2509 	break;
2510 
2511     case '\004':	/* ^D */
2512 #ifdef DEBUGGING
2513 	s = SvPV_nolen_const(sv);
2514 	PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2515 	if (DEBUG_x_TEST || DEBUG_B_TEST)
2516 	    dump_all_perl(!DEBUG_B_TEST);
2517 #else
2518 	PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2519 #endif
2520 	break;
2521     case '\005':  /* ^E */
2522 	if (*(mg->mg_ptr+1) == '\0') {
2523 #ifdef VMS
2524 	    set_vaxc_errno(SvIV(sv));
2525 #else
2526 #  ifdef WIN32
2527 	    SetLastError( SvIV(sv) );
2528 #  else
2529 #    ifdef OS2
2530 	    os2_setsyserrno(SvIV(sv));
2531 #    else
2532 	    /* will anyone ever use this? */
2533 	    SETERRNO(SvIV(sv), 4);
2534 #    endif
2535 #  endif
2536 #endif
2537 	}
2538 	else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2539 	    SvREFCNT_dec(PL_encoding);
2540 	    if (SvOK(sv) || SvGMAGICAL(sv)) {
2541 		PL_encoding = newSVsv(sv);
2542 	    }
2543 	    else {
2544 		PL_encoding = NULL;
2545 	    }
2546 	}
2547 	break;
2548     case '\006':	/* ^F */
2549 	PL_maxsysfd = SvIV(sv);
2550 	break;
2551     case '\010':	/* ^H */
2552 	PL_hints = SvIV(sv);
2553 	break;
2554     case '\011':	/* ^I */ /* NOT \t in EBCDIC */
2555 	Safefree(PL_inplace);
2556 	PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2557 	break;
2558     case '\016':	/* ^N */
2559 	if (PL_curpm && (rx = PM_GETRE(PL_curpm))
2560 	 && (paren = RX_LASTCLOSEPAREN(rx))) goto setparen_got_rx;
2561 	goto croakparen;
2562     case '\017':	/* ^O */
2563 	if (*(mg->mg_ptr+1) == '\0') {
2564 	    Safefree(PL_osname);
2565 	    PL_osname = NULL;
2566 	    if (SvOK(sv)) {
2567 		TAINT_PROPER("assigning to $^O");
2568 		PL_osname = savesvpv(sv);
2569 	    }
2570 	}
2571 	else if (strEQ(mg->mg_ptr, "\017PEN")) {
2572 	    STRLEN len;
2573 	    const char *const start = SvPV(sv, len);
2574 	    const char *out = (const char*)memchr(start, '\0', len);
2575 	    SV *tmp;
2576 
2577 
2578 	    PL_compiling.cop_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2579 	    PL_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2580 
2581 	    /* Opening for input is more common than opening for output, so
2582 	       ensure that hints for input are sooner on linked list.  */
2583 	    tmp = out ? newSVpvn_flags(out + 1, start + len - out - 1,
2584 				       SvUTF8(sv))
2585 		: newSVpvs_flags("", SvUTF8(sv));
2586 	    (void)hv_stores(GvHV(PL_hintgv), "open>", tmp);
2587 	    mg_set(tmp);
2588 
2589 	    tmp = newSVpvn_flags(start, out ? (STRLEN)(out - start) : len,
2590 				        SvUTF8(sv));
2591 	    (void)hv_stores(GvHV(PL_hintgv), "open<", tmp);
2592 	    mg_set(tmp);
2593 	}
2594 	break;
2595     case '\020':	/* ^P */
2596       if (*remaining == '\0') { /* ^P */
2597           PL_perldb = SvIV(sv);
2598           if (PL_perldb && !PL_DBsingle)
2599               init_debugger();
2600           break;
2601       } else if (strEQ(remaining, "REMATCH")) { /* $^PREMATCH */
2602           goto do_prematch;
2603       } else if (strEQ(remaining, "OSTMATCH")) { /* $^POSTMATCH */
2604           goto do_postmatch;
2605       }
2606       break;
2607     case '\024':	/* ^T */
2608 #ifdef BIG_TIME
2609 	PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2610 #else
2611 	PL_basetime = (Time_t)SvIV(sv);
2612 #endif
2613 	break;
2614     case '\025':	/* ^UTF8CACHE */
2615 	 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2616 	     PL_utf8cache = (signed char) sv_2iv(sv);
2617 	 }
2618 	 break;
2619     case '\027':	/* ^W & $^WARNING_BITS */
2620 	if (*(mg->mg_ptr+1) == '\0') {
2621 	    if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2622 	        i = SvIV(sv);
2623 	        PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2624 		    		| (i ? G_WARN_ON : G_WARN_OFF) ;
2625 	    }
2626 	}
2627 	else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2628 	    if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2629 		if (!SvPOK(sv)) {
2630 	            PL_compiling.cop_warnings = pWARN_STD;
2631 		    break;
2632 		}
2633 		{
2634 		    STRLEN len, i;
2635 		    int accumulate = 0 ;
2636 		    int any_fatals = 0 ;
2637 		    const char * const ptr = SvPV_const(sv, len) ;
2638 		    for (i = 0 ; i < len ; ++i) {
2639 		        accumulate |= ptr[i] ;
2640 		        any_fatals |= (ptr[i] & 0xAA) ;
2641 		    }
2642 		    if (!accumulate) {
2643 		        if (!specialWARN(PL_compiling.cop_warnings))
2644 			    PerlMemShared_free(PL_compiling.cop_warnings);
2645 			PL_compiling.cop_warnings = pWARN_NONE;
2646 		    }
2647 		    /* Yuck. I can't see how to abstract this:  */
2648 		    else if (isWARN_on(((STRLEN *)SvPV_nolen_const(sv)) - 1,
2649 				       WARN_ALL) && !any_fatals) {
2650 			if (!specialWARN(PL_compiling.cop_warnings))
2651 			    PerlMemShared_free(PL_compiling.cop_warnings);
2652 	                PL_compiling.cop_warnings = pWARN_ALL;
2653 	                PL_dowarn |= G_WARN_ONCE ;
2654 	            }
2655                     else {
2656 			STRLEN len;
2657 			const char *const p = SvPV_const(sv, len);
2658 
2659 			PL_compiling.cop_warnings
2660 			    = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
2661 							 p, len);
2662 
2663 	                if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2664 	                    PL_dowarn |= G_WARN_ONCE ;
2665 	            }
2666 
2667 		}
2668 	    }
2669 	}
2670 	break;
2671     case '.':
2672 	if (PL_localizing) {
2673 	    if (PL_localizing == 1)
2674 		SAVESPTR(PL_last_in_gv);
2675 	}
2676 	else if (SvOK(sv) && GvIO(PL_last_in_gv))
2677 	    IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2678 	break;
2679     case '^':
2680 	Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2681 	s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2682 	IoTOP_GV(GvIOp(PL_defoutgv)) =  gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2683 	break;
2684     case '~':
2685 	Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2686 	s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2687 	IoFMT_GV(GvIOp(PL_defoutgv)) =  gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2688 	break;
2689     case '=':
2690 	IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
2691 	break;
2692     case '-':
2693 	IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2694 	if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2695 		IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2696 	break;
2697     case '%':
2698 	IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
2699 	break;
2700     case '|':
2701 	{
2702 	    IO * const io = GvIO(PL_defoutgv);
2703 	    if(!io)
2704 	      break;
2705 	    if ((SvIV(sv)) == 0)
2706 		IoFLAGS(io) &= ~IOf_FLUSH;
2707 	    else {
2708 		if (!(IoFLAGS(io) & IOf_FLUSH)) {
2709 		    PerlIO *ofp = IoOFP(io);
2710 		    if (ofp)
2711 			(void)PerlIO_flush(ofp);
2712 		    IoFLAGS(io) |= IOf_FLUSH;
2713 		}
2714 	    }
2715 	}
2716 	break;
2717     case '/':
2718 	SvREFCNT_dec(PL_rs);
2719 	PL_rs = newSVsv(sv);
2720 	break;
2721     case '\\':
2722 	SvREFCNT_dec(PL_ors_sv);
2723 	if (SvOK(sv)) {
2724 	    PL_ors_sv = newSVsv(sv);
2725 	}
2726 	else {
2727 	    PL_ors_sv = NULL;
2728 	}
2729 	break;
2730     case '[':
2731 	if (SvIV(sv) != 0)
2732 	    Perl_croak(aTHX_ "Assigning non-zero to $[ is no longer possible");
2733 	break;
2734     case '?':
2735 #ifdef COMPLEX_STATUS
2736 	if (PL_localizing == 2) {
2737 	    SvUPGRADE(sv, SVt_PVLV);
2738 	    PL_statusvalue = LvTARGOFF(sv);
2739 	    PL_statusvalue_vms = LvTARGLEN(sv);
2740 	}
2741 	else
2742 #endif
2743 #ifdef VMSISH_STATUS
2744 	if (VMSISH_STATUS)
2745 	    STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
2746 	else
2747 #endif
2748 	    STATUS_UNIX_EXIT_SET(SvIV(sv));
2749 	break;
2750     case '!':
2751         {
2752 #ifdef VMS
2753 #   define PERL_VMS_BANG vaxc$errno
2754 #else
2755 #   define PERL_VMS_BANG 0
2756 #endif
2757 	SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2758 		 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2759 	}
2760 	break;
2761     case '<':
2762 	{
2763 	const IV new_uid = SvIV(sv);
2764 	PL_delaymagic_uid = new_uid;
2765 	if (PL_delaymagic) {
2766 	    PL_delaymagic |= DM_RUID;
2767 	    break;				/* don't do magic till later */
2768 	}
2769 #ifdef HAS_SETRUID
2770 	(void)setruid((Uid_t)new_uid);
2771 #else
2772 #ifdef HAS_SETREUID
2773 	(void)setreuid((Uid_t)new_uid, (Uid_t)-1);
2774 #else
2775 #ifdef HAS_SETRESUID
2776       (void)setresuid((Uid_t)new_uid, (Uid_t)-1, (Uid_t)-1);
2777 #else
2778 	if (new_uid == PerlProc_geteuid()) {		/* special case $< = $> */
2779 #ifdef PERL_DARWIN
2780 	    /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2781 	    if (new_uid != 0 && PerlProc_getuid() == 0)
2782 		(void)PerlProc_setuid(0);
2783 #endif
2784 	    (void)PerlProc_setuid(new_uid);
2785 	} else {
2786 	    Perl_croak(aTHX_ "setruid() not implemented");
2787 	}
2788 #endif
2789 #endif
2790 #endif
2791 	break;
2792 	}
2793     case '>':
2794 	{
2795 	const UV new_euid = SvIV(sv);
2796 	PL_delaymagic_euid = new_euid;
2797 	if (PL_delaymagic) {
2798 	    PL_delaymagic |= DM_EUID;
2799 	    break;				/* don't do magic till later */
2800 	}
2801 #ifdef HAS_SETEUID
2802 	(void)seteuid((Uid_t)new_euid);
2803 #else
2804 #ifdef HAS_SETREUID
2805 	(void)setreuid((Uid_t)-1, (Uid_t)new_euid);
2806 #else
2807 #ifdef HAS_SETRESUID
2808 	(void)setresuid((Uid_t)-1, (Uid_t)new_euid, (Uid_t)-1);
2809 #else
2810 	if (new_euid == PerlProc_getuid())		/* special case $> = $< */
2811 	    PerlProc_setuid(new_euid);
2812 	else {
2813 	    Perl_croak(aTHX_ "seteuid() not implemented");
2814 	}
2815 #endif
2816 #endif
2817 #endif
2818 	break;
2819 	}
2820     case '(':
2821 	{
2822 	const UV new_gid = SvIV(sv);
2823 	PL_delaymagic_gid = new_gid;
2824 	if (PL_delaymagic) {
2825 	    PL_delaymagic |= DM_RGID;
2826 	    break;				/* don't do magic till later */
2827 	}
2828 #ifdef HAS_SETRGID
2829 	(void)setrgid((Gid_t)new_gid);
2830 #else
2831 #ifdef HAS_SETREGID
2832 	(void)setregid((Gid_t)new_gid, (Gid_t)-1);
2833 #else
2834 #ifdef HAS_SETRESGID
2835       (void)setresgid((Gid_t)new_gid, (Gid_t)-1, (Gid_t) -1);
2836 #else
2837 	if (new_gid == PerlProc_getegid())			/* special case $( = $) */
2838 	    (void)PerlProc_setgid(new_gid);
2839 	else {
2840 	    Perl_croak(aTHX_ "setrgid() not implemented");
2841 	}
2842 #endif
2843 #endif
2844 #endif
2845 	break;
2846 	}
2847     case ')':
2848 	{
2849 	UV new_egid;
2850 #ifdef HAS_SETGROUPS
2851 	{
2852 	    const char *p = SvPV_const(sv, len);
2853             Groups_t *gary = NULL;
2854 #ifdef _SC_NGROUPS_MAX
2855            int maxgrp = sysconf(_SC_NGROUPS_MAX);
2856 
2857            if (maxgrp < 0)
2858                maxgrp = NGROUPS;
2859 #else
2860            int maxgrp = NGROUPS;
2861 #endif
2862 
2863             while (isSPACE(*p))
2864                 ++p;
2865             new_egid = Atol(p);
2866             for (i = 0; i < maxgrp; ++i) {
2867                 while (*p && !isSPACE(*p))
2868                     ++p;
2869                 while (isSPACE(*p))
2870                     ++p;
2871                 if (!*p)
2872                     break;
2873                 if(!gary)
2874                     Newx(gary, i + 1, Groups_t);
2875                 else
2876                     Renew(gary, i + 1, Groups_t);
2877                 gary[i] = Atol(p);
2878             }
2879             if (i)
2880                 (void)setgroups(i, gary);
2881 	    Safefree(gary);
2882 	}
2883 #else  /* HAS_SETGROUPS */
2884 	new_egid = SvIV(sv);
2885 #endif /* HAS_SETGROUPS */
2886 	PL_delaymagic_egid = new_egid;
2887 	if (PL_delaymagic) {
2888 	    PL_delaymagic |= DM_EGID;
2889 	    break;				/* don't do magic till later */
2890 	}
2891 #ifdef HAS_SETEGID
2892 	(void)setegid((Gid_t)new_egid);
2893 #else
2894 #ifdef HAS_SETREGID
2895 	(void)setregid((Gid_t)-1, (Gid_t)new_egid);
2896 #else
2897 #ifdef HAS_SETRESGID
2898 	(void)setresgid((Gid_t)-1, (Gid_t)new_egid, (Gid_t)-1);
2899 #else
2900 	if (new_egid == PerlProc_getgid())			/* special case $) = $( */
2901 	    (void)PerlProc_setgid(new_egid);
2902 	else {
2903 	    Perl_croak(aTHX_ "setegid() not implemented");
2904 	}
2905 #endif
2906 #endif
2907 #endif
2908 	break;
2909 	}
2910     case ':':
2911 	PL_chopset = SvPV_force(sv,len);
2912 	break;
2913     case '$': /* $$ */
2914 	/* Store the pid in mg->mg_obj so we can tell when a fork has
2915 	   occurred.  mg->mg_obj points to *$ by default, so clear it. */
2916 	if (isGV(mg->mg_obj)) {
2917 	    if (mg->mg_flags & MGf_REFCOUNTED) /* probably never true */
2918 		SvREFCNT_dec(mg->mg_obj);
2919 	    mg->mg_flags |= MGf_REFCOUNTED;
2920 	    mg->mg_obj = newSViv((IV)PerlProc_getpid());
2921 	}
2922 	else sv_setiv(mg->mg_obj, (IV)PerlProc_getpid());
2923 	break;
2924     case '0':
2925 	LOCK_DOLLARZERO_MUTEX;
2926 #ifdef HAS_SETPROCTITLE
2927 	/* The BSDs don't show the argv[] in ps(1) output, they
2928 	 * show a string from the process struct and provide
2929 	 * the setproctitle() routine to manipulate that. */
2930 	if (PL_origalen != 1) {
2931 	    s = SvPV_const(sv, len);
2932 #   if __FreeBSD_version > 410001
2933 	    /* The leading "-" removes the "perl: " prefix,
2934 	     * but not the "(perl) suffix from the ps(1)
2935 	     * output, because that's what ps(1) shows if the
2936 	     * argv[] is modified. */
2937 	    setproctitle("-%s", s);
2938 #   else	/* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2939 	    /* This doesn't really work if you assume that
2940 	     * $0 = 'foobar'; will wipe out 'perl' from the $0
2941 	     * because in ps(1) output the result will be like
2942 	     * sprintf("perl: %s (perl)", s)
2943 	     * I guess this is a security feature:
2944 	     * one (a user process) cannot get rid of the original name.
2945 	     * --jhi */
2946 	    setproctitle("%s", s);
2947 #   endif
2948 	}
2949 #elif defined(__hpux) && defined(PSTAT_SETCMD)
2950 	if (PL_origalen != 1) {
2951 	     union pstun un;
2952 	     s = SvPV_const(sv, len);
2953 	     un.pst_command = (char *)s;
2954 	     pstat(PSTAT_SETCMD, un, len, 0, 0);
2955 	}
2956 #else
2957 	if (PL_origalen > 1) {
2958 	    /* PL_origalen is set in perl_parse(). */
2959 	    s = SvPV_force(sv,len);
2960 	    if (len >= (STRLEN)PL_origalen-1) {
2961 		/* Longer than original, will be truncated. We assume that
2962 		 * PL_origalen bytes are available. */
2963 		Copy(s, PL_origargv[0], PL_origalen-1, char);
2964 	    }
2965 	    else {
2966 		/* Shorter than original, will be padded. */
2967 #ifdef PERL_DARWIN
2968 		/* Special case for Mac OS X: see [perl #38868] */
2969 		const int pad = 0;
2970 #else
2971 		/* Is the space counterintuitive?  Yes.
2972 		 * (You were expecting \0?)
2973 		 * Does it work?  Seems to.  (In Linux 2.4.20 at least.)
2974 		 * --jhi */
2975 		const int pad = ' ';
2976 #endif
2977 		Copy(s, PL_origargv[0], len, char);
2978 		PL_origargv[0][len] = 0;
2979 		memset(PL_origargv[0] + len + 1,
2980 		       pad,  PL_origalen - len - 1);
2981 	    }
2982 	    PL_origargv[0][PL_origalen-1] = 0;
2983 	    for (i = 1; i < PL_origargc; i++)
2984 		PL_origargv[i] = 0;
2985 #ifdef HAS_PRCTL_SET_NAME
2986 	    /* Set the legacy process name in addition to the POSIX name on Linux */
2987 	    if (prctl(PR_SET_NAME, (unsigned long)s, 0, 0, 0) != 0) {
2988 		/* diag_listed_as: SKIPME */
2989 		Perl_croak(aTHX_ "Can't set $0 with prctl(): %s", Strerror(errno));
2990 	    }
2991 #endif
2992 	}
2993 #endif
2994 	UNLOCK_DOLLARZERO_MUTEX;
2995 	break;
2996     }
2997     return 0;
2998 }
2999 
3000 I32
3001 Perl_whichsig_sv(pTHX_ SV *sigsv)
3002 {
3003     const char *sigpv;
3004     STRLEN siglen;
3005     PERL_ARGS_ASSERT_WHICHSIG_SV;
3006     PERL_UNUSED_CONTEXT;
3007     sigpv = SvPV_const(sigsv, siglen);
3008     return whichsig_pvn(sigpv, siglen);
3009 }
3010 
3011 I32
3012 Perl_whichsig_pv(pTHX_ const char *sig)
3013 {
3014     PERL_ARGS_ASSERT_WHICHSIG_PV;
3015     PERL_UNUSED_CONTEXT;
3016     return whichsig_pvn(sig, strlen(sig));
3017 }
3018 
3019 I32
3020 Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len)
3021 {
3022     char* const* sigv;
3023 
3024     PERL_ARGS_ASSERT_WHICHSIG_PVN;
3025     PERL_UNUSED_CONTEXT;
3026 
3027     for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
3028 	if (strlen(*sigv) == len && memEQ(sig,*sigv, len))
3029 	    return PL_sig_num[sigv - (char* const*)PL_sig_name];
3030 #ifdef SIGCLD
3031     if (memEQs(sig, len, "CHLD"))
3032 	return SIGCLD;
3033 #endif
3034 #ifdef SIGCHLD
3035     if (memEQs(sig, len, "CLD"))
3036 	return SIGCHLD;
3037 #endif
3038     return -1;
3039 }
3040 
3041 Signal_t
3042 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3043 Perl_sighandler(int sig, siginfo_t *sip, void *uap)
3044 #else
3045 Perl_sighandler(int sig)
3046 #endif
3047 {
3048 #ifdef PERL_GET_SIG_CONTEXT
3049     dTHXa(PERL_GET_SIG_CONTEXT);
3050 #else
3051     dTHX;
3052 #endif
3053     dSP;
3054     GV *gv = NULL;
3055     SV *sv = NULL;
3056     SV * const tSv = PL_Sv;
3057     CV *cv = NULL;
3058     OP *myop = PL_op;
3059     U32 flags = 0;
3060     XPV * const tXpv = PL_Xpv;
3061     I32 old_ss_ix = PL_savestack_ix;
3062     SV *errsv_save = NULL;
3063 
3064 
3065     if (!PL_psig_ptr[sig]) {
3066 		PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
3067 				 PL_sig_name[sig]);
3068 		exit(sig);
3069 	}
3070 
3071     if (PL_signals &  PERL_SIGNALS_UNSAFE_FLAG) {
3072 	/* Max number of items pushed there is 3*n or 4. We cannot fix
3073 	   infinity, so we fix 4 (in fact 5): */
3074 	if (PL_savestack_ix + 15 <= PL_savestack_max) {
3075 	    flags |= 1;
3076 	    PL_savestack_ix += 5;		/* Protect save in progress. */
3077 	    SAVEDESTRUCTOR_X(S_unwind_handler_stack, NULL);
3078 	}
3079     }
3080     /* sv_2cv is too complicated, try a simpler variant first: */
3081     if (!SvROK(PL_psig_ptr[sig]) || !(cv = MUTABLE_CV(SvRV(PL_psig_ptr[sig])))
3082 	|| SvTYPE(cv) != SVt_PVCV) {
3083 	HV *st;
3084 	cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
3085     }
3086 
3087     if (!cv || !CvROOT(cv)) {
3088 	Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
3089 		       PL_sig_name[sig], (gv ? GvENAME(gv)
3090 					  : ((cv && CvGV(cv))
3091 					     ? GvENAME(CvGV(cv))
3092 					     : "__ANON__")));
3093 	goto cleanup;
3094     }
3095 
3096     sv = PL_psig_name[sig]
3097 	    ? SvREFCNT_inc_NN(PL_psig_name[sig])
3098 	    : newSVpv(PL_sig_name[sig],0);
3099     flags |= 8;
3100     SAVEFREESV(sv);
3101 
3102     if (PL_signals &  PERL_SIGNALS_UNSAFE_FLAG) {
3103 	/* make sure our assumption about the size of the SAVEs are correct:
3104 	 * 3 for SAVEDESTRUCTOR_X, 2 for SAVEFREESV */
3105 	assert(old_ss_ix + 2 + ((flags & 1) ? 3+5 : 0)  == PL_savestack_ix);
3106     }
3107 
3108     PUSHSTACKi(PERLSI_SIGNAL);
3109     PUSHMARK(SP);
3110     PUSHs(sv);
3111 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3112     {
3113 	 struct sigaction oact;
3114 
3115 	 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
3116 	      if (sip) {
3117 		   HV *sih = newHV();
3118 		   SV *rv  = newRV_noinc(MUTABLE_SV(sih));
3119 		   /* The siginfo fields signo, code, errno, pid, uid,
3120 		    * addr, status, and band are defined by POSIX/SUSv3. */
3121 		   (void)hv_stores(sih, "signo", newSViv(sip->si_signo));
3122 		   (void)hv_stores(sih, "code", newSViv(sip->si_code));
3123 #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. */
3124 		   hv_stores(sih, "errno",      newSViv(sip->si_errno));
3125 		   hv_stores(sih, "status",     newSViv(sip->si_status));
3126 		   hv_stores(sih, "uid",        newSViv(sip->si_uid));
3127 		   hv_stores(sih, "pid",        newSViv(sip->si_pid));
3128 		   hv_stores(sih, "addr",       newSVuv(PTR2UV(sip->si_addr)));
3129 		   hv_stores(sih, "band",       newSViv(sip->si_band));
3130 #endif
3131 		   EXTEND(SP, 2);
3132 		   PUSHs(rv);
3133 		   mPUSHp((char *)sip, sizeof(*sip));
3134 	      }
3135 
3136 	 }
3137     }
3138 #endif
3139     PUTBACK;
3140 
3141     errsv_save = newSVsv(ERRSV);
3142 
3143     call_sv(MUTABLE_SV(cv), G_DISCARD|G_EVAL);
3144 
3145     POPSTACK;
3146     {
3147 	SV * const errsv = ERRSV;
3148 	if (SvTRUE_NN(errsv)) {
3149 	    SvREFCNT_dec(errsv_save);
3150 #ifndef PERL_MICRO
3151 	/* Handler "died", for example to get out of a restart-able read().
3152 	 * Before we re-do that on its behalf re-enable the signal which was
3153 	 * blocked by the system when we entered.
3154 	 */
3155 #ifdef HAS_SIGPROCMASK
3156 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3157 	    if (sip || uap)
3158 #endif
3159 	    {
3160 		sigset_t set;
3161 		sigemptyset(&set);
3162 		sigaddset(&set,sig);
3163 		sigprocmask(SIG_UNBLOCK, &set, NULL);
3164 	    }
3165 #else
3166 	    /* Not clear if this will work */
3167 	    (void)rsignal(sig, SIG_IGN);
3168 	    (void)rsignal(sig, PL_csighandlerp);
3169 #endif
3170 #endif /* !PERL_MICRO */
3171 	    die_sv(errsv);
3172 	}
3173 	else {
3174 	    sv_setsv(errsv, errsv_save);
3175 	    SvREFCNT_dec(errsv_save);
3176 	}
3177     }
3178 
3179 cleanup:
3180     /* pop any of SAVEFREESV, SAVEDESTRUCTOR_X and "save in progress" */
3181     PL_savestack_ix = old_ss_ix;
3182     if (flags & 8)
3183 	SvREFCNT_dec(sv);
3184     PL_op = myop;			/* Apparently not needed... */
3185 
3186     PL_Sv = tSv;			/* Restore global temporaries. */
3187     PL_Xpv = tXpv;
3188     return;
3189 }
3190 
3191 
3192 static void
3193 S_restore_magic(pTHX_ const void *p)
3194 {
3195     dVAR;
3196     MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
3197     SV* const sv = mgs->mgs_sv;
3198     bool bumped;
3199 
3200     if (!sv)
3201         return;
3202 
3203     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3204 	SvTEMP_off(sv); /* if it's still magical, this value isn't temporary */
3205 #ifdef PERL_OLD_COPY_ON_WRITE
3206 	/* While magic was saved (and off) sv_setsv may well have seen
3207 	   this SV as a prime candidate for COW.  */
3208 	if (SvIsCOW(sv))
3209 	    sv_force_normal_flags(sv, 0);
3210 #endif
3211 	if (mgs->mgs_readonly)
3212 	    SvREADONLY_on(sv);
3213 	if (mgs->mgs_magical)
3214 	    SvFLAGS(sv) |= mgs->mgs_magical;
3215 	else
3216 	    mg_magical(sv);
3217     }
3218 
3219     bumped = mgs->mgs_bumped;
3220     mgs->mgs_sv = NULL;  /* mark the MGS structure as restored */
3221 
3222     /* If we're still on top of the stack, pop us off.  (That condition
3223      * will be satisfied if restore_magic was called explicitly, but *not*
3224      * if it's being called via leave_scope.)
3225      * The reason for doing this is that otherwise, things like sv_2cv()
3226      * may leave alloc gunk on the savestack, and some code
3227      * (e.g. sighandler) doesn't expect that...
3228      */
3229     if (PL_savestack_ix == mgs->mgs_ss_ix)
3230     {
3231 	UV popval = SSPOPUV;
3232         assert(popval == SAVEt_DESTRUCTOR_X);
3233         PL_savestack_ix -= 2;
3234 	popval = SSPOPUV;
3235         assert((popval & SAVE_MASK) == SAVEt_ALLOC);
3236         PL_savestack_ix -= popval >> SAVE_TIGHT_SHIFT;
3237     }
3238     if (bumped) {
3239 	if (SvREFCNT(sv) == 1) {
3240 	    /* We hold the last reference to this SV, which implies that the
3241 	       SV was deleted as a side effect of the routines we called.
3242 	       So artificially keep it alive a bit longer.
3243 	       We avoid turning on the TEMP flag, which can cause the SV's
3244 	       buffer to get stolen (and maybe other stuff). */
3245 	    sv_2mortal(sv);
3246 	    SvTEMP_off(sv);
3247 	}
3248 	else
3249 	    SvREFCNT_dec(sv); /* undo the inc in S_save_magic() */
3250     }
3251 }
3252 
3253 /* clean up the mess created by Perl_sighandler().
3254  * Note that this is only called during an exit in a signal handler;
3255  * a die is trapped by the call_sv() and the SAVEDESTRUCTOR_X manually
3256  * skipped over. */
3257 
3258 static void
3259 S_unwind_handler_stack(pTHX_ const void *p)
3260 {
3261     dVAR;
3262     PERL_UNUSED_ARG(p);
3263 
3264     PL_savestack_ix -= 5; /* Unprotect save in progress. */
3265 }
3266 
3267 /*
3268 =for apidoc magic_sethint
3269 
3270 Triggered by a store to %^H, records the key/value pair to
3271 C<PL_compiling.cop_hints_hash>.  It is assumed that hints aren't storing
3272 anything that would need a deep copy.  Maybe we should warn if we find a
3273 reference.
3274 
3275 =cut
3276 */
3277 int
3278 Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
3279 {
3280     dVAR;
3281     SV *key = (mg->mg_len == HEf_SVKEY) ? MUTABLE_SV(mg->mg_ptr)
3282 	: newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
3283 
3284     PERL_ARGS_ASSERT_MAGIC_SETHINT;
3285 
3286     /* mg->mg_obj isn't being used.  If needed, it would be possible to store
3287        an alternative leaf in there, with PL_compiling.cop_hints being used if
3288        it's NULL. If needed for threads, the alternative could lock a mutex,
3289        or take other more complex action.  */
3290 
3291     /* Something changed in %^H, so it will need to be restored on scope exit.
3292        Doing this here saves a lot of doing it manually in perl code (and
3293        forgetting to do it, and consequent subtle errors.  */
3294     PL_hints |= HINT_LOCALIZE_HH;
3295     CopHINTHASH_set(&PL_compiling,
3296 	cophh_store_sv(CopHINTHASH_get(&PL_compiling), key, 0, sv, 0));
3297     return 0;
3298 }
3299 
3300 /*
3301 =for apidoc magic_clearhint
3302 
3303 Triggered by a delete from %^H, records the key to
3304 C<PL_compiling.cop_hints_hash>.
3305 
3306 =cut
3307 */
3308 int
3309 Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
3310 {
3311     dVAR;
3312 
3313     PERL_ARGS_ASSERT_MAGIC_CLEARHINT;
3314     PERL_UNUSED_ARG(sv);
3315 
3316     PL_hints |= HINT_LOCALIZE_HH;
3317     CopHINTHASH_set(&PL_compiling,
3318 	mg->mg_len == HEf_SVKEY
3319 	 ? cophh_delete_sv(CopHINTHASH_get(&PL_compiling),
3320 				 MUTABLE_SV(mg->mg_ptr), 0, 0)
3321 	 : cophh_delete_pvn(CopHINTHASH_get(&PL_compiling),
3322 				 mg->mg_ptr, mg->mg_len, 0, 0));
3323     return 0;
3324 }
3325 
3326 /*
3327 =for apidoc magic_clearhints
3328 
3329 Triggered by clearing %^H, resets C<PL_compiling.cop_hints_hash>.
3330 
3331 =cut
3332 */
3333 int
3334 Perl_magic_clearhints(pTHX_ SV *sv, MAGIC *mg)
3335 {
3336     PERL_ARGS_ASSERT_MAGIC_CLEARHINTS;
3337     PERL_UNUSED_ARG(sv);
3338     PERL_UNUSED_ARG(mg);
3339     cophh_free(CopHINTHASH_get(&PL_compiling));
3340     CopHINTHASH_set(&PL_compiling, cophh_new_empty());
3341     return 0;
3342 }
3343 
3344 int
3345 Perl_magic_copycallchecker(pTHX_ SV *sv, MAGIC *mg, SV *nsv,
3346 				 const char *name, I32 namlen)
3347 {
3348     MAGIC *nmg;
3349 
3350     PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER;
3351     PERL_UNUSED_ARG(sv);
3352     PERL_UNUSED_ARG(name);
3353     PERL_UNUSED_ARG(namlen);
3354 
3355     sv_magic(nsv, &PL_sv_undef, mg->mg_type, NULL, 0);
3356     nmg = mg_find(nsv, mg->mg_type);
3357     if (nmg->mg_flags & MGf_REFCOUNTED) SvREFCNT_dec(nmg->mg_obj);
3358     nmg->mg_ptr = mg->mg_ptr;
3359     nmg->mg_obj = SvREFCNT_inc_simple(mg->mg_obj);
3360     nmg->mg_flags |= MGf_REFCOUNTED;
3361     return 1;
3362 }
3363 
3364 /*
3365  * Local variables:
3366  * c-indentation-style: bsd
3367  * c-basic-offset: 4
3368  * indent-tabs-mode: nil
3369  * End:
3370  *
3371  * ex: set ts=8 sts=4 sw=4 et:
3372  */
3373