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