This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove full stop in the 'try' feature heading
[perl5.git] / mg.c
CommitLineData
a0d0e21e 1/* mg.c
79072805 2 *
1129b882
NC
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
79072805
LW
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 *
a0d0e21e
LW
9 */
10
11/*
4ac71550
TC
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"]
79072805
LW
16 */
17
ccfc67b7 18/*
51b56f5c 19=head1 Magic
166f8a29
DM
20"Magic" is special data attached to SV structures in order to give them
21"magical" properties. When any Perl code tries to read from, or assign to,
22an SV marked as magical, it calls the 'get' or 'set' function associated
154e47c8 23with that SV's magic. A get is called prior to reading an SV, in order to
ddfa107c 24give it a chance to update its internal value (get on $. writes the line
b53c43bf 25number of the last read filehandle into the SV's IV slot), while
166f8a29 26set is called after an SV has been written to, in order to allow it to make
ddfa107c 27use of its changed value (set on $/ copies the SV's new value to the
166f8a29
DM
28PL_rs global variable).
29
30Magic is implemented as a linked list of MAGIC structures attached to the
154e47c8 31SV. Each MAGIC struct holds the type of the magic, a pointer to an array
166f8a29 32of functions that implement the get(), set(), length() etc functions,
154e47c8 33plus space for some flags and pointers. For example, a tied variable has
166f8a29
DM
34a MAGIC structure that contains a pointer to the object associated with the
35tie.
36
19851e27
KW
37=for apidoc Ayh||MAGIC
38
7fefc6c1
KW
39=cut
40
ccfc67b7
JH
41*/
42
79072805 43#include "EXTERN.h"
864dbfa3 44#define PERL_IN_MG_C
79072805 45#include "perl.h"
b34c1a7e 46#include "feature.h"
79072805 47
5cd24f17 48#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
b7953727
JH
49# ifdef I_GRP
50# include <grp.h>
51# endif
188ea221
CS
52#endif
53
757f63d8
SP
54#if defined(HAS_SETGROUPS)
55# ifndef NGROUPS
56# define NGROUPS 32
57# endif
58#endif
59
17aa7f3d
JH
60#ifdef __hpux
61# include <sys/pstat.h>
62#endif
63
7636ea95
AB
64#ifdef HAS_PRCTL_SET_NAME
65# include <sys/prctl.h>
66#endif
67
9cffb111
OS
68#ifdef __Lynx__
69/* Missing protos on LynxOS */
70void setruid(uid_t id);
71void seteuid(uid_t id);
72void setrgid(uid_t id);
73void setegid(uid_t id);
74#endif
75
c07a80fd 76/*
4bac9ae4 77 * Pre-magic setup and post-magic takedown.
c07a80fd 78 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
79 */
80
81struct magic_state {
82 SV* mgs_sv;
455ece5e 83 I32 mgs_ss_ix;
a623f893 84 U32 mgs_flags;
150b625d 85 bool mgs_bumped;
c07a80fd 86};
455ece5e 87/* MGS is typedef'ed to struct magic_state in perl.h */
76e3520e
GS
88
89STATIC void
1a2b24d8 90S_save_magic_flags(pTHX_ SSize_t mgs_ix, SV *sv, U32 flags)
c07a80fd 91{
455ece5e 92 MGS* mgs;
150b625d 93 bool bumped = FALSE;
7918f24d 94
ff44333e 95 PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS;
7918f24d 96
4bac9ae4
CS
97 assert(SvMAGICAL(sv));
98
150b625d
DM
99 /* we shouldn't really be called here with RC==0, but it can sometimes
100 * happen via mg_clear() (which also shouldn't be called when RC==0,
101 * but it can happen). Handle this case gracefully(ish) by not RC++
102 * and thus avoiding the resultant double free */
103 if (SvREFCNT(sv) > 0) {
104 /* guard against sv getting freed midway through the mg clearing,
105 * by holding a private reference for the duration. */
1604cfb0
MS
106 SvREFCNT_inc_simple_void_NN(sv);
107 bumped = TRUE;
150b625d 108 }
8985fe98 109
8772537c 110 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
455ece5e
AD
111
112 mgs = SSPTR(mgs_ix, MGS*);
c07a80fd 113 mgs->mgs_sv = sv;
a623f893 114 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
455ece5e 115 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
150b625d 116 mgs->mgs_bumped = bumped;
c07a80fd 117
ff44333e 118 SvFLAGS(sv) &= ~flags;
3805b5fb 119 SvREADONLY_off(sv);
c07a80fd 120}
121
ff44333e
FC
122#define save_magic(a,b) save_magic_flags(a,b,SVs_GMG|SVs_SMG|SVs_RMG)
123
954c1994
GS
124/*
125=for apidoc mg_magical
126
fbe13c60 127Turns on the magical status of an SV. See C<L</sv_magic>>.
954c1994
GS
128
129=cut
130*/
131
8990e307 132void
ddeaf645 133Perl_mg_magical(SV *sv)
8990e307 134{
e1ec3a88 135 const MAGIC* mg;
7918f24d 136 PERL_ARGS_ASSERT_MG_MAGICAL;
f9c6fee5
CS
137
138 SvMAGICAL_off(sv);
218787bd 139 if ((mg = SvMAGIC(sv))) {
1604cfb0
MS
140 do {
141 const MGVTBL* const vtbl = mg->mg_virtual;
142 if (vtbl) {
143 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
144 SvGMAGICAL_on(sv);
145 if (vtbl->svt_set)
146 SvSMAGICAL_on(sv);
147 if (vtbl->svt_clear)
148 SvRMAGICAL_on(sv);
149 }
150 } while ((mg = mg->mg_moremagic));
151 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)))
152 SvRMAGICAL_on(sv);
8990e307
LW
153 }
154}
155
954c1994
GS
156/*
157=for apidoc mg_get
158
4b1e7f06 159Do magic before a value is retrieved from the SV. The type of SV must
796b6530 160be >= C<SVt_PVMG>. See C<L</sv_magic>>.
954c1994
GS
161
162=cut
163*/
164
79072805 165int
864dbfa3 166Perl_mg_get(pTHX_ SV *sv)
79072805 167{
1a2b24d8 168 const SSize_t mgs_ix = SSNEW(sizeof(MGS));
a9844598 169 bool saved = FALSE;
f9c6fee5 170 bool have_new = 0;
b949b68f 171 bool taint_only = TRUE; /* the only get method seen is taint */
ff76feab 172 MAGIC *newmg, *head, *cur, *mg;
6683b158 173
7918f24d
NC
174 PERL_ARGS_ASSERT_MG_GET;
175
407287f9
FC
176 if (PL_localizing == 1 && sv == DEFSV) return 0;
177
ff76feab
AMS
178 /* We must call svt_get(sv, mg) for each valid entry in the linked
179 list of magic. svt_get() may delete the current entry, add new
180 magic to the head of the list, or upgrade the SV. AMS 20010810 */
181
182 newmg = cur = head = mg = SvMAGIC(sv);
183 while (mg) {
1604cfb0
MS
184 const MGVTBL * const vtbl = mg->mg_virtual;
185 MAGIC * const nextmg = mg->mg_moremagic; /* it may delete itself */
ff76feab 186
1604cfb0 187 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
a9844598 188
1604cfb0
MS
189 /* taint's mg get is so dumb it doesn't need flag saving */
190 if (mg->mg_type != PERL_MAGIC_taint) {
b949b68f
DM
191 taint_only = FALSE;
192 if (!saved) {
193 save_magic(mgs_ix, sv);
194 saved = TRUE;
195 }
196 }
a9844598 197
1604cfb0
MS
198 vtbl->svt_get(aTHX_ sv, mg);
199
200 /* guard against magic having been deleted - eg FETCH calling
201 * untie */
202 if (!SvMAGIC(sv)) {
203 /* recalculate flags */
204 (SSPTR(mgs_ix, MGS *))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
205 break;
206 }
207
208 /* recalculate flags if this entry was deleted. */
209 if (mg->mg_flags & MGf_GSKIP)
210 (SSPTR(mgs_ix, MGS *))->mgs_flags &=
211 ~(SVs_GMG|SVs_SMG|SVs_RMG);
212 }
213 else if (vtbl == &PL_vtbl_utf8) {
214 /* get-magic can reallocate the PV, unless there's only taint
b949b68f
DM
215 * magic */
216 if (taint_only) {
217 MAGIC *mg2;
218 for (mg2 = nextmg; mg2; mg2 = mg2->mg_moremagic) {
219 if ( mg2->mg_type != PERL_MAGIC_taint
220 && !(mg2->mg_flags & MGf_GSKIP)
221 && mg2->mg_virtual
222 && mg2->mg_virtual->svt_get
223 ) {
224 taint_only = FALSE;
225 break;
226 }
227 }
228 }
229 if (!taint_only)
230 magic_setutf8(sv, mg);
1604cfb0
MS
231 }
232
233 mg = nextmg;
234
235 if (have_new) {
236 /* Have we finished with the new entries we saw? Start again
237 where we left off (unless there are more new entries). */
238 if (mg == head) {
239 have_new = 0;
240 mg = cur;
241 head = newmg;
242 }
243 }
244
245 /* Were any new entries added? */
246 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
247 have_new = 1;
248 cur = mg;
249 mg = newmg;
250 /* recalculate flags */
251 (SSPTR(mgs_ix, MGS *))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
252 }
79072805 253 }
463ee0b2 254
a9844598 255 if (saved)
1604cfb0 256 restore_magic(INT2PTR(void *, (IV)mgs_ix));
a9844598 257
79072805
LW
258 return 0;
259}
260
954c1994
GS
261/*
262=for apidoc mg_set
263
fbe13c60 264Do magic after a value is assigned to the SV. See C<L</sv_magic>>.
954c1994
GS
265
266=cut
267*/
268
79072805 269int
864dbfa3 270Perl_mg_set(pTHX_ SV *sv)
79072805 271{
1a2b24d8 272 const SSize_t mgs_ix = SSNEW(sizeof(MGS));
79072805 273 MAGIC* mg;
463ee0b2
LW
274 MAGIC* nextmg;
275
7918f24d
NC
276 PERL_ARGS_ASSERT_MG_SET;
277
b5ed8c44
FC
278 if (PL_localizing == 2 && sv == DEFSV) return 0;
279
ff44333e 280 save_magic_flags(mgs_ix, sv, SVs_GMG|SVs_SMG); /* leave SVs_RMG on */
463ee0b2
LW
281
282 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
e1ec3a88 283 const MGVTBL* vtbl = mg->mg_virtual;
1604cfb0
MS
284 nextmg = mg->mg_moremagic; /* it may delete itself */
285 if (mg->mg_flags & MGf_GSKIP) {
286 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
287 (SSPTR(mgs_ix, MGS*))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
288 }
289 if (PL_localizing == 2
290 && PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
291 continue;
292 if (vtbl && vtbl->svt_set)
293 vtbl->svt_set(aTHX_ sv, mg);
79072805 294 }
463ee0b2 295
8772537c 296 restore_magic(INT2PTR(void*, (IV)mgs_ix));
79072805
LW
297 return 0;
298}
299
8fb26106 300I32
864dbfa3 301Perl_mg_size(pTHX_ SV *sv)
93965878
NIS
302{
303 MAGIC* mg;
ac27b0f5 304
7918f24d
NC
305 PERL_ARGS_ASSERT_MG_SIZE;
306
93965878 307 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 308 const MGVTBL* const vtbl = mg->mg_virtual;
1604cfb0 309 if (vtbl && vtbl->svt_len) {
1a2b24d8 310 const SSize_t mgs_ix = SSNEW(sizeof(MGS));
35a4481c 311 I32 len;
1604cfb0
MS
312 save_magic(mgs_ix, sv);
313 /* omit MGf_GSKIP -- not changed here */
314 len = vtbl->svt_len(aTHX_ sv, mg);
315 restore_magic(INT2PTR(void*, (IV)mgs_ix));
316 return len;
317 }
93965878
NIS
318 }
319
320 switch(SvTYPE(sv)) {
1604cfb0
MS
321 case SVt_PVAV:
322 return AvFILLp((const AV *) sv); /* Fallback to non-tied array */
323 case SVt_PVHV:
324 /* FIXME */
325 default:
326 Perl_croak(aTHX_ "Size magic not implemented");
81d52ecd 327
93965878 328 }
a25b5927 329 NOT_REACHED; /* NOTREACHED */
93965878
NIS
330}
331
954c1994
GS
332/*
333=for apidoc mg_clear
334
fbe13c60 335Clear something magical that the SV represents. See C<L</sv_magic>>.
954c1994
GS
336
337=cut
338*/
339
79072805 340int
864dbfa3 341Perl_mg_clear(pTHX_ SV *sv)
79072805 342{
1a2b24d8 343 const SSize_t mgs_ix = SSNEW(sizeof(MGS));
79072805 344 MAGIC* mg;
8ac77ac9 345 MAGIC *nextmg;
463ee0b2 346
7918f24d
NC
347 PERL_ARGS_ASSERT_MG_CLEAR;
348
455ece5e 349 save_magic(mgs_ix, sv);
463ee0b2 350
8ac77ac9 351 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
35a4481c 352 const MGVTBL* const vtbl = mg->mg_virtual;
1604cfb0 353 /* omit GSKIP -- never set here */
727405f8 354
1604cfb0 355 nextmg = mg->mg_moremagic; /* it may delete itself */
8ac77ac9 356
1604cfb0
MS
357 if (vtbl && vtbl->svt_clear)
358 vtbl->svt_clear(aTHX_ sv, mg);
79072805 359 }
463ee0b2 360
8772537c 361 restore_magic(INT2PTR(void*, (IV)mgs_ix));
79072805
LW
362 return 0;
363}
364
ed624ca8 365static MAGIC*
ddeaf645 366S_mg_findext_flags(const SV *sv, int type, const MGVTBL *vtbl, U32 flags)
39de7f53 367{
39de7f53
FR
368 assert(flags <= 1);
369
370 if (sv) {
1604cfb0 371 MAGIC *mg;
39de7f53 372
1604cfb0
MS
373 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
374 if (mg->mg_type == type && (!flags || mg->mg_virtual == vtbl)) {
375 return mg;
376 }
377 }
39de7f53
FR
378 }
379
380 return NULL;
381}
382
954c1994
GS
383/*
384=for apidoc mg_find
385
796b6530 386Finds the magic pointer for C<type> matching the SV. See C<L</sv_magic>>.
954c1994
GS
387
388=cut
389*/
390
93a17b20 391MAGIC*
ddeaf645 392Perl_mg_find(const SV *sv, int type)
93a17b20 393{
ddeaf645 394 return S_mg_findext_flags(sv, type, NULL, 0);
39de7f53
FR
395}
396
397/*
398=for apidoc mg_findext
399
400Finds the magic pointer of C<type> with the given C<vtbl> for the C<SV>. See
fbe13c60 401C<L</sv_magicext>>.
39de7f53
FR
402
403=cut
404*/
405
406MAGIC*
ddeaf645 407Perl_mg_findext(const SV *sv, int type, const MGVTBL *vtbl)
39de7f53 408{
ddeaf645 409 return S_mg_findext_flags(sv, type, vtbl, 1);
93a17b20
LW
410}
411
96c2a8ff
FC
412MAGIC *
413Perl_mg_find_mglob(pTHX_ SV *sv)
414{
415 PERL_ARGS_ASSERT_MG_FIND_MGLOB;
416 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
417 /* This sv is only a delegate. //g magic must be attached to
418 its target. */
419 vivify_defelem(sv);
420 sv = LvTARG(sv);
421 }
422 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
ddeaf645 423 return S_mg_findext_flags(sv, PERL_MAGIC_regex_global, 0, 0);
96c2a8ff
FC
424 return NULL;
425}
426
954c1994
GS
427/*
428=for apidoc mg_copy
429
fbe13c60 430Copies the magic from one SV to another. See C<L</sv_magic>>.
954c1994
GS
431
432=cut
433*/
434
79072805 435int
864dbfa3 436Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
79072805 437{
463ee0b2 438 int count = 0;
79072805 439 MAGIC* mg;
7918f24d
NC
440
441 PERL_ARGS_ASSERT_MG_COPY;
442
463ee0b2 443 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 444 const MGVTBL* const vtbl = mg->mg_virtual;
1604cfb0
MS
445 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
446 count += vtbl->svt_copy(aTHX_ sv, mg, nsv, key, klen);
447 }
448 else {
449 const char type = mg->mg_type;
450 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
451 sv_magic(nsv,
452 (type == PERL_MAGIC_tied)
453 ? SvTIED_obj(sv, mg)
27deb0cf 454 : mg->mg_obj,
1604cfb0
MS
455 toLOWER(type), key, klen);
456 count++;
457 }
458 }
79072805 459 }
463ee0b2 460 return count;
79072805
LW
461}
462
954c1994 463/*
0cbee0a4
DM
464=for apidoc mg_localize
465
9711599e 466Copy some of the magic from an existing SV to new localized version of that
dfcfced8
KW
467SV. Container magic (I<e.g.>, C<%ENV>, C<$1>, C<tie>)
468gets copied, value magic doesn't (I<e.g.>,
796b6530 469C<taint>, C<pos>).
9711599e 470
796b6530 471If C<setmagic> is false then no set magic will be called on the new (empty) SV.
61b16eb9 472This typically means that assignment will soon follow (e.g. S<C<'local $x = $y'>>),
9711599e 473and that will handle the magic.
0cbee0a4
DM
474
475=cut
476*/
477
478void
af7df257 479Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic)
0cbee0a4
DM
480{
481 MAGIC *mg;
7918f24d
NC
482
483 PERL_ARGS_ASSERT_MG_LOCALIZE;
484
658a9f31 485 if (nsv == DEFSV)
1604cfb0 486 return;
658a9f31 487
0cbee0a4 488 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
1604cfb0
MS
489 const MGVTBL* const vtbl = mg->mg_virtual;
490 if (PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
491 continue;
492
493 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
494 (void)vtbl->svt_local(aTHX_ nsv, mg);
495 else
496 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
497 mg->mg_ptr, mg->mg_len);
a5063e7c 498
1604cfb0
MS
499 /* container types should remain read-only across localization */
500 SvFLAGS(nsv) |= SvREADONLY(sv);
0cbee0a4
DM
501 }
502
503 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
1604cfb0
MS
504 SvFLAGS(nsv) |= SvMAGICAL(sv);
505 if (setmagic) {
506 PL_localizing = 1;
507 SvSETMAGIC(nsv);
508 PL_localizing = 0;
509 }
0cbee0a4
DM
510 }
511}
512
d9088386
Z
513#define mg_free_struct(sv, mg) S_mg_free_struct(aTHX_ sv, mg)
514static void
515S_mg_free_struct(pTHX_ SV *sv, MAGIC *mg)
516{
517 const MGVTBL* const vtbl = mg->mg_virtual;
518 if (vtbl && vtbl->svt_free)
1604cfb0 519 vtbl->svt_free(aTHX_ sv, mg);
44955e7d 520
02a48966
DM
521 if (mg->mg_len > 0)
522 Safefree(mg->mg_ptr);
523 else if (mg->mg_len == HEf_SVKEY)
524 SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
44955e7d 525
d9088386 526 if (mg->mg_flags & MGf_REFCOUNTED)
1604cfb0 527 SvREFCNT_dec(mg->mg_obj);
d9088386
Z
528 Safefree(mg);
529}
530
0cbee0a4 531/*
954c1994
GS
532=for apidoc mg_free
533
fbe13c60 534Free any magic storage used by the SV. See C<L</sv_magic>>.
954c1994
GS
535
536=cut
537*/
538
79072805 539int
864dbfa3 540Perl_mg_free(pTHX_ SV *sv)
79072805
LW
541{
542 MAGIC* mg;
543 MAGIC* moremagic;
7918f24d
NC
544
545 PERL_ARGS_ASSERT_MG_FREE;
546
79072805 547 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
1604cfb0
MS
548 moremagic = mg->mg_moremagic;
549 mg_free_struct(sv, mg);
550 SvMAGIC_set(sv, moremagic);
79072805 551 }
b162af07 552 SvMAGIC_set(sv, NULL);
68f8932e 553 SvMAGICAL_off(sv);
79072805
LW
554 return 0;
555}
556
d9088386 557/*
44170c9a 558=for apidoc mg_free_type
d9088386 559
2d7f6611 560Remove any magic of type C<how> from the SV C<sv>. See L</sv_magic>.
d9088386
Z
561
562=cut
563*/
564
565void
566Perl_mg_free_type(pTHX_ SV *sv, int how)
567{
568 MAGIC *mg, *prevmg, *moremg;
569 PERL_ARGS_ASSERT_MG_FREE_TYPE;
570 for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
1604cfb0
MS
571 moremg = mg->mg_moremagic;
572 if (mg->mg_type == how) {
19742f39 573 MAGIC *newhead;
1604cfb0
MS
574 /* temporarily move to the head of the magic chain, in case
575 custom free code relies on this historical aspect of mg_free */
576 if (prevmg) {
577 prevmg->mg_moremagic = moremg;
578 mg->mg_moremagic = SvMAGIC(sv);
579 SvMAGIC_set(sv, mg);
580 }
581 newhead = mg->mg_moremagic;
582 mg_free_struct(sv, mg);
583 SvMAGIC_set(sv, newhead);
584 mg = prevmg;
585 }
d9088386
Z
586 }
587 mg_magical(sv);
588}
589
e0d4aead
TC
590/*
591=for apidoc mg_freeext
592
593Remove any magic of type C<how> using virtual table C<vtbl> from the
594SV C<sv>. See L</sv_magic>.
595
596C<mg_freeext(sv, how, NULL)> is equivalent to C<mg_free_type(sv, how)>.
597
598=cut
599*/
600
601void
602Perl_mg_freeext(pTHX_ SV *sv, int how, const MGVTBL *vtbl)
603{
604 MAGIC *mg, *prevmg, *moremg;
605 PERL_ARGS_ASSERT_MG_FREEEXT;
606 for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
1604cfb0
MS
607 MAGIC *newhead;
608 moremg = mg->mg_moremagic;
609 if (mg->mg_type == how && (vtbl == NULL || mg->mg_virtual == vtbl)) {
610 /* temporarily move to the head of the magic chain, in case
611 custom free code relies on this historical aspect of mg_free */
612 if (prevmg) {
613 prevmg->mg_moremagic = moremg;
614 mg->mg_moremagic = SvMAGIC(sv);
615 SvMAGIC_set(sv, mg);
616 }
617 newhead = mg->mg_moremagic;
618 mg_free_struct(sv, mg);
619 SvMAGIC_set(sv, newhead);
620 mg = prevmg;
621 }
e0d4aead
TC
622 }
623 mg_magical(sv);
624}
625
79072805 626#include <signal.h>
79072805 627
942e002e 628U32
864dbfa3 629Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
6cef1e77 630{
8772537c 631 PERL_UNUSED_ARG(sv);
6cef1e77 632
7918f24d
NC
633 PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT;
634
0bd48802 635 if (PL_curpm) {
27deb0cf 636 REGEXP * const rx = PM_GETRE(PL_curpm);
1604cfb0 637 if (rx) {
fa531f32
DM
638 const SSize_t n = (SSize_t)mg->mg_obj;
639 if (n == '+') { /* @+ */
1604cfb0 640 /* return the number possible */
fe5492d9 641 return RX_LOGICAL_NPARENS(rx);
27deb0cf 642 } else { /* @- @^CAPTURE @{^CAPTURE} */
1604cfb0 643 I32 paren = RX_LASTPAREN(rx);
a678b0e4 644
1604cfb0 645 /* return the last filled */
3f11a285 646 while ( paren >= 0 && !RX_OFFS_VALID(rx,paren) )
1604cfb0 647 paren--;
fe5492d9
YO
648 if (paren && RX_PARNO_TO_LOGICAL(rx))
649 paren = RX_PARNO_TO_LOGICAL(rx)[paren];
fa531f32 650 if (n == '-') {
27deb0cf
YO
651 /* @- */
652 return (U32)paren;
653 } else {
654 /* @^CAPTURE @{^CAPTURE} */
655 return paren >= 0 ? (U32)(paren-1) : (U32)-1;
656 }
657 }
1604cfb0 658 }
8f580fb8 659 }
ac27b0f5 660
942e002e 661 return (U32)-1;
6cef1e77
IZ
662}
663
6502e081
DM
664/* @-, @+ */
665
6cef1e77 666int
864dbfa3 667Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
6cef1e77 668{
7918f24d 669 PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET;
fe5492d9
YO
670 REGEXP * const rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
671
672 if (rx) {
673 const SSize_t n = (SSize_t)mg->mg_obj;
674 /* @{^CAPTURE} does not contain $&, so we need to increment by 1 */
675 const I32 paren = mg->mg_len
676 + (n == '\003' ? 1 : 0);
677 SSize_t s;
678 SSize_t t;
679 if (paren < 0)
680 return 0;
681 if (n != '+' && n != '-') {
682 CALLREG_NUMBUF_FETCH(rx,paren,sv);
683 return 0;
684 }
685 if (paren <= (I32)RX_LOGICAL_NPARENS(rx)) {
686 I32 true_paren = RX_LOGICAL_TO_PARNO(rx)
687 ? RX_LOGICAL_TO_PARNO(rx)[paren]
688 : paren;
689 do {
690 if (((s = RX_OFFS_START(rx,true_paren)) != -1) &&
691 ((t = RX_OFFS_END(rx,true_paren)) != -1))
1604cfb0
MS
692 {
693 SSize_t i;
27deb0cf 694
fa531f32 695 if (n == '+') /* @+ */
1604cfb0 696 i = t;
fa531f32 697 else if (n == '-') /* @- */
1604cfb0 698 i = s;
0bd48802 699
1604cfb0
MS
700 if (RX_MATCH_UTF8(rx)) {
701 const char * const b = RX_SUBBEG(rx);
702 if (b)
703 i = RX_SUBCOFFSET(rx) +
6502e081
DM
704 utf8_length((U8*)b,
705 (U8*)(b-RX_SUBOFFSET(rx)+i));
1604cfb0 706 }
727405f8 707
1604cfb0
MS
708 sv_setuv(sv, i);
709 return 0;
710 }
fe5492d9
YO
711 if (RX_PARNO_TO_LOGICAL_NEXT(rx))
712 true_paren = RX_PARNO_TO_LOGICAL_NEXT(rx)[true_paren];
713 else
714 break;
715 } while (true_paren);
1604cfb0 716 }
6cef1e77 717 }
3773545d 718 sv_set_undef(sv);
6cef1e77
IZ
719 return 0;
720}
721
6502e081
DM
722/* @-, @+ */
723
e4b89193 724int
a29d06ed
MG
725Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
726{
7918f24d 727 PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET;
dc3bf405 728 PERL_UNUSED_CONTEXT;
d4c19fe8
AL
729 PERL_UNUSED_ARG(sv);
730 PERL_UNUSED_ARG(mg);
cb077ed2 731 Perl_croak_no_modify();
0dbb1585 732 NORETURN_FUNCTION_END;
a29d06ed
MG
733}
734
34e6ab8f
KW
735#define SvRTRIM(sv) STMT_START { \
736 SV * sv_ = sv; \
737 if (SvPOK(sv_)) { \
738 STRLEN len = SvCUR(sv_); \
739 char * const p = SvPVX(sv_); \
740 while (len > 0 && isSPACE(p[len-1])) \
741 --len; \
742 SvCUR_set(sv_, len); \
743 p[len] = '\0'; \
744 } \
ad3296c6
SH
745} STMT_END
746
8b850bd5
NC
747void
748Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
749{
7918f24d
NC
750 PERL_ARGS_ASSERT_EMULATE_COP_IO;
751
8b850bd5 752 if (!(CopHINTS_get(c) & (HINT_LEXICAL_IO_IN|HINT_LEXICAL_IO_OUT)))
1604cfb0 753 sv_set_undef(sv);
8b850bd5 754 else {
b2aed775 755 SvPVCLEAR(sv);
1604cfb0
MS
756 SvUTF8_off(sv);
757 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_IN)) {
758 SV *const value = cop_hints_fetch_pvs(c, "open<", 0);
759 assert(value);
760 sv_catsv(sv, value);
761 }
762 sv_catpvs(sv, "\0");
763 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_OUT)) {
764 SV *const value = cop_hints_fetch_pvs(c, "open>", 0);
765 assert(value);
766 sv_catsv(sv, value);
767 }
8b850bd5
NC
768 }
769}
770
d9fe7d23
KW
771STATIC void
772S_fixup_errno_string(pTHX_ SV* sv)
773{
774 /* Do what is necessary to fixup the non-empty string in 'sv' for return to
775 * Perl space. */
776
777 PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING;
778
779 assert(SvOK(sv));
b35e4f8b
KW
780
781 if(strEQ(SvPVX(sv), "")) {
1604cfb0 782 sv_catpv(sv, UNKNOWN_ERRNO_MSG);
b35e4f8b 783 }
d9fe7d23
KW
784}
785
658db622 786/*
3f620621 787=for apidoc_section $errno
44170c9a 788=for apidoc sv_string_from_errnum
658db622
Z
789
790Generates the message string describing an OS error and returns it as
791an SV. C<errnum> must be a value that C<errno> could take, identifying
792the type of error.
793
794If C<tgtsv> is non-null then the string will be written into that SV
795(overwriting existing content) and it will be returned. If C<tgtsv>
796is a null pointer then the string will be written into a new mortal SV
797which will be returned.
798
799The message will be taken from whatever locale would be used by C<$!>,
800and will be encoded in the SV in whatever manner would be used by C<$!>.
801The details of this process are subject to future change. Currently,
802the message is taken from the C locale by default (usually producing an
803English message), and from the currently selected locale when in the scope
804of the C<use locale> pragma. A heuristic attempt is made to decode the
805message from the locale's character encoding, but it will only be decoded
806as either UTF-8 or ISO-8859-1. It is always correctly decoded in a UTF-8
807locale, usually in an ISO-8859-1 locale, and never in any other locale.
808
809The SV is always returned containing an actual string, and with no other
810OK bits set. Unlike C<$!>, a message is even yielded for C<errnum> zero
811(meaning success), and if no useful message is available then a useless
812string (currently empty) is returned.
813
814=cut
815*/
816
817SV *
818Perl_sv_string_from_errnum(pTHX_ int errnum, SV *tgtsv)
819{
820 char const *errstr;
c728a1a6
KW
821 utf8ness_t utf8ness;
822
658db622 823 if(!tgtsv)
7ea8b04b 824 tgtsv = newSV_type_mortal(SVt_PV);
c728a1a6 825 errstr = my_strerror(errnum, &utf8ness);
658db622 826 if(errstr) {
1604cfb0 827 sv_setpv(tgtsv, errstr);
c728a1a6
KW
828 if (utf8ness == UTF8NESS_YES) {
829 SvUTF8_on(tgtsv);
830 }
1604cfb0 831 fixup_errno_string(tgtsv);
658db622 832 } else {
1604cfb0 833 SvPVCLEAR(tgtsv);
658db622
Z
834 }
835 return tgtsv;
836}
837
25bbd826
CB
838#ifdef VMS
839#include <descrip.h>
840#include <starlet.h>
841#endif
842
79072805 843int
864dbfa3 844Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
79072805 845{
eb578fdb
KW
846 I32 paren;
847 const char *s = NULL;
848 REGEXP *rx;
e91d8259 849 char nextchar;
79072805 850
7918f24d
NC
851 PERL_ARGS_ASSERT_MAGIC_GET;
852
12865d70
KW
853 const char * const remaining = (mg->mg_ptr)
854 ? mg->mg_ptr + 1
855 : NULL;
856
e91d8259 857 if (!mg->mg_ptr) {
e91d8259 858 paren = mg->mg_len;
e91d8259 859 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
a6d0b1b5 860 do_numbuf_fetch:
e91d8259 861 CALLREG_NUMBUF_FETCH(rx,paren,sv);
e91d8259 862 }
e03e82a0
DM
863 else
864 goto set_undef;
e91d8259
NC
865 return 0;
866 }
867
868 nextchar = *remaining;
79072805 869 switch (*mg->mg_ptr) {
748a9306 870 case '\001': /* ^A */
1604cfb0
MS
871 if (SvOK(PL_bodytarget)) sv_copypv(sv, PL_bodytarget);
872 else
e03e82a0 873 sv_set_undef(sv);
1604cfb0
MS
874 if (SvTAINTED(PL_bodytarget))
875 SvTAINTED_on(sv);
876 break;
e5218da5 877 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
1604cfb0
MS
878 if (nextchar == '\0') {
879 sv_setiv(sv, (IV)PL_minus_c);
880 }
881 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
882 sv_setiv(sv, (IV)STATUS_NATIVE);
e5218da5 883 }
1604cfb0 884 break;
49460fe6 885
79072805 886 case '\004': /* ^D */
1604cfb0
MS
887 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
888 break;
28f23441 889 case '\005': /* ^E */
1604cfb0 890 if (nextchar != '\0') {
6c6eab55 891 if (strEQ(remaining, "NCODING"))
3773545d 892 sv_set_undef(sv);
4f4ff3a7 893 break;
6c6eab55 894 }
4f4ff3a7
KW
895
896#if defined(VMS) || defined(OS2) || defined(WIN32)
897# if defined(VMS)
2a99ff86
KW
898 {
899 char msg[255];
900 $DESCRIPTOR(msgdsc,msg);
901 sv_setnv(sv,(NV) vaxc$errno);
902 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
903 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
904 else
b2aed775 905 SvPVCLEAR(sv);
2a99ff86 906 }
4b645107 907#elif defined(OS2)
2a99ff86
KW
908 if (!(_emx_env & 0x200)) { /* Under DOS */
909 sv_setnv(sv, (NV)errno);
c728a1a6
KW
910 if (errno) {
911 utf8ness_t utf8ness;
912 const char * errstr = my_strerror(errnum, &utf8ness);
913
914 sv_setpv(sv, errstr);
915
916 if (utf8ness == UTF8NESS_YES) {
917 SvUTF8_on(sv);
918 }
919 }
920 else {
921 SvPVCLEAR(sv);
922 }
2a99ff86
KW
923 } else {
924 if (errno != errno_isOS2) {
925 const int tmp = _syserrno();
926 if (tmp) /* 2nd call to _syserrno() makes it 0 */
927 Perl_rc = tmp;
928 }
929 sv_setnv(sv, (NV)Perl_rc);
930 sv_setpv(sv, os2error(Perl_rc));
931 }
1534c6f5 932 if (SvOK(sv) && strNE(SvPVX(sv), "")) {
99461a73
KW
933 fixup_errno_string(sv);
934 }
4f4ff3a7 935# elif defined(WIN32)
2a99ff86
KW
936 {
937 const DWORD dwErr = GetLastError();
938 sv_setnv(sv, (NV)dwErr);
939 if (dwErr) {
940 PerlProc_GetOSError(sv, dwErr);
2efab60d 941 fixup_errno_string(sv);
c728a1a6
KW
942
943# ifdef USE_LOCALE
944 if ( IN_LOCALE
945 && get_win32_message_utf8ness(SvPV_nomg_const_nolen(sv)))
946 {
947 SvUTF8_on(sv);
948 }
949# endif
2a99ff86
KW
950 }
951 else
b2aed775 952 SvPVCLEAR(sv);
2a99ff86
KW
953 SetLastError(dwErr);
954 }
4f4ff3a7
KW
955# else
956# error Missing code for platform
957# endif
2a99ff86
KW
958 SvRTRIM(sv);
959 SvNOK_on(sv); /* what a wonderful hack! */
1604cfb0 960 break;
4f4ff3a7
KW
961#endif /* End of platforms with special handling for $^E; others just fall
962 through to $! */
2165bd23 963 /* FALLTHROUGH */
46f3e16c
KW
964
965 case '!':
1604cfb0 966 {
5f1b979d 967 dSAVE_ERRNO;
46f3e16c 968#ifdef VMS
5f1b979d 969 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
46f3e16c 970#else
5f1b979d 971 sv_setnv(sv, (NV)errno);
46f3e16c
KW
972#endif
973#ifdef OS2
5f1b979d
KW
974 if (errno == errno_isOS2 || errno == errno_isOS2_set)
975 sv_setpv(sv, os2error(Perl_rc));
976 else
46f3e16c 977#endif
5f1b979d 978 if (! errno) {
b2aed775 979 SvPVCLEAR(sv);
46f3e16c 980 }
5f1b979d 981 else {
658db622
Z
982 sv_string_from_errnum(errno, sv);
983 /* If no useful string is available, don't
984 * claim to have a string part. The SvNOK_on()
5f1b979d 985 * below will cause just the number part to be valid */
658db622
Z
986 if (!SvCUR(sv))
987 SvPOK_off(sv);
5f1b979d
KW
988 }
989 RESTORE_ERRNO;
1604cfb0 990 }
46f3e16c 991
1604cfb0
MS
992 SvRTRIM(sv);
993 SvNOK_on(sv); /* what a wonderful hack! */
994 break;
46f3e16c 995
79072805 996 case '\006': /* ^F */
9f601cf3
TC
997 if (nextchar == '\0') {
998 sv_setiv(sv, (IV)PL_maxsysfd);
999 }
1604cfb0 1000 break;
9ebf26ad 1001 case '\007': /* ^GLOBAL_PHASE */
1604cfb0
MS
1002 if (strEQ(remaining, "LOBAL_PHASE")) {
1003 sv_setpvn(sv, PL_phase_names[PL_phase],
1004 strlen(PL_phase_names[PL_phase]));
1005 }
1006 break;
a0d0e21e 1007 case '\010': /* ^H */
1604cfb0
MS
1008 sv_setuv(sv, PL_hints);
1009 break;
9d116dd7 1010 case '\011': /* ^I */ /* NOT \t in EBCDIC */
1604cfb0
MS
1011 sv_setpv(sv, PL_inplace); /* Will undefine sv if PL_inplace is NULL */
1012 break;
8561ea1d 1013 case '\014': /* ^LAST_FH */
1604cfb0
MS
1014 if (strEQ(remaining, "AST_FH")) {
1015 if (PL_last_in_gv && (SV*)PL_last_in_gv != &PL_sv_undef) {
1016 assert(isGV_with_GP(PL_last_in_gv));
972c8f20 1017 sv_setrv_inc(sv, MUTABLE_SV(PL_last_in_gv));
1604cfb0
MS
1018 sv_rvweaken(sv);
1019 }
1020 else
3773545d 1021 sv_set_undef(sv);
1604cfb0
MS
1022 }
1023 break;
ac27b0f5 1024 case '\017': /* ^O & ^OPEN */
1604cfb0
MS
1025 if (nextchar == '\0') {
1026 sv_setpv(sv, PL_osname);
1027 SvTAINTED_off(sv);
1028 }
1029 else if (strEQ(remaining, "PEN")) {
1030 Perl_emulate_cop_io(aTHX_ &PL_compiling, sv);
1031 }
1032 break;
9ebf26ad 1033 case '\020':
a6d0b1b5 1034 sv_setiv(sv, (IV)PL_perldb);
1604cfb0 1035 break;
fb73857a 1036 case '\023': /* ^S */
1604cfb0
MS
1037 if (nextchar == '\0') {
1038 if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING)
1039 SvOK_off(sv);
1040 else if (PL_in_eval)
1041 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
1042 else
1043 sv_setiv(sv, 0);
1044 }
1045 else if (strEQ(remaining, "AFE_LOCALES")) {
f512d242
KW
1046
1047#if ! defined(USE_ITHREADS) || defined(USE_THREAD_SAFE_LOCALE)
1048
1604cfb0 1049 sv_setuv(sv, (UV) 1);
f512d242
KW
1050
1051#else
1604cfb0 1052 sv_setuv(sv, (UV) 0);
f512d242
KW
1053
1054#endif
1055
1056 }
1604cfb0 1057 break;
79072805 1058 case '\024': /* ^T */
1604cfb0 1059 if (nextchar == '\0') {
88e89b8a 1060#ifdef BIG_TIME
7c36658b 1061 sv_setnv(sv, PL_basetime);
88e89b8a 1062#else
7c36658b 1063 sv_setiv(sv, (IV)PL_basetime);
88e89b8a 1064#endif
7c36658b 1065 }
1604cfb0 1066 else if (strEQ(remaining, "AINT"))
284167a5 1067 sv_setiv(sv, TAINTING_get
1604cfb0
MS
1068 ? (TAINT_WARN_get || PL_unsafe ? -1 : 1)
1069 : 0);
7c36658b 1070 break;
e07ea26a 1071 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
1604cfb0
MS
1072 if (strEQ(remaining, "NICODE"))
1073 sv_setuv(sv, (UV) PL_unicode);
1074 else if (strEQ(remaining, "TF8LOCALE"))
1075 sv_setuv(sv, (UV) PL_utf8locale);
1076 else if (strEQ(remaining, "TF8CACHE"))
1077 sv_setiv(sv, (IV) PL_utf8cache);
fde18df1
JH
1078 break;
1079 case '\027': /* ^W & $^WARNING_BITS */
1604cfb0
MS
1080 if (nextchar == '\0')
1081 sv_setiv(sv, (IV)cBOOL(PL_dowarn & G_WARN_ON));
1082 else if (strEQ(remaining, "ARNING_BITS")) {
1083 if (PL_compiling.cop_warnings == pWARN_NONE) {
1084 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
1085 }
1086 else if (PL_compiling.cop_warnings == pWARN_STD) {
e03e82a0 1087 goto set_undef;
1604cfb0 1088 }
d3a7d8c7 1089 else if (PL_compiling.cop_warnings == pWARN_ALL) {
1604cfb0
MS
1090 sv_setpvn(sv, WARN_ALLstring, WARNsize);
1091 }
4438c4b7 1092 else {
f8552c1a
YO
1093 sv_setpvn(sv, PL_compiling.cop_warnings,
1094 RCPV_LEN(PL_compiling.cop_warnings));
1604cfb0
MS
1095 }
1096 }
1097 break;
79072805 1098 case '+':
1604cfb0
MS
1099 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1100 paren = RX_LASTPAREN(rx);
1101 if (paren)
2c7b5d76 1102 goto do_numbuf_fetch;
1604cfb0 1103 }
e03e82a0 1104 goto set_undef;
a01268b5 1105 case '\016': /* ^N */
1604cfb0
MS
1106 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1107 paren = RX_LASTCLOSEPAREN(rx);
fe5492d9
YO
1108 if (RX_PARNO_TO_LOGICAL(rx))
1109 paren = RX_PARNO_TO_LOGICAL(rx)[paren];
1604cfb0 1110 if (paren)
2c7b5d76 1111 goto do_numbuf_fetch;
1604cfb0 1112 }
e03e82a0 1113 goto set_undef;
79072805 1114 case '.':
1604cfb0
MS
1115 if (GvIO(PL_last_in_gv)) {
1116 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
1117 }
1118 break;
79072805 1119 case '?':
1604cfb0
MS
1120 {
1121 sv_setiv(sv, (IV)STATUS_CURRENT);
ff0cee69 1122#ifdef COMPLEX_STATUS
1604cfb0
MS
1123 SvUPGRADE(sv, SVt_PVLV);
1124 LvTARGOFF(sv) = PL_statusvalue;
1125 LvTARGLEN(sv) = PL_statusvalue_vms;
ff0cee69 1126#endif
1604cfb0
MS
1127 }
1128 break;
79072805 1129 case '^':
1604cfb0
MS
1130 if (GvIOp(PL_defoutgv))
1131 s = IoTOP_NAME(GvIOp(PL_defoutgv));
1132 if (s)
1133 sv_setpv(sv,s);
1134 else {
1135 sv_setpv(sv,GvENAME(PL_defoutgv));
1136 sv_catpvs(sv,"_TOP");
1137 }
1138 break;
79072805 1139 case '~':
1604cfb0
MS
1140 if (GvIOp(PL_defoutgv))
1141 s = IoFMT_NAME(GvIOp(PL_defoutgv));
1142 if (!s)
1143 s = GvENAME(PL_defoutgv);
1144 sv_setpv(sv,s);
1145 break;
79072805 1146 case '=':
1604cfb0
MS
1147 if (GvIO(PL_defoutgv))
1148 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
1149 break;
79072805 1150 case '-':
1604cfb0
MS
1151 if (GvIO(PL_defoutgv))
1152 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
1153 break;
79072805 1154 case '%':
1604cfb0
MS
1155 if (GvIO(PL_defoutgv))
1156 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
1157 break;
79072805 1158 case ':':
79072805 1159 case '/':
1604cfb0 1160 break;
79072805 1161 case '[':
1604cfb0
MS
1162 sv_setiv(sv, 0);
1163 break;
79072805 1164 case '|':
1604cfb0
MS
1165 if (GvIO(PL_defoutgv))
1166 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
1167 break;
79072805 1168 case '\\':
1604cfb0
MS
1169 if (PL_ors_sv)
1170 sv_copypv(sv, PL_ors_sv);
1171 else
e03e82a0 1172 goto set_undef;
1604cfb0 1173 break;
0e219455 1174 case '$': /* $$ */
1604cfb0
MS
1175 {
1176 IV const pid = (IV)PerlProc_getpid();
1177 if (isGV(mg->mg_obj) || SvIV(mg->mg_obj) != pid) {
1178 /* never set manually, or at least not since last fork */
1179 sv_setiv(sv, pid);
1180 /* never unsafe, even if reading in a tainted expression */
1181 SvTAINTED_off(sv);
1182 }
1183 /* else a value has been assigned manually, so do nothing */
1184 }
1185 break;
79072805 1186 case '<':
dfff4baf 1187 sv_setuid(sv, PerlProc_getuid());
1604cfb0 1188 break;
79072805 1189 case '>':
dfff4baf 1190 sv_setuid(sv, PerlProc_geteuid());
1604cfb0 1191 break;
79072805 1192 case '(':
dfff4baf 1193 sv_setgid(sv, PerlProc_getgid());
1604cfb0 1194 goto add_groups;
79072805 1195 case ')':
dfff4baf 1196 sv_setgid(sv, PerlProc_getegid());
79072805 1197 add_groups:
79072805 1198#ifdef HAS_GETGROUPS
1604cfb0
MS
1199 {
1200 Groups_t *gary = NULL;
375ed12a
JH
1201 I32 num_groups = getgroups(0, gary);
1202 if (num_groups > 0) {
19742f39 1203 I32 i;
375ed12a
JH
1204 Newx(gary, num_groups, Groups_t);
1205 num_groups = getgroups(num_groups, gary);
1206 for (i = 0; i < num_groups; i++)
147e3846 1207 Perl_sv_catpvf(aTHX_ sv, " %" IVdf, (IV)gary[i]);
375ed12a
JH
1208 Safefree(gary);
1209 }
1604cfb0 1210 }
1a93d8df
FG
1211
1212 /*
1213 Set this to avoid warnings when the SV is used as a number.
1214 Avoid setting the public IOK flag so that serializers will
1215 use the PV.
1216 */
1217 (void)SvIOKp_on(sv); /* what a wonderful hack! */
cd70abae 1218#endif
1604cfb0 1219 break;
79072805 1220 case '0':
1604cfb0 1221 break;
79072805 1222 }
a0d0e21e 1223 return 0;
e03e82a0
DM
1224
1225 set_undef:
1226 sv_set_undef(sv);
1227 return 0;
79072805
LW
1228}
1229
1230int
864dbfa3 1231Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
79072805 1232{
8772537c 1233 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
79072805 1234
7918f24d
NC
1235 PERL_ARGS_ASSERT_MAGIC_GETUVAR;
1236
79072805 1237 if (uf && uf->uf_val)
1604cfb0 1238 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
79072805
LW
1239 return 0;
1240}
1241
1242int
864dbfa3 1243Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
79072805 1244{
9ae3433d 1245 STRLEN len = 0, klen;
50352f16
FG
1246
1247 const char *key;
888a67f6 1248 const char *s = "";
1e422769 1249
50352f16
FG
1250 SV *keysv = MgSV(mg);
1251
1252 if (keysv == NULL) {
1253 key = mg->mg_ptr;
1254 klen = mg->mg_len;
1255 }
1256 else {
1257 if (!sv_utf8_downgrade(keysv, /* fail_ok */ TRUE)) {
1258 Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv key (encoding to utf8)");
1259 }
1260
1261 key = SvPV_const(keysv,klen);
1262 }
1263
7918f24d
NC
1264 PERL_ARGS_ASSERT_MAGIC_SETENV;
1265
613c63b4 1266 SvGETMAGIC(sv);
12033064 1267 if (SvOK(sv)) {
613c63b4
CS
1268 /* defined environment variables are byte strings; unfortunately
1269 there is no SvPVbyte_force_nomg(), so we must do this piecewise */
1270 (void)SvPV_force_nomg_nolen(sv);
90eef0af 1271 (void)sv_utf8_downgrade(sv, /* fail_ok */ TRUE);
613c63b4
CS
1272 if (SvUTF8(sv)) {
1273 Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv");
1274 SvUTF8_off(sv);
1275 }
1276 s = SvPVX(sv);
1277 len = SvCUR(sv);
12033064
CS
1278 }
1279 my_setenv(key, s); /* does the deed */
1280
a0d0e21e
LW
1281#ifdef DYNAMIC_ENV_FETCH
1282 /* We just undefd an environment var. Is a replacement */
1283 /* waiting in the wings? */
1284 if (!len) {
1604cfb0
MS
1285 SV ** const valp = hv_fetch(GvHVn(PL_envgv), key, klen, FALSE);
1286 if (valp)
1287 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
a0d0e21e
LW
1288 }
1289#endif
1e422769 1290
4457f3fc 1291#if !defined(OS2) && !defined(WIN32)
1604cfb0
MS
1292 /* And you'll never guess what the dog had */
1293 /* in its mouth... */
284167a5 1294 if (TAINTING_get) {
1604cfb0 1295 MgTAINTEDDIR_off(mg);
1e422769 1296#ifdef VMS
1604cfb0
MS
1297 if (s && memEQs(key, klen, "DCL$PATH")) {
1298 char pathbuf[256], eltbuf[256], *cp, *elt;
1299 int i = 0, j = 0;
1300
1301 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1302 elt = eltbuf;
1303 do { /* DCL$PATH may be a search list */
1304 while (1) { /* as may dev portion of any element */
1305 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1306 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1307 cando_by_name(S_IWUSR,0,elt) ) {
1308 MgTAINTEDDIR_on(mg);
1309 return 0;
1310 }
1311 }
1312 if ((cp = strchr(elt, ':')) != NULL)
1313 *cp = '\0';
1314 if (my_trnlnm(elt, eltbuf, j++))
1315 elt = eltbuf;
1316 else
1317 break;
1318 }
1319 j = 0;
1320 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1321 }
1e422769 1322#endif /* VMS */
1604cfb0
MS
1323 if (s && memEQs(key, klen, "PATH")) {
1324 const char * const strend = s + len;
1c9a202f
YO
1325#ifdef __VMS /* Hmm. How do we get $Config{path_sep} from C? */
1326 const char path_sep = PL_perllib_sep;
1327#else
1328 const char path_sep = ':';
1329#endif
463ee0b2 1330
92ec2fce
YO
1331#ifndef __VMS
1332 /* Does this apply for VMS?
1333 * Empty PATH on linux is treated same as ".", which is forbidden
1334 * under taint. So check if the PATH variable is empty. */
1335 if (!len) {
1336 MgTAINTEDDIR_on(mg);
1337 return 0;
1338 }
1339#endif
70b484a8
DM
1340 /* set MGf_TAINTEDDIR if any component of the new path is
1341 * relative or world-writeable */
1604cfb0
MS
1342 while (s < strend) {
1343 char tmpbuf[256];
1344 Stat_t st;
1345 I32 i;
1604cfb0
MS
1346 s = delimcpy_no_escape(tmpbuf, tmpbuf + sizeof tmpbuf,
1347 s, strend, path_sep, &i);
1348 s++;
1349 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
83269ced 1350#ifdef __VMS
1604cfb0
MS
1351 /* no colon thus no device name -- assume relative path */
1352 || (PL_perllib_sep != ':' && !strchr(tmpbuf, ':'))
1353 /* Using Unix separator, e.g. under bash, so act line Unix */
1354 || (PL_perllib_sep == ':' && *tmpbuf != '/')
326b5008 1355#else
92ec2fce
YO
1356 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1357 || s == strend /* trailing empty component -- same as "." */
326b5008 1358#endif
1604cfb0
MS
1359 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1360 MgTAINTEDDIR_on(mg);
1361 return 0;
1362 }
1363 }
1364 }
79072805 1365 }
4457f3fc 1366#endif /* neither OS2 nor WIN32 */
1e422769 1367
79072805
LW
1368 return 0;
1369}
1370
1371int
864dbfa3 1372Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
85e6fe83 1373{
7918f24d 1374 PERL_ARGS_ASSERT_MAGIC_CLEARENV;
8772537c 1375 PERL_UNUSED_ARG(sv);
bd61b366 1376 my_setenv(MgPV_nolen_const(mg),NULL);
85e6fe83
LW
1377 return 0;
1378}
1379
88e89b8a 1380int
864dbfa3 1381Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
fb73857a 1382{
7918f24d 1383 PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV;
65e66c80 1384 PERL_UNUSED_ARG(mg);
b0269e46 1385#if defined(VMS)
cea2e8a9 1386 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
fb73857a 1387#else
3280af22 1388 if (PL_localizing) {
1604cfb0
MS
1389 HE* entry;
1390 my_clearenv();
1391 hv_iterinit(MUTABLE_HV(sv));
1392 while ((entry = hv_iternext(MUTABLE_HV(sv)))) {
1393 I32 keylen;
1394 my_setenv(hv_iterkey(entry, &keylen),
1395 SvPV_nolen_const(hv_iterval(MUTABLE_HV(sv), entry)));
1396 }
fb73857a 1397 }
1398#endif
1399 return 0;
1400}
1401
1402int
864dbfa3 1403Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
66b1d557 1404{
7918f24d 1405 PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV;
8772537c
AL
1406 PERL_UNUSED_ARG(sv);
1407 PERL_UNUSED_ARG(mg);
b0269e46
AB
1408#if defined(VMS)
1409 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1410#else
1411 my_clearenv();
1412#endif
3e3baf6d 1413 return 0;
66b1d557
HM
1414}
1415
64ca3a65 1416#ifndef PERL_MICRO
2d4fcd5e
AJ
1417#ifdef HAS_SIGPROCMASK
1418static void
1419restore_sigmask(pTHX_ SV *save_sv)
1420{
0bd48802 1421 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
f5a63d97 1422 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
2d4fcd5e
AJ
1423}
1424#endif
66b1d557 1425int
864dbfa3 1426Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 1427{
88e89b8a 1428 /* Are we fetching a signal entry? */
708854f2 1429 int i = (I16)mg->mg_private;
7918f24d
NC
1430
1431 PERL_ARGS_ASSERT_MAGIC_GETSIG;
1432
708854f2 1433 if (!i) {
84c7b88c
BF
1434 STRLEN siglen;
1435 const char * sig = MgPV_const(mg, siglen);
1436 mg->mg_private = i = whichsig_pvn(sig, siglen);
708854f2
NC
1437 }
1438
e02bfb16 1439 if (i > 0) {
1604cfb0
MS
1440 if(PL_psig_ptr[i])
1441 sv_setsv(sv,PL_psig_ptr[i]);
1442 else {
1443 Sighandler_t sigstate = rsignal_state(i);
23ada85b 1444#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1604cfb0
MS
1445 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1446 sigstate = SIG_IGN;
2e34cc90
CL
1447#endif
1448#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1604cfb0
MS
1449 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1450 sigstate = SIG_DFL;
85b332e2 1451#endif
1604cfb0
MS
1452 /* cache state so we don't fetch it again */
1453 if(sigstate == (Sighandler_t) SIG_IGN)
1454 sv_setpvs(sv,"IGNORE");
1455 else
e03e82a0 1456 sv_set_undef(sv);
1604cfb0
MS
1457 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1458 SvTEMP_off(sv);
1459 }
88e89b8a 1460 }
1461 return 0;
1462}
1463int
864dbfa3 1464Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 1465{
7918f24d 1466 PERL_ARGS_ASSERT_MAGIC_CLEARSIG;
179c85a2 1467
38a124f0 1468 magic_setsig(NULL, mg);
179c85a2 1469 return sv_unmagic(sv, mg->mg_type);
88e89b8a 1470}
3d37d572 1471
dc37125b 1472
5e7940ce 1473#ifdef PERL_USE_3ARG_SIGHANDLER
dc37125b
DM
1474Signal_t
1475Perl_csighandler(int sig, Siginfo_t *sip, void *uap)
1476{
1477 Perl_csighandler3(sig, sip, uap);
1478}
8aad04aa 1479#else
dc37125b 1480Signal_t
0a8e0eff 1481Perl_csighandler(int sig)
dc37125b
DM
1482{
1483 Perl_csighandler3(sig, NULL, NULL);
1484}
8aad04aa 1485#endif
dc37125b
DM
1486
1487Signal_t
1488Perl_csighandler1(int sig)
1489{
1490 Perl_csighandler3(sig, NULL, NULL);
1491}
1492
1493/* Handler intended to directly handle signal calls from the kernel.
1494 * (Depending on configuration, the kernel may actually call one of the
1495 * wrappers csighandler() or csighandler1() instead.)
1496 * It either queues up the signal or dispatches it immediately depending
1497 * on whether safe signals are enabled and whether the signal is capable
1498 * of being deferred (e.g. SEGV isn't).
1499 */
1500
1501Signal_t
1502Perl_csighandler3(int sig, Siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
0a8e0eff 1503{
1018e26f
NIS
1504#ifdef PERL_GET_SIG_CONTEXT
1505 dTHXa(PERL_GET_SIG_CONTEXT);
1506#else
85b332e2
CL
1507 dTHX;
1508#endif
5e7940ce
DM
1509
1510#ifdef PERL_USE_3ARG_SIGHANDLER
ffb6256b
JH
1511#if defined(__cplusplus) && defined(__GNUC__)
1512 /* g++ doesn't support PERL_UNUSED_DECL, so the sip and uap
1513 * parameters would be warned about. */
1514 PERL_UNUSED_ARG(sip);
1515 PERL_UNUSED_ARG(uap);
1516#endif
1271a1be 1517#endif
5e7940ce 1518
23ada85b 1519#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
5c1546dc 1520 (void) rsignal(sig, PL_csighandlerp);
27da23d5 1521 if (PL_sig_ignoring[sig]) return;
85b332e2 1522#endif
2e34cc90 1523#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1524 if (PL_sig_defaulting[sig])
2e34cc90
CL
1525#ifdef KILL_BY_SIGPRC
1526 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1527#else
1528 exit(1);
1529#endif
1530#endif
406878dd 1531 if (
853d2c32 1532#ifdef SIGILL
1604cfb0 1533 sig == SIGILL ||
853d2c32
RGS
1534#endif
1535#ifdef SIGBUS
1604cfb0 1536 sig == SIGBUS ||
853d2c32
RGS
1537#endif
1538#ifdef SIGSEGV
1604cfb0 1539 sig == SIGSEGV ||
5892d8f5
HS
1540#endif
1541#ifdef SIGFPE
1542 sig == SIGFPE ||
853d2c32 1543#endif
1604cfb0
MS
1544 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1545 /* Call the perl level handler now--
1546 * with risk we may be in malloc() or being destructed etc. */
8a5e470b
DM
1547 {
1548 if (PL_sighandlerp == Perl_sighandler)
1549 /* default handler, so can call perly_sighandler() directly
1550 * rather than via Perl_sighandler, passing the extra
1551 * 'safe = false' arg
1552 */
ddb513d5 1553 Perl_perly_sighandler(sig, NULL, NULL, 0 /* unsafe */);
8a5e470b 1554 else
5e7940ce 1555#ifdef PERL_USE_3ARG_SIGHANDLER
8a5e470b 1556 (*PL_sighandlerp)(sig, NULL, NULL);
6e324d09 1557#else
8a5e470b 1558 (*PL_sighandlerp)(sig);
92807b6d 1559#endif
8a5e470b 1560 }
406878dd 1561 else {
1604cfb0
MS
1562 if (!PL_psig_pend) return;
1563 /* Set a flag to say this signal is pending, that is awaiting delivery after
1564 * the current Perl opcode completes */
1565 PL_psig_pend[sig]++;
406878dd
GA
1566
1567#ifndef SIG_PENDING_DIE_COUNT
1568# define SIG_PENDING_DIE_COUNT 120
1569#endif
1604cfb0
MS
1570 /* Add one to say _a_ signal is pending */
1571 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1572 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1573 (unsigned long)SIG_PENDING_DIE_COUNT);
406878dd 1574 }
0a8e0eff
NIS
1575}
1576
2e34cc90
CL
1577#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1578void
1579Perl_csighandler_init(void)
1580{
1581 int sig;
27da23d5 1582 if (PL_sig_handlers_initted) return;
2e34cc90
CL
1583
1584 for (sig = 1; sig < SIG_SIZE; sig++) {
1585#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
218fdd94 1586 dTHX;
27da23d5 1587 PL_sig_defaulting[sig] = 1;
5c1546dc 1588 (void) rsignal(sig, PL_csighandlerp);
2e34cc90
CL
1589#endif
1590#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1591 PL_sig_ignoring[sig] = 0;
2e34cc90
CL
1592#endif
1593 }
27da23d5 1594 PL_sig_handlers_initted = 1;
2e34cc90
CL
1595}
1596#endif
1597
7fe50b8b
LT
1598#if defined HAS_SIGPROCMASK
1599static void
1600unblock_sigmask(pTHX_ void* newset)
1601{
dc3bf405 1602 PERL_UNUSED_CONTEXT;
7fe50b8b
LT
1603 sigprocmask(SIG_UNBLOCK, (sigset_t*)newset, NULL);
1604}
1605#endif
1606
0a8e0eff
NIS
1607void
1608Perl_despatch_signals(pTHX)
1609{
1610 int sig;
1611 PL_sig_pending = 0;
1612 for (sig = 1; sig < SIG_SIZE; sig++) {
1604cfb0
MS
1613 if (PL_psig_pend[sig]) {
1614 dSAVE_ERRNO;
7fe50b8b 1615#ifdef HAS_SIGPROCMASK
1604cfb0
MS
1616 /* From sigaction(2) (FreeBSD man page):
1617 * | Signal routines normally execute with the signal that
1618 * | caused their invocation blocked, but other signals may
1619 * | yet occur.
1620 * Emulation of this behavior (from within Perl) is enabled
1621 * using sigprocmask
1622 */
1623 int was_blocked;
1624 sigset_t newset, oldset;
1625
1626 sigemptyset(&newset);
1627 sigaddset(&newset, sig);
1628 sigprocmask(SIG_BLOCK, &newset, &oldset);
1629 was_blocked = sigismember(&oldset, sig);
1630 if (!was_blocked) {
1631 SV* save_sv = newSVpvn((char *)(&newset), sizeof(sigset_t));
1632 ENTER;
1633 SAVEFREESV(save_sv);
1634 SAVEDESTRUCTOR_X(unblock_sigmask, SvPV_nolen(save_sv));
1635 }
1636#endif
1637 PL_psig_pend[sig] = 0;
8a5e470b
DM
1638 if (PL_sighandlerp == Perl_sighandler)
1639 /* default handler, so can call perly_sighandler() directly
1640 * rather than via Perl_sighandler, passing the extra
1641 * 'safe = true' arg
1642 */
1643 Perl_perly_sighandler(sig, NULL, NULL, 1 /* safe */);
1644 else
5e7940ce 1645#ifdef PERL_USE_3ARG_SIGHANDLER
8a5e470b 1646 (*PL_sighandlerp)(sig, NULL, NULL);
6e324d09 1647#else
8a5e470b 1648 (*PL_sighandlerp)(sig);
92807b6d 1649#endif
8a5e470b 1650
7fe50b8b 1651#ifdef HAS_SIGPROCMASK
1604cfb0
MS
1652 if (!was_blocked)
1653 LEAVE;
55534442 1654#endif
1604cfb0
MS
1655 RESTORE_ERRNO;
1656 }
0a8e0eff
NIS
1657 }
1658}
1659
38a124f0 1660/* sv of NULL signifies that we're acting as magic_clearsig. */
85e6fe83 1661int
864dbfa3 1662Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
79072805 1663{
79072805 1664 I32 i;
cbbf8932 1665 SV** svp = NULL;
2d4fcd5e
AJ
1666 /* Need to be careful with SvREFCNT_dec(), because that can have side
1667 * effects (due to closures). We must make sure that the new disposition
1668 * is in place before it is called.
1669 */
cbbf8932 1670 SV* to_dec = NULL;
e72dc28c 1671 STRLEN len;
2d4fcd5e
AJ
1672#ifdef HAS_SIGPROCMASK
1673 sigset_t set, save;
1674 SV* save_sv;
1675#endif
eb578fdb 1676 const char *s = MgPV_const(mg,len);
7918f24d
NC
1677
1678 PERL_ARGS_ASSERT_MAGIC_SETSIG;
1679
748a9306 1680 if (*s == '_') {
84c7b88c 1681 if (memEQs(s, len, "__DIE__"))
1604cfb0
MS
1682 svp = &PL_diehook;
1683 else if (memEQs(s, len, "__WARN__")
1684 && (sv ? 1 : PL_warnhook != PERL_WARNHOOK_FATAL)) {
1685 /* Merge the existing behaviours, which are as follows:
1686 magic_setsig, we always set svp to &PL_warnhook
1687 (hence we always change the warnings handler)
1688 For magic_clearsig, we don't change the warnings handler if it's
1689 set to the &PL_warnhook. */
1690 svp = &PL_warnhook;
84c7b88c
BF
1691 } else if (sv) {
1692 SV *tmp = sv_newmortal();
1693 Perl_croak(aTHX_ "No such hook: %s",
1694 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1695 }
1604cfb0
MS
1696 i = 0;
1697 if (svp && *svp) {
1698 if (*svp != PERL_WARNHOOK_FATAL)
1699 to_dec = *svp;
1700 *svp = NULL;
1701 }
748a9306
LW
1702 }
1703 else {
1604cfb0
MS
1704 i = (I16)mg->mg_private;
1705 if (!i) {
1706 i = whichsig_pvn(s, len); /* ...no, a brick */
1707 mg->mg_private = (U16)i;
1708 }
1709 if (i <= 0) {
1710 if (sv) {
84c7b88c 1711 SV *tmp = sv_newmortal();
1604cfb0 1712 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s",
84c7b88c
BF
1713 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1714 }
1604cfb0
MS
1715 return 0;
1716 }
2d4fcd5e 1717#ifdef HAS_SIGPROCMASK
1604cfb0
MS
1718 /* Avoid having the signal arrive at a bad time, if possible. */
1719 sigemptyset(&set);
1720 sigaddset(&set,i);
1721 sigprocmask(SIG_BLOCK, &set, &save);
1722 ENTER;
1723 save_sv = newSVpvn((char *)(&save), sizeof(sigset_t));
1724 SAVEFREESV(save_sv);
1725 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1726#endif
1727 PERL_ASYNC_CHECK();
2e34cc90 1728#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1604cfb0 1729 if (!PL_sig_handlers_initted) Perl_csighandler_init();
2e34cc90 1730#endif
23ada85b 1731#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1604cfb0 1732 PL_sig_ignoring[i] = 0;
85b332e2 1733#endif
2e34cc90 1734#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1604cfb0
MS
1735 PL_sig_defaulting[i] = 0;
1736#endif
1737 to_dec = PL_psig_ptr[i];
1738 if (sv) {
1739 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1740 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1741
1742 /* Signals don't change name during the program's execution, so once
1743 they're cached in the appropriate slot of PL_psig_name, they can
1744 stay there.
1745
1746 Ideally we'd find some way of making SVs at (C) compile time, or
1747 at least, doing most of the work. */
1748 if (!PL_psig_name[i]) {
1749 const char* name = PL_sig_name[i];
1750 PL_psig_name[i] = newSVpvn(name, strlen(name));
1751 SvREADONLY_on(PL_psig_name[i]);
1752 }
1753 } else {
1754 SvREFCNT_dec(PL_psig_name[i]);
1755 PL_psig_name[i] = NULL;
1756 PL_psig_ptr[i] = NULL;
1757 }
748a9306 1758 }
38a124f0 1759 if (sv && (isGV_with_GP(sv) || SvROK(sv))) {
1604cfb0
MS
1760 if (i) {
1761 (void)rsignal(i, PL_csighandlerp);
1762 }
1763 else
1764 *svp = SvREFCNT_inc_simple_NN(sv);
38a124f0 1765 } else {
1604cfb0
MS
1766 if (sv && SvOK(sv)) {
1767 s = SvPV_force(sv, len);
1768 } else {
1769 sv = NULL;
1770 }
1771 if (sv && memEQs(s, len,"IGNORE")) {
1772 if (i) {
23ada85b 1773#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1604cfb0
MS
1774 PL_sig_ignoring[i] = 1;
1775 (void)rsignal(i, PL_csighandlerp);
85b332e2 1776#else
1604cfb0 1777 (void)rsignal(i, (Sighandler_t) SIG_IGN);
85b332e2 1778#endif
1604cfb0
MS
1779 }
1780 }
1781 else if (!sv || memEQs(s, len,"DEFAULT") || !len) {
1782 if (i) {
2e34cc90 1783#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1604cfb0
MS
1784 PL_sig_defaulting[i] = 1;
1785 (void)rsignal(i, PL_csighandlerp);
2e34cc90 1786#else
1604cfb0
MS
1787 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1788#endif
1789 }
1790 }
1791 else {
1792 /*
1793 * We should warn if HINT_STRICT_REFS, but without
1794 * access to a known hint bit in a known OP, we can't
1795 * tell whether HINT_STRICT_REFS is in force or not.
1796 */
1797 if (!memchr(s, ':', len) && !memchr(s, '\'', len))
1798 Perl_sv_insert_flags(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"),
1799 SV_GMAGIC);
1800 if (i)
1801 (void)rsignal(i, PL_csighandlerp);
1802 else
1803 *svp = SvREFCNT_inc_simple_NN(sv);
1804 }
748a9306 1805 }
9dfa190b 1806
2d4fcd5e
AJ
1807#ifdef HAS_SIGPROCMASK
1808 if(i)
1604cfb0 1809 LEAVE;
2d4fcd5e 1810#endif
ef8d46e8 1811 SvREFCNT_dec(to_dec);
79072805
LW
1812 return 0;
1813}
64ca3a65 1814#endif /* !PERL_MICRO */
79072805
LW
1815
1816int
55f5e765
LT
1817Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg)
1818{
1819 PERL_ARGS_ASSERT_MAGIC_SETSIGALL;
1820 PERL_UNUSED_ARG(mg);
1821
1822 if (PL_localizing == 2) {
1823 HV* hv = (HV*)sv;
1824 HE* current;
1825 hv_iterinit(hv);
1826 while ((current = hv_iternext(hv))) {
1827 SV* sigelem = hv_iterval(hv, current);
1828 mg_set(sigelem);
1829 }
1830 }
1831 return 0;
1832}
1833
1834int
864dbfa3 1835Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
79072805 1836{
7918f24d 1837 PERL_ARGS_ASSERT_MAGIC_SETISA;
8772537c 1838 PERL_UNUSED_ARG(sv);
e1a479c5 1839
89c14e2e 1840 /* Skip _isaelem because _isa will handle it shortly */
354b0578 1841 if (PL_delaymagic & DM_ARRAY_ISA && mg->mg_type == PERL_MAGIC_isaelem)
1604cfb0 1842 return 0;
89c14e2e 1843
0e446081 1844 return magic_clearisa(NULL, mg);
463ee0b2
LW
1845}
1846
0e446081 1847/* sv of NULL signifies that we're acting as magic_setisa. */
463ee0b2 1848int
52b45067
RD
1849Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
1850{
52b45067 1851 HV* stash;
7918f24d
NC
1852 PERL_ARGS_ASSERT_MAGIC_CLEARISA;
1853
52b45067 1854 /* Bail out if destruction is going on */
627364f1 1855 if(PL_phase == PERL_PHASE_DESTRUCT) return 0;
52b45067 1856
0e446081 1857 if (sv)
1604cfb0 1858 av_clear(MUTABLE_AV(sv));
52b45067 1859
6624142a 1860 if (SvTYPE(mg->mg_obj) != SVt_PVGV && SvSMAGICAL(mg->mg_obj))
1604cfb0
MS
1861 /* This occurs with setisa_elem magic, which calls this
1862 same function. */
1863 mg = mg_find(mg->mg_obj, PERL_MAGIC_isa);
6624142a 1864
316ebaf2 1865 assert(mg);
6624142a 1866 if (SvTYPE(mg->mg_obj) == SVt_PVAV) { /* multiple stashes */
1604cfb0
MS
1867 SV **svp = AvARRAY((AV *)mg->mg_obj);
1868 I32 items = AvFILLp((AV *)mg->mg_obj) + 1;
1869 while (items--) {
1870 stash = GvSTASH((GV *)*svp++);
2e4090b8 1871 if (stash && HvHasENAME(stash)) mro_isa_changed_in(stash);
1604cfb0 1872 }
6624142a 1873
1604cfb0 1874 return 0;
6624142a
FC
1875 }
1876
52b45067 1877 stash = GvSTASH(
6624142a 1878 (const GV *)mg->mg_obj
52b45067
RD
1879 );
1880
00169e2c
FC
1881 /* The stash may have been detached from the symbol table, so check its
1882 name before doing anything. */
2e4090b8 1883 if (stash && HvHasENAME(stash))
1604cfb0 1884 mro_isa_changed_in(stash);
52b45067
RD
1885
1886 return 0;
1887}
1888
1889int
864dbfa3 1890Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
6ff81951 1891{
85fbaab2 1892 HV * const hv = MUTABLE_HV(LvTARG(sv));
6ff81951 1893 I32 i = 0;
7918f24d
NC
1894
1895 PERL_ARGS_ASSERT_MAGIC_GETNKEYS;
8772537c 1896 PERL_UNUSED_ARG(mg);
7719e241 1897
6ff81951 1898 if (hv) {
497b47a8 1899 (void) hv_iterinit(hv);
ad64d0ec 1900 if (! SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
1604cfb0 1901 i = HvUSEDKEYS(hv);
497b47a8 1902 else {
1604cfb0
MS
1903 while (hv_iternext(hv))
1904 i++;
497b47a8 1905 }
6ff81951
GS
1906 }
1907
1908 sv_setiv(sv, (IV)i);
1909 return 0;
1910}
1911
1912int
864dbfa3 1913Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
946ec16e 1914{
7918f24d 1915 PERL_ARGS_ASSERT_MAGIC_SETNKEYS;
8772537c 1916 PERL_UNUSED_ARG(mg);
946ec16e 1917 if (LvTARG(sv)) {
1604cfb0 1918 hv_ksplit(MUTABLE_HV(LvTARG(sv)), SvIV(sv));
946ec16e 1919 }
1920 return 0;
ac27b0f5 1921}
946ec16e 1922
efaf3674 1923/*
3f620621 1924=for apidoc_section $magic
efaf3674
DM
1925=for apidoc magic_methcall
1926
1927Invoke a magic method (like FETCH).
1928
2baee27b
FC
1929C<sv> and C<mg> are the tied thingy and the tie magic.
1930
1931C<meth> is the name of the method to call.
1932
1933C<argc> is the number of args (in addition to $self) to pass to the method.
1934
1935The C<flags> can be:
1936
1937 G_DISCARD invoke method with G_DISCARD flag and don't
1938 return a value
1939 G_UNDEF_FILL fill the stack with argc pointers to
1940 PL_sv_undef
1941
1942The arguments themselves are any values following the C<flags> argument.
efaf3674 1943
796b6530 1944Returns the SV (if any) returned by the method, or C<NULL> on failure.
efaf3674
DM
1945
1946
1947=cut
1948*/
1949
1950SV*
36925d9e 1951Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags,
1604cfb0 1952 U32 argc, ...)
a0d0e21e
LW
1953{
1954 dSP;
efaf3674 1955 SV* ret = NULL;
463ee0b2 1956
7918f24d
NC
1957 PERL_ARGS_ASSERT_MAGIC_METHCALL;
1958
efaf3674 1959 ENTER;
d1d7a15d
NC
1960
1961 if (flags & G_WRITING_TO_STDERR) {
1604cfb0 1962 SAVETMPS;
d1d7a15d 1963
1604cfb0
MS
1964 save_re_context();
1965 SAVESPTR(PL_stderrgv);
1966 PL_stderrgv = NULL;
d1d7a15d
NC
1967 }
1968
efaf3674 1969 PUSHSTACKi(PERLSI_MAGIC);
924508f0 1970 PUSHMARK(SP);
efaf3674 1971
052a7c76
DM
1972 /* EXTEND() expects a signed argc; don't wrap when casting */
1973 assert(argc <= I32_MAX);
1974 EXTEND(SP, (I32)argc+1);
67549bd2
NC
1975 PUSHs(SvTIED_obj(sv, mg));
1976 if (flags & G_UNDEF_FILL) {
1604cfb0
MS
1977 while (argc--) {
1978 PUSHs(&PL_sv_undef);
1979 }
67549bd2 1980 } else if (argc > 0) {
1604cfb0
MS
1981 va_list args;
1982 va_start(args, argc);
046b0c7d 1983
1604cfb0
MS
1984 do {
1985 SV *const this_sv = va_arg(args, SV *);
1986 PUSHs(this_sv);
1987 } while (--argc);
046b0c7d 1988
1604cfb0 1989 va_end(args);
88e89b8a 1990 }
463ee0b2 1991 PUTBACK;
efaf3674 1992 if (flags & G_DISCARD) {
1604cfb0 1993 call_sv(meth, G_SCALAR|G_DISCARD|G_METHOD_NAMED);
efaf3674
DM
1994 }
1995 else {
1604cfb0
MS
1996 if (call_sv(meth, G_SCALAR|G_METHOD_NAMED))
1997 ret = *PL_stack_sp--;
efaf3674
DM
1998 }
1999 POPSTACK;
d1d7a15d 2000 if (flags & G_WRITING_TO_STDERR)
1604cfb0 2001 FREETMPS;
efaf3674
DM
2002 LEAVE;
2003 return ret;
2004}
2005
efaf3674 2006/* wrapper for magic_methcall that creates the first arg */
463ee0b2 2007
efaf3674 2008STATIC SV*
36925d9e 2009S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags,
efaf3674
DM
2010 int n, SV *val)
2011{
efaf3674
DM
2012 SV* arg1 = NULL;
2013
2014 PERL_ARGS_ASSERT_MAGIC_METHCALL1;
2015
2016 if (mg->mg_ptr) {
1604cfb0
MS
2017 if (mg->mg_len >= 0) {
2018 arg1 = newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
2019 }
2020 else if (mg->mg_len == HEf_SVKEY)
2021 arg1 = MUTABLE_SV(mg->mg_ptr);
efaf3674
DM
2022 }
2023 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1604cfb0
MS
2024 arg1 = newSViv((IV)(mg->mg_len));
2025 sv_2mortal(arg1);
efaf3674
DM
2026 }
2027 if (!arg1) {
1604cfb0 2028 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n - 1, val);
efaf3674 2029 }
046b0c7d 2030 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n, arg1, val);
946ec16e 2031}
2032
76e3520e 2033STATIC int
36925d9e 2034S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth)
a0d0e21e 2035{
efaf3674 2036 SV* ret;
463ee0b2 2037
7918f24d
NC
2038 PERL_ARGS_ASSERT_MAGIC_METHPACK;
2039
efaf3674
DM
2040 ret = magic_methcall1(sv, mg, meth, 0, 1, NULL);
2041 if (ret)
1604cfb0 2042 sv_setsv(sv, ret);
a0d0e21e
LW
2043 return 0;
2044}
463ee0b2 2045
a0d0e21e 2046int
864dbfa3 2047Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 2048{
7918f24d
NC
2049 PERL_ARGS_ASSERT_MAGIC_GETPACK;
2050
fd69380d 2051 if (mg->mg_type == PERL_MAGIC_tiedelem)
1604cfb0 2052 mg->mg_flags |= MGf_GSKIP;
36925d9e 2053 magic_methpack(sv,mg,SV_CONST(FETCH));
463ee0b2
LW
2054 return 0;
2055}
2056
2057int
864dbfa3 2058Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
e336de0d 2059{
b112cff9
DM
2060 MAGIC *tmg;
2061 SV *val;
7918f24d
NC
2062
2063 PERL_ARGS_ASSERT_MAGIC_SETPACK;
2064
b112cff9
DM
2065 /* in the code C<$tied{foo} = $val>, the "thing" that gets passed to
2066 * STORE() is not $val, but rather a PVLV (the sv in this call), whose
2067 * public flags indicate its value based on copying from $val. Doing
2068 * mg_set() on the PVLV temporarily does SvMAGICAL_off(), then calls us.
2069 * So STORE()'s $_[2] arg is a temporarily disarmed PVLV. This goes
2070 * wrong if $val happened to be tainted, as sv hasn't got magic
2071 * enabled, even though taint magic is in the chain. In which case,
2072 * fake up a temporary tainted value (this is easier than temporarily
2073 * re-enabling magic on sv). */
2074
284167a5 2075 if (TAINTING_get && (tmg = mg_find(sv, PERL_MAGIC_taint))
1604cfb0 2076 && (tmg->mg_len & 1))
b112cff9 2077 {
1604cfb0
MS
2078 val = sv_mortalcopy(sv);
2079 SvTAINTED_on(val);
b112cff9
DM
2080 }
2081 else
1604cfb0 2082 val = sv;
b112cff9 2083
36925d9e 2084 magic_methcall1(sv, mg, SV_CONST(STORE), G_DISCARD, 2, val);
463ee0b2
LW
2085 return 0;
2086}
2087
2088int
864dbfa3 2089Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 2090{
7918f24d
NC
2091 PERL_ARGS_ASSERT_MAGIC_CLEARPACK;
2092
4c13be3f 2093 if (mg->mg_type == PERL_MAGIC_tiedscalar) return 0;
36925d9e 2094 return magic_methpack(sv,mg,SV_CONST(DELETE));
a0d0e21e 2095}
463ee0b2 2096
93965878
NIS
2097
2098U32
864dbfa3 2099Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
ac27b0f5 2100{
22846ab4 2101 I32 retval = 0;
efaf3674 2102 SV* retsv;
93965878 2103
7918f24d
NC
2104 PERL_ARGS_ASSERT_MAGIC_SIZEPACK;
2105
36925d9e 2106 retsv = magic_methcall1(sv, mg, SV_CONST(FETCHSIZE), 0, 1, NULL);
efaf3674 2107 if (retsv) {
1604cfb0
MS
2108 retval = SvIV(retsv)-1;
2109 if (retval < -1)
2110 Perl_croak(aTHX_ "FETCHSIZE returned a negative value");
93965878 2111 }
22846ab4 2112 return (U32) retval;
93965878
NIS
2113}
2114
cea2e8a9
GS
2115int
2116Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 2117{
7918f24d
NC
2118 PERL_ARGS_ASSERT_MAGIC_WIPEPACK;
2119
36925d9e 2120 Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(CLEAR), G_DISCARD, 0);
463ee0b2
LW
2121 return 0;
2122}
2123
2124int
864dbfa3 2125Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
463ee0b2 2126{
efaf3674 2127 SV* ret;
463ee0b2 2128
7918f24d
NC
2129 PERL_ARGS_ASSERT_MAGIC_NEXTPACK;
2130
36925d9e 2131 ret = SvOK(key) ? Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(NEXTKEY), 0, 1, key)
1604cfb0 2132 : Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(FIRSTKEY), 0, 0);
efaf3674 2133 if (ret)
1604cfb0 2134 sv_setsv(key,ret);
79072805
LW
2135 return 0;
2136}
2137
2138int
1146e912 2139Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
a0d0e21e 2140{
7918f24d
NC
2141 PERL_ARGS_ASSERT_MAGIC_EXISTSPACK;
2142
36925d9e 2143 return magic_methpack(sv,mg,SV_CONST(EXISTS));
ac27b0f5 2144}
a0d0e21e 2145
a3bcc51e
TP
2146SV *
2147Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
2148{
5fcbf73d 2149 SV *retval;
ad64d0ec
NC
2150 SV * const tied = SvTIED_obj(MUTABLE_SV(hv), mg);
2151 HV * const pkg = SvSTASH((const SV *)SvRV(tied));
a3bcc51e 2152
7918f24d
NC
2153 PERL_ARGS_ASSERT_MAGIC_SCALARPACK;
2154
a3bcc51e
TP
2155 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
2156 SV *key;
bfcb3514 2157 if (HvEITER_get(hv))
a3bcc51e
TP
2158 /* we are in an iteration so the hash cannot be empty */
2159 return &PL_sv_yes;
2160 /* no xhv_eiter so now use FIRSTKEY */
2161 key = sv_newmortal();
ad64d0ec 2162 magic_nextpack(MUTABLE_SV(hv), mg, key);
bfcb3514 2163 HvEITER_set(hv, NULL); /* need to reset iterator */
a3bcc51e
TP
2164 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
2165 }
2166
2167 /* there is a SCALAR method that we can call */
36925d9e 2168 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(hv), mg, SV_CONST(SCALAR), 0, 0);
efaf3674 2169 if (!retval)
1604cfb0 2170 retval = &PL_sv_undef;
a3bcc51e
TP
2171 return retval;
2172}
2173
a0d0e21e 2174int
864dbfa3 2175Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
79072805 2176{
089b5c60 2177 SV **svp;
7918f24d
NC
2178
2179 PERL_ARGS_ASSERT_MAGIC_SETDBLINE;
2180
089b5c60
NC
2181 /* The magic ptr/len for the debugger's hash should always be an SV. */
2182 if (UNLIKELY(mg->mg_len != HEf_SVKEY)) {
147e3846 2183 Perl_croak(aTHX_ "panic: magic_setdbline len=%" IVdf ", ptr='%s'",
7b0eb0b8 2184 (IV)mg->mg_len, mg->mg_ptr);
089b5c60
NC
2185 }
2186
2187 /* Use sv_2iv instead of SvIV() as the former generates smaller code, and
2188 setting/clearing debugger breakpoints is not a hot path. */
43e4250a 2189 svp = av_fetch(MUTABLE_AV(mg->mg_obj),
1604cfb0 2190 sv_2iv(MUTABLE_SV((mg)->mg_ptr)), FALSE);
089b5c60 2191
8772537c 2192 if (svp && SvIOKp(*svp)) {
1604cfb0
MS
2193 OP * const o = INT2PTR(OP*,SvIVX(*svp));
2194 if (o) {
88df5f01 2195#ifdef PERL_DEBUG_READONLY_OPS
1604cfb0 2196 Slab_to_rw(OpSLAB(o));
88df5f01 2197#endif
1604cfb0
MS
2198 /* set or clear breakpoint in the relevant control op */
2199 if (SvTRUE(sv))
2200 o->op_flags |= OPf_SPECIAL;
2201 else
2202 o->op_flags &= ~OPf_SPECIAL;
88df5f01 2203#ifdef PERL_DEBUG_READONLY_OPS
1604cfb0 2204 Slab_to_ro(OpSLAB(o));
88df5f01 2205#endif
1604cfb0 2206 }
5df8de69 2207 }
79072805
LW
2208 return 0;
2209}
2210
2211int
8772537c 2212Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
79072805 2213{
502c6561 2214 AV * const obj = MUTABLE_AV(mg->mg_obj);
7918f24d
NC
2215
2216 PERL_ARGS_ASSERT_MAGIC_GETARYLEN;
2217
83bf042f 2218 if (obj) {
1604cfb0 2219 sv_setiv(sv, AvFILL(obj));
83bf042f 2220 } else {
3773545d 2221 sv_set_undef(sv);
83bf042f 2222 }
79072805
LW
2223 return 0;
2224}
2225
2226int
864dbfa3 2227Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
79072805 2228{
502c6561 2229 AV * const obj = MUTABLE_AV(mg->mg_obj);
7918f24d
NC
2230
2231 PERL_ARGS_ASSERT_MAGIC_SETARYLEN;
2232
83bf042f 2233 if (obj) {
1604cfb0 2234 av_fill(obj, SvIV(sv));
83bf042f 2235 } else {
1604cfb0
MS
2236 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2237 "Attempt to set length of freed array");
83bf042f
NC
2238 }
2239 return 0;
2240}
2241
2242int
83f29afa
VP
2243Perl_magic_cleararylen_p(pTHX_ SV *sv, MAGIC *mg)
2244{
83f29afa
VP
2245 PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P;
2246 PERL_UNUSED_ARG(sv);
dc3bf405 2247 PERL_UNUSED_CONTEXT;
83f29afa
VP
2248
2249 /* Reset the iterator when the array is cleared */
4803e7f7 2250 if (sizeof(IV) == sizeof(SSize_t)) {
1604cfb0 2251 *((IV *) &(mg->mg_len)) = 0;
4803e7f7 2252 } else {
1604cfb0
MS
2253 if (mg->mg_ptr)
2254 *((IV *) mg->mg_ptr) = 0;
4803e7f7 2255 }
83f29afa
VP
2256
2257 return 0;
2258}
2259
2260int
83bf042f
NC
2261Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
2262{
7918f24d 2263 PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P;
53c1dcc0 2264 PERL_UNUSED_ARG(sv);
7918f24d 2265
94f3782b
DM
2266 /* during global destruction, mg_obj may already have been freed */
2267 if (PL_in_clean_all)
1604cfb0 2268 return 0;
94f3782b 2269
83bf042f
NC
2270 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
2271
2272 if (mg) {
1604cfb0
MS
2273 /* arylen scalar holds a pointer back to the array, but doesn't own a
2274 reference. Hence the we (the array) are about to go away with it
2275 still pointing at us. Clear its pointer, else it would be pointing
2276 at free memory. See the comment in sv_magic about reference loops,
2277 and why it can't own a reference to us. */
2278 mg->mg_obj = 0;
83bf042f 2279 }
a0d0e21e
LW
2280 return 0;
2281}
2282
2283int
864dbfa3 2284Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 2285{
16eb5365 2286 SV* const lsv = LvTARG(sv);
96c2a8ff 2287 MAGIC * const found = mg_find_mglob(lsv);
7918f24d
NC
2288
2289 PERL_ARGS_ASSERT_MAGIC_GETPOS;
16eb5365 2290 PERL_UNUSED_ARG(mg);
ac27b0f5 2291
6174b39a 2292 if (found && found->mg_len != -1) {
1604cfb0
MS
2293 STRLEN i = found->mg_len;
2294 if (found->mg_flags & MGf_BYTES && DO_UTF8(lsv))
2295 i = sv_pos_b2u_flags(lsv, i, SV_GMAGIC|SV_CONST_RETURN);
2296 sv_setuv(sv, i);
2297 return 0;
a0d0e21e 2298 }
3773545d 2299 sv_set_undef(sv);
a0d0e21e
LW
2300 return 0;
2301}
2302
2303int
864dbfa3 2304Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 2305{
16eb5365 2306 SV* const lsv = LvTARG(sv);
a0d0e21e
LW
2307 SSize_t pos;
2308 STRLEN len;
53d44271 2309 MAGIC* found;
aec43834 2310 const char *s;
a0d0e21e 2311
7918f24d 2312 PERL_ARGS_ASSERT_MAGIC_SETPOS;
16eb5365 2313 PERL_UNUSED_ARG(mg);
ac27b0f5 2314
96c2a8ff 2315 found = mg_find_mglob(lsv);
3881461a 2316 if (!found) {
1604cfb0
MS
2317 if (!SvOK(sv))
2318 return 0;
2319 found = sv_magicext_mglob(lsv);
a0d0e21e
LW
2320 }
2321 else if (!SvOK(sv)) {
1604cfb0
MS
2322 found->mg_len = -1;
2323 return 0;
a0d0e21e 2324 }
aec43834 2325 s = SvPV_const(lsv, len);
a0d0e21e 2326
e1dccc0d 2327 pos = SvIV(sv);
a0ed51b3 2328
7e2040f0 2329 if (DO_UTF8(lsv)) {
19742f39 2330 const STRLEN ulen = sv_or_pv_len_utf8(lsv, s, len);
1604cfb0
MS
2331 if (ulen)
2332 len = ulen;
a0ed51b3
LW
2333 }
2334
a0d0e21e 2335 if (pos < 0) {
1604cfb0
MS
2336 pos += len;
2337 if (pos < 0)
2338 pos = 0;
a0d0e21e 2339 }
eb160463 2340 else if (pos > (SSize_t)len)
1604cfb0 2341 pos = len;
a0ed51b3 2342
3881461a 2343 found->mg_len = pos;
25fdce4a 2344 found->mg_flags &= ~(MGf_MINMATCH|MGf_BYTES);
a0d0e21e 2345
79072805
LW
2346 return 0;
2347}
2348
2349int
864dbfa3 2350Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
6ff81951
GS
2351{
2352 STRLEN len;
35a4481c 2353 SV * const lsv = LvTARG(sv);
b83604b4 2354 const char * const tmps = SvPV_const(lsv,len);
777f7c56
EB
2355 STRLEN offs = LvTARGOFF(sv);
2356 STRLEN rem = LvTARGLEN(sv);
b063b0a8
DIM
2357 const bool negoff = LvFLAGS(sv) & LVf_NEG_OFF;
2358 const bool negrem = LvFLAGS(sv) & LVf_NEG_LEN;
7918f24d
NC
2359
2360 PERL_ARGS_ASSERT_MAGIC_GETSUBSTR;
8772537c 2361 PERL_UNUSED_ARG(mg);
6ff81951 2362
83f78d1a 2363 if (!translate_substr_offsets(
1604cfb0
MS
2364 SvUTF8(lsv) ? sv_or_pv_len_utf8(lsv, tmps, len) : len,
2365 negoff ? -(IV)offs : (IV)offs, !negoff,
2366 negrem ? -(IV)rem : (IV)rem, !negrem, &offs, &rem
83f78d1a 2367 )) {
1604cfb0 2368 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
e03e82a0 2369 sv_set_undef(sv);
1604cfb0 2370 return 0;
83f78d1a
FC
2371 }
2372
9aa983d2 2373 if (SvUTF8(lsv))
1604cfb0 2374 offs = sv_or_pv_pos_u2b(lsv, tmps, offs, &rem);
1c900557 2375 sv_setpvn(sv, tmps + offs, rem);
9aa983d2 2376 if (SvUTF8(lsv))
2ef4b674 2377 SvUTF8_on(sv);
6ff81951
GS
2378 return 0;
2379}
2380
2381int
864dbfa3 2382Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
79072805 2383{
83f78d1a 2384 STRLEN len, lsv_len, oldtarglen, newtarglen;
5fcbf73d 2385 const char * const tmps = SvPV_const(sv, len);
dd374669 2386 SV * const lsv = LvTARG(sv);
777f7c56
EB
2387 STRLEN lvoff = LvTARGOFF(sv);
2388 STRLEN lvlen = LvTARGLEN(sv);
b063b0a8
DIM
2389 const bool negoff = LvFLAGS(sv) & LVf_NEG_OFF;
2390 const bool neglen = LvFLAGS(sv) & LVf_NEG_LEN;
7918f24d
NC
2391
2392 PERL_ARGS_ASSERT_MAGIC_SETSUBSTR;
8772537c 2393 PERL_UNUSED_ARG(mg);
075a4a2b 2394
a74fb2cd
FC
2395 SvGETMAGIC(lsv);
2396 if (SvROK(lsv))
1604cfb0
MS
2397 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
2398 "Attempt to use reference as lvalue in substr"
2399 );
fc061ed8
FC
2400 SvPV_force_nomg(lsv,lsv_len);
2401 if (SvUTF8(lsv)) lsv_len = sv_len_utf8_nomg(lsv);
83f78d1a 2402 if (!translate_substr_offsets(
1604cfb0
MS
2403 lsv_len,
2404 negoff ? -(IV)lvoff : (IV)lvoff, !negoff,
2405 neglen ? -(IV)lvlen : (IV)lvlen, !neglen, &lvoff, &lvlen
83f78d1a 2406 ))
1604cfb0 2407 Perl_croak(aTHX_ "substr outside of string");
83f78d1a 2408 oldtarglen = lvlen;
1aa99e6b 2409 if (DO_UTF8(sv)) {
1604cfb0
MS
2410 sv_utf8_upgrade_nomg(lsv);
2411 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2412 sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
2413 newtarglen = sv_or_pv_len_utf8(sv, tmps, len);
2414 SvUTF8_on(lsv);
9aa983d2 2415 }
0d336106 2416 else if (SvUTF8(lsv)) {
1604cfb0
MS
2417 const char *utf8;
2418 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2419 newtarglen = len;
2420 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
2421 sv_insert_flags(lsv, lvoff, lvlen, utf8, len, 0);
2422 Safefree(utf8);
1aa99e6b 2423 }
b76f3ce2 2424 else {
1604cfb0
MS
2425 sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
2426 newtarglen = len;
b76f3ce2 2427 }
83f78d1a
FC
2428 if (!neglen) LvTARGLEN(sv) = newtarglen;
2429 if (negoff) LvTARGOFF(sv) += newtarglen - oldtarglen;
b76f3ce2 2430
79072805
LW
2431 return 0;
2432}
2433
2434int
864dbfa3 2435Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 2436{
7918f24d 2437 PERL_ARGS_ASSERT_MAGIC_GETTAINT;
8772537c 2438 PERL_UNUSED_ARG(sv);
9a9b5ec9
DM
2439#ifdef NO_TAINT_SUPPORT
2440 PERL_UNUSED_ARG(mg);
2441#endif
7918f24d 2442
64ff300b 2443 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1) && IN_PERL_RUNTIME);
463ee0b2
LW
2444 return 0;
2445}
2446
2447int
864dbfa3 2448Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 2449{
7918f24d 2450 PERL_ARGS_ASSERT_MAGIC_SETTAINT;
8772537c 2451 PERL_UNUSED_ARG(sv);
7918f24d 2452
b01e650a 2453 /* update taint status */
284167a5 2454 if (TAINT_get)
1604cfb0 2455 mg->mg_len |= 1;
b01e650a 2456 else
1604cfb0 2457 mg->mg_len &= ~1;
463ee0b2
LW
2458 return 0;
2459}
2460
2461int
864dbfa3 2462Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
6ff81951 2463{
35a4481c 2464 SV * const lsv = LvTARG(sv);
1b92e694 2465 char errflags = LvFLAGS(sv);
7918f24d
NC
2466
2467 PERL_ARGS_ASSERT_MAGIC_GETVEC;
8772537c 2468 PERL_UNUSED_ARG(mg);
6ff81951 2469
1b92e694 2470 /* non-zero errflags implies deferred out-of-range condition */
b063b0a8 2471 assert(!(errflags & ~(LVf_NEG_OFF|LVf_OUT_OF_RANGE)));
1b92e694 2472 sv_setuv(sv, errflags ? 0 : do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
6ff81951 2473
6ff81951
GS
2474 return 0;
2475}
2476
2477int
864dbfa3 2478Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
79072805 2479{
7918f24d 2480 PERL_ARGS_ASSERT_MAGIC_SETVEC;
8772537c 2481 PERL_UNUSED_ARG(mg);
79072805
LW
2482 do_vecset(sv); /* XXX slurp this routine */
2483 return 0;
2484}
2485
13733cde
FC
2486SV *
2487Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg)
5f05dabc 2488{
a0714e2c 2489 SV *targ = NULL;
13733cde
FC
2490 PERL_ARGS_ASSERT_DEFELEM_TARGET;
2491 if (!mg) mg = mg_find(sv, PERL_MAGIC_defelem);
2492 assert(mg);
5f05dabc 2493 if (LvTARGLEN(sv)) {
1604cfb0
MS
2494 if (mg->mg_obj) {
2495 SV * const ahv = LvTARG(sv);
2496 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, FALSE, 0);
6d822dc4
MS
2497 if (he)
2498 targ = HeVAL(he);
1604cfb0
MS
2499 }
2500 else if (LvSTARGOFF(sv) >= 0) {
2501 AV *const av = MUTABLE_AV(LvTARG(sv));
2502 if (LvSTARGOFF(sv) <= AvFILL(av))
2503 {
2504 if (SvRMAGICAL(av)) {
2505 SV * const * const svp = av_fetch(av, LvSTARGOFF(sv), 0);
2506 targ = svp ? *svp : NULL;
2507 }
2508 else
2509 targ = AvARRAY(av)[LvSTARGOFF(sv)];
2510 }
2511 }
2512 if (targ && (targ != &PL_sv_undef)) {
2513 /* somebody else defined it for us */
2514 SvREFCNT_dec(LvTARG(sv));
2515 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2516 LvTARGLEN(sv) = 0;
2517 SvREFCNT_dec(mg->mg_obj);
2518 mg->mg_obj = NULL;
2519 mg->mg_flags &= ~MGf_REFCOUNTED;
2520 }
2521 return targ;
5f05dabc 2522 }
71be2cbc 2523 else
1604cfb0 2524 return LvTARG(sv);
13733cde
FC
2525}
2526
2527int
2528Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2529{
2530 PERL_ARGS_ASSERT_MAGIC_GETDEFELEM;
2531
2532 sv_setsv(sv, defelem_target(sv, mg));
71be2cbc 2533 return 0;
2534}
2535
2536int
864dbfa3 2537Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
71be2cbc 2538{
7918f24d 2539 PERL_ARGS_ASSERT_MAGIC_SETDEFELEM;
8772537c 2540 PERL_UNUSED_ARG(mg);
71be2cbc 2541 if (LvTARGLEN(sv))
1604cfb0 2542 vivify_defelem(sv);
68dc0745 2543 if (LvTARG(sv)) {
1604cfb0
MS
2544 sv_setsv(LvTARG(sv), sv);
2545 SvSETMAGIC(LvTARG(sv));
68dc0745 2546 }
5f05dabc 2547 return 0;
2548}
2549
71be2cbc 2550void
864dbfa3 2551Perl_vivify_defelem(pTHX_ SV *sv)
71be2cbc 2552{
74e13ce4 2553 MAGIC *mg;
a0714e2c 2554 SV *value = NULL;
71be2cbc 2555
7918f24d
NC
2556 PERL_ARGS_ASSERT_VIVIFY_DEFELEM;
2557
14befaf4 2558 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1604cfb0 2559 return;
68dc0745 2560 if (mg->mg_obj) {
1604cfb0
MS
2561 SV * const ahv = LvTARG(sv);
2562 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, TRUE, 0);
6d822dc4
MS
2563 if (he)
2564 value = HeVAL(he);
1604cfb0
MS
2565 if (!value || value == &PL_sv_undef)
2566 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
71be2cbc 2567 }
bbfdc870 2568 else if (LvSTARGOFF(sv) < 0)
1604cfb0 2569 Perl_croak(aTHX_ PL_no_aelem, LvSTARGOFF(sv));
68dc0745 2570 else {
1604cfb0
MS
2571 AV *const av = MUTABLE_AV(LvTARG(sv));
2572 if ((I32)LvTARGLEN(sv) < 0 && LvSTARGOFF(sv) > AvFILL(av))
2573 LvTARG(sv) = NULL; /* array can't be extended */
2574 else {
2575 SV* const * const svp = av_fetch(av, LvSTARGOFF(sv), TRUE);
2576 if (!svp || !(value = *svp))
2577 Perl_croak(aTHX_ PL_no_aelem, LvSTARGOFF(sv));
2578 }
68dc0745 2579 }
b37c2d43 2580 SvREFCNT_inc_simple_void(value);
68dc0745 2581 SvREFCNT_dec(LvTARG(sv));
2582 LvTARG(sv) = value;
71be2cbc 2583 LvTARGLEN(sv) = 0;
68dc0745 2584 SvREFCNT_dec(mg->mg_obj);
a0714e2c 2585 mg->mg_obj = NULL;
68dc0745 2586 mg->mg_flags &= ~MGf_REFCOUNTED;
5f05dabc 2587}
2588
2589int
1f1dcfb5
FC
2590Perl_magic_setnonelem(pTHX_ SV *sv, MAGIC *mg)
2591{
2592 PERL_ARGS_ASSERT_MAGIC_SETNONELEM;
2593 PERL_UNUSED_ARG(mg);
2594 sv_unmagic(sv, PERL_MAGIC_nonelem);
2595 return 0;
2596}
2597
2598int
864dbfa3 2599Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
810b8aa5 2600{
7918f24d 2601 PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS;
5648c0ae
DM
2602 Perl_sv_kill_backrefs(aTHX_ sv, MUTABLE_AV(mg->mg_obj));
2603 return 0;
810b8aa5
GS
2604}
2605
2606int
864dbfa3 2607Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
93a17b20 2608{
7918f24d 2609 PERL_ARGS_ASSERT_MAGIC_SETMGLOB;
96a5add6 2610 PERL_UNUSED_CONTEXT;
0177730e 2611 PERL_UNUSED_ARG(sv);
565764a8 2612 mg->mg_len = -1;
93a17b20
LW
2613 return 0;
2614}
2615
02a48966
DM
2616
2617int
2618Perl_magic_freemglob(pTHX_ SV *sv, MAGIC *mg)
2619{
2620 PERL_ARGS_ASSERT_MAGIC_FREEMGLOB;
2621 PERL_UNUSED_ARG(sv);
2622
5d273abb
DM
2623 /* pos() magic uses mg_len as a string position rather than a buffer
2624 * length, and mg_ptr is currently unused, so skip freeing.
2625 */
02a48966 2626 assert(mg->mg_type == PERL_MAGIC_regex_global && mg->mg_len >= -1);
02a48966
DM
2627 mg->mg_ptr = NULL;
2628 return 0;
2629}
2630
2631
93a17b20 2632int
864dbfa3 2633Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
79072805 2634{
35a4481c 2635 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
79072805 2636
7918f24d
NC
2637 PERL_ARGS_ASSERT_MAGIC_SETUVAR;
2638
79072805 2639 if (uf && uf->uf_set)
1604cfb0 2640 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
79072805
LW
2641 return 0;
2642}
2643
c277df42 2644int
faf82a0b
AE
2645Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2646{
488344d2 2647 const char type = mg->mg_type;
7918f24d
NC
2648
2649 PERL_ARGS_ASSERT_MAGIC_SETREGEXP;
2650
a5c7cb08
DM
2651 assert( type == PERL_MAGIC_fm
2652 || type == PERL_MAGIC_qr
2653 || type == PERL_MAGIC_bm);
488344d2 2654 return sv_unmagic(sv, type);
faf82a0b
AE
2655}
2656
7a4c00b4 2657#ifdef USE_LOCALE_COLLATE
79072805 2658int
864dbfa3 2659Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
bbce6d69 2660{
7918f24d
NC
2661 PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM;
2662
bbce6d69 2663 /*
838b5b74 2664 * RenE<eacute> Descartes said "I think not."
bbce6d69 2665 * and vanished with a faint plop.
2666 */
96a5add6 2667 PERL_UNUSED_CONTEXT;
8772537c 2668 PERL_UNUSED_ARG(sv);
7a4c00b4 2669 if (mg->mg_ptr) {
1604cfb0
MS
2670 Safefree(mg->mg_ptr);
2671 mg->mg_ptr = NULL;
2672 mg->mg_len = -1;
7a4c00b4 2673 }
bbce6d69 2674 return 0;
2675}
a457b73c
DM
2676
2677int
2678Perl_magic_freecollxfrm(pTHX_ SV *sv, MAGIC *mg)
2679{
2680 PERL_ARGS_ASSERT_MAGIC_FREECOLLXFRM;
2681 PERL_UNUSED_ARG(sv);
2682
2683 /* Collate magic uses mg_len as a string length rather than a buffer
2684 * length, so we need to free even with mg_len == 0: hence we can't
2685 * rely on standard magic free handling */
fb072d00
TC
2686 if (mg->mg_len >= 0) {
2687 assert(mg->mg_type == PERL_MAGIC_collxfrm);
2688 Safefree(mg->mg_ptr);
2689 mg->mg_ptr = NULL;
2690 }
2691
a457b73c
DM
2692 return 0;
2693}
7a4c00b4 2694#endif /* USE_LOCALE_COLLATE */
bbce6d69 2695
7e8c5dac
HS
2696/* Just clear the UTF-8 cache data. */
2697int
2698Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2699{
7918f24d 2700 PERL_ARGS_ASSERT_MAGIC_SETUTF8;
96a5add6 2701 PERL_UNUSED_CONTEXT;
8772537c 2702 PERL_UNUSED_ARG(sv);
7e8c5dac 2703 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
3881461a 2704 mg->mg_ptr = NULL;
7e8c5dac
HS
2705 mg->mg_len = -1; /* The mg_len holds the len cache. */
2706 return 0;
2707}
2708
bbce6d69 2709int
032a4919
DM
2710Perl_magic_freeutf8(pTHX_ SV *sv, MAGIC *mg)
2711{
2712 PERL_ARGS_ASSERT_MAGIC_FREEUTF8;
2713 PERL_UNUSED_ARG(sv);
2714
2715 /* utf8 magic uses mg_len as a string length rather than a buffer
2716 * length, so we need to free even with mg_len == 0: hence we can't
2717 * rely on standard magic free handling */
2718 assert(mg->mg_type == PERL_MAGIC_utf8 && mg->mg_len >= -1);
2719 Safefree(mg->mg_ptr);
2720 mg->mg_ptr = NULL;
2721 return 0;
2722}
2723
2724
2725int
9cce4f9a
FC
2726Perl_magic_setlvref(pTHX_ SV *sv, MAGIC *mg)
2727{
9782ce69 2728 const char *bad = NULL;
9cce4f9a 2729 PERL_ARGS_ASSERT_MAGIC_SETLVREF;
26a50d99 2730 if (!SvROK(sv)) Perl_croak(aTHX_ "Assigned value is not a reference");
9782ce69
FC
2731 switch (mg->mg_private & OPpLVREF_TYPE) {
2732 case OPpLVREF_SV:
1604cfb0
MS
2733 if (SvTYPE(SvRV(sv)) > SVt_PVLV)
2734 bad = " SCALAR";
2735 break;
9782ce69 2736 case OPpLVREF_AV:
1604cfb0
MS
2737 if (SvTYPE(SvRV(sv)) != SVt_PVAV)
2738 bad = "n ARRAY";
2739 break;
9782ce69 2740 case OPpLVREF_HV:
1604cfb0
MS
2741 if (SvTYPE(SvRV(sv)) != SVt_PVHV)
2742 bad = " HASH";
2743 break;
9782ce69 2744 case OPpLVREF_CV:
1604cfb0
MS
2745 if (SvTYPE(SvRV(sv)) != SVt_PVCV)
2746 bad = " CODE";
9782ce69
FC
2747 }
2748 if (bad)
1604cfb0
MS
2749 /* diag_listed_as: Assigned value is not %s reference */
2750 Perl_croak(aTHX_ "Assigned value is not a%s reference", bad);
c146a62a
FC
2751 switch (mg->mg_obj ? SvTYPE(mg->mg_obj) : 0) {
2752 case 0:
2753 {
1604cfb0
MS
2754 SV * const old = PAD_SV(mg->mg_len);
2755 PAD_SETSV(mg->mg_len, SvREFCNT_inc_NN(SvRV(sv)));
2756 SvREFCNT_dec(old);
2757 break;
c146a62a
FC
2758 }
2759 case SVt_PVGV:
1604cfb0
MS
2760 gv_setref(mg->mg_obj, sv);
2761 SvSETMAGIC(mg->mg_obj);
2762 break;
6102323a 2763 case SVt_PVAV:
1604cfb0
MS
2764 av_store((AV *)mg->mg_obj, SvIV((SV *)mg->mg_ptr),
2765 SvREFCNT_inc_simple_NN(SvRV(sv)));
2766 break;
5f94141d 2767 case SVt_PVHV:
1604cfb0 2768 (void)hv_store_ent((HV *)mg->mg_obj, (SV *)mg->mg_ptr,
7fcb36d5 2769 SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
c146a62a 2770 }
d39c26a6 2771 if (mg->mg_flags & MGf_PERSIST)
1604cfb0
MS
2772 NOOP; /* This sv is in use as an iterator var and will be reused,
2773 so we must leave the magic. */
d39c26a6 2774 else
1604cfb0
MS
2775 /* This sv could be returned by the assignment op, so clear the
2776 magic, as lvrefs are an implementation detail that must not be
2777 leaked to the user. */
2778 sv_unmagic(sv, PERL_MAGIC_lvref);
9cce4f9a
FC
2779 return 0;
2780}
2781
f1540bed
JH
2782static void
2783S_set_dollarzero(pTHX_ SV *sv)
2784 PERL_TSA_REQUIRES(PL_dollarzero_mutex)
2785{
f1540bed
JH
2786 const char *s;
2787 STRLEN len;
f1540bed
JH
2788#ifdef HAS_SETPROCTITLE
2789 /* The BSDs don't show the argv[] in ps(1) output, they
2790 * show a string from the process struct and provide
2791 * the setproctitle() routine to manipulate that. */
2792 if (PL_origalen != 1) {
2793 s = SvPV_const(sv, len);
38626956 2794# if __FreeBSD_version > 410001 || defined(__DragonFly__)
f1540bed
JH
2795 /* The leading "-" removes the "perl: " prefix,
2796 * but not the "(perl) suffix from the ps(1)
2797 * output, because that's what ps(1) shows if the
2798 * argv[] is modified. */
2799 setproctitle("-%s", s);
2800# else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2801 /* This doesn't really work if you assume that
2802 * $0 = 'foobar'; will wipe out 'perl' from the $0
2803 * because in ps(1) output the result will be like
2804 * sprintf("perl: %s (perl)", s)
2805 * I guess this is a security feature:
2806 * one (a user process) cannot get rid of the original name.
2807 * --jhi */
2808 setproctitle("%s", s);
2809# endif
2810 }
2811#elif defined(__hpux) && defined(PSTAT_SETCMD)
2812 if (PL_origalen != 1) {
2813 union pstun un;
2814 s = SvPV_const(sv, len);
2815 un.pst_command = (char *)s;
2816 pstat(PSTAT_SETCMD, un, len, 0, 0);
2817 }
2818#else
2819 if (PL_origalen > 1) {
4f3e04fd 2820 I32 i;
f1540bed
JH
2821 /* PL_origalen is set in perl_parse(). */
2822 s = SvPV_force(sv,len);
2823 if (len >= (STRLEN)PL_origalen-1) {
2824 /* Longer than original, will be truncated. We assume that
2825 * PL_origalen bytes are available. */
2826 Copy(s, PL_origargv[0], PL_origalen-1, char);
2827 }
2828 else {
2829 /* Shorter than original, will be padded. */
2830#ifdef PERL_DARWIN
2831 /* Special case for Mac OS X: see [perl #38868] */
2832 const int pad = 0;
2833#else
2834 /* Is the space counterintuitive? Yes.
2835 * (You were expecting \0?)
2836 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2837 * --jhi */
2838 const int pad = ' ';
2839#endif
2840 Copy(s, PL_origargv[0], len, char);
2841 PL_origargv[0][len] = 0;
2842 memset(PL_origargv[0] + len + 1,
2843 pad, PL_origalen - len - 1);
2844 }
2845 PL_origargv[0][PL_origalen-1] = 0;
2846 for (i = 1; i < PL_origargc; i++)
2847 PL_origargv[i] = 0;
2848#ifdef HAS_PRCTL_SET_NAME
2849 /* Set the legacy process name in addition to the POSIX name on Linux */
2850 if (prctl(PR_SET_NAME, (unsigned long)s, 0, 0, 0) != 0) {
2851 /* diag_listed_as: SKIPME */
2852 Perl_croak(aTHX_ "Can't set $0 with prctl(): %s", Strerror(errno));
2853 }
2854#endif
2855 }
2856#endif
2857}
2858
9cce4f9a 2859int
864dbfa3 2860Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
79072805 2861{
eb578fdb
KW
2862 I32 paren;
2863 const REGEXP * rx;
79072805 2864 I32 i;
8990e307 2865 STRLEN len;
125b9982 2866 MAGIC *tmg;
2fdbfb4d 2867
7918f24d
NC
2868 PERL_ARGS_ASSERT_MAGIC_SET;
2869
e91d8259 2870 if (!mg->mg_ptr) {
960b831f 2871 paren = mg->mg_len;
1604cfb0 2872 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
e91d8259 2873 setparen_got_rx:
fb15da9c 2874 CALLREG_NUMBUF_STORE((REGEXP *)rx,paren,sv);
1604cfb0 2875 } else {
2fdbfb4d
AB
2876 /* Croak with a READONLY error when a numbered match var is
2877 * set without a previous pattern match. Unless it's C<local $1>
2878 */
e91d8259 2879 croakparen:
2fdbfb4d 2880 if (!PL_localizing) {
cb077ed2 2881 Perl_croak_no_modify();
2fdbfb4d
AB
2882 }
2883 }
e91d8259
NC
2884 return 0;
2885 }
2886
2887 switch (*mg->mg_ptr) {
748a9306 2888 case '\001': /* ^A */
1604cfb0
MS
2889 if (SvOK(sv)) sv_copypv(PL_bodytarget, sv);
2890 else SvOK_off(PL_bodytarget);
2891 FmLINES(PL_bodytarget) = 0;
2892 if (SvPOK(PL_bodytarget)) {
2893 char *s = SvPVX(PL_bodytarget);
0687887e 2894 char *e = SvEND(PL_bodytarget);
1604cfb0
MS
2895 while ( ((s = (char *) memchr(s, '\n', e - s))) ) {
2896 FmLINES(PL_bodytarget)++;
2897 s++;
2898 }
2899 }
2900 /* mg_set() has temporarily made sv non-magical */
2901 if (TAINTING_get) {
2902 if ((tmg = mg_find(sv,PERL_MAGIC_taint)) && tmg->mg_len & 1)
2903 SvTAINTED_on(PL_bodytarget);
2904 else
2905 SvTAINTED_off(PL_bodytarget);
2906 }
2907 break;
49460fe6 2908 case '\003': /* ^C */
1604cfb0
MS
2909 PL_minus_c = cBOOL(SvIV(sv));
2910 break;
49460fe6 2911
79072805 2912 case '\004': /* ^D */
b4ab917c 2913#ifdef DEBUGGING
a9e2d2bf
DM
2914 {
2915 const char *s = SvPV_nolen_const(sv);
2916 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2917 if (DEBUG_x_TEST || DEBUG_B_TEST)
2918 dump_all_perl(!DEBUG_B_TEST);
2919 }
b4ab917c 2920#else
1604cfb0 2921 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
b4ab917c 2922#endif
1604cfb0 2923 break;
28f23441 2924 case '\005': /* ^E */
1604cfb0 2925 if (*(mg->mg_ptr+1) == '\0') {
e37778c2 2926#ifdef VMS
1604cfb0 2927 set_vaxc_errno(SvIV(sv));
2abc681d 2928#elif defined(WIN32)
1604cfb0 2929 SetLastError( SvIV(sv) );
2abc681d 2930#elif defined(OS2)
1604cfb0 2931 os2_setsyserrno(SvIV(sv));
2abc681d 2932#else
1604cfb0
MS
2933 /* will anyone ever use this? */
2934 SETERRNO(SvIV(sv), 4);
22fae026 2935#endif
1604cfb0
MS
2936 }
2937 else if (strEQ(mg->mg_ptr + 1, "NCODING") && SvOK(sv))
fd503f5c 2938 Perl_croak(aTHX_ "${^ENCODING} is no longer supported");
1604cfb0 2939 break;
79072805 2940 case '\006': /* ^F */
9f601cf3
TC
2941 if (mg->mg_ptr[1] == '\0') {
2942 PL_maxsysfd = SvIV(sv);
2943 }
1604cfb0 2944 break;
a0d0e21e 2945 case '\010': /* ^H */
efa571ab
KW
2946 {
2947 U32 save_hints = PL_hints;
5d382c25 2948 PL_hints = SvUV(sv);
efa571ab
KW
2949
2950 /* If wasn't UTF-8, and now is, notify the parser */
2951 if ((PL_hints & HINT_UTF8) && ! (save_hints & HINT_UTF8)) {
2952 notify_parser_that_changed_to_utf8();
2953 }
2954 }
1604cfb0 2955 break;
9d116dd7 2956 case '\011': /* ^I */ /* NOT \t in EBCDIC */
1604cfb0
MS
2957 Safefree(PL_inplace);
2958 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2959 break;
d9bad346 2960 case '\016': /* ^N */
1604cfb0
MS
2961 if (PL_curpm && (rx = PM_GETRE(PL_curpm))
2962 && (paren = RX_LASTCLOSEPAREN(rx))) goto setparen_got_rx;
2963 goto croakparen;
28f23441 2964 case '\017': /* ^O */
1604cfb0
MS
2965 if (*(mg->mg_ptr+1) == '\0') {
2966 Safefree(PL_osname);
2967 PL_osname = NULL;
2968 if (SvOK(sv)) {
2969 TAINT_PROPER("assigning to $^O");
2970 PL_osname = savesvpv(sv);
2971 }
2972 }
2973 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2974 STRLEN len;
2975 const char *const start = SvPV(sv, len);
2976 const char *out = (const char*)memchr(start, '\0', len);
2977 SV *tmp;
2978
2979
2980 PL_compiling.cop_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2981 PL_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2982
2983 /* Opening for input is more common than opening for output, so
2984 ensure that hints for input are sooner on linked list. */
2985 tmp = out ? newSVpvn_flags(out + 1, start + len - out - 1,
2986 SvUTF8(sv))
2987 : newSVpvs_flags("", SvUTF8(sv));
2988 (void)hv_stores(GvHV(PL_hintgv), "open>", tmp);
2989 mg_set(tmp);
2990
2991 tmp = newSVpvn_flags(start, out ? (STRLEN)(out - start) : len,
2992 SvUTF8(sv));
2993 (void)hv_stores(GvHV(PL_hintgv), "open<", tmp);
2994 mg_set(tmp);
2995 }
2996 break;
79072805 2997 case '\020': /* ^P */
2fdbfb4d
AB
2998 PL_perldb = SvIV(sv);
2999 if (PL_perldb && !PL_DBsingle)
3000 init_debugger();
9b9e0be4 3001 break;
79072805 3002 case '\024': /* ^T */
88e89b8a 3003#ifdef BIG_TIME
1604cfb0 3004 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
88e89b8a 3005#else
1604cfb0 3006 PL_basetime = (Time_t)SvIV(sv);
88e89b8a 3007#endif
1604cfb0 3008 break;
e07ea26a 3009 case '\025': /* ^UTF8CACHE */
1604cfb0
MS
3010 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
3011 PL_utf8cache = (signed char) sv_2iv(sv);
3012 }
3013 break;
fde18df1 3014 case '\027': /* ^W & $^WARNING_BITS */
1604cfb0
MS
3015 if (*(mg->mg_ptr+1) == '\0') {
3016 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
3017 i = SvIV(sv);
3018 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
3019 | (i ? G_WARN_ON : G_WARN_OFF) ;
3020 }
3021 }
3022 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
3023 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
3024 if (!SvPOK(sv)) {
e6421d31 3025 free_and_set_cop_warnings(&PL_compiling, pWARN_STD);
1604cfb0
MS
3026 break;
3027 }
3028 {
3029 STRLEN len, i;
3030 int not_none = 0, not_all = 0;
3031 const U8 * const ptr = (const U8 *)SvPV_const(sv, len) ;
3032 for (i = 0 ; i < len ; ++i) {
3033 not_none |= ptr[i];
3034 not_all |= ptr[i] ^ 0x55;
3035 }
3036 if (!not_none) {
e6421d31 3037 free_and_set_cop_warnings(&PL_compiling, pWARN_NONE);
1604cfb0 3038 } else if (len >= WARNsize && !not_all) {
e6421d31
YO
3039 free_and_set_cop_warnings(&PL_compiling, pWARN_ALL);
3040 PL_dowarn |= G_WARN_ONCE ;
3041 }
3042 else {
3043 STRLEN len;
3044 const char *const p = SvPV_const(sv, len);
94c8b9c1 3045
6848aea2
YO
3046 free_and_set_cop_warnings(
3047 &PL_compiling,
3048 Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
3049 p, len)
3050 );
72dc9ed5 3051
e6421d31 3052 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
1604cfb0 3053 PL_dowarn |= G_WARN_ONCE ;
e6421d31 3054 }
1604cfb0
MS
3055 }
3056 }
3057 }
3058 break;
79072805 3059 case '.':
1604cfb0
MS
3060 if (PL_localizing) {
3061 if (PL_localizing == 1)
3062 SAVESPTR(PL_last_in_gv);
3063 }
3064 else if (SvOK(sv) && GvIO(PL_last_in_gv))
3065 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
3066 break;
79072805 3067 case '^':
1604cfb0
MS
3068 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
3069 IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
3070 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
3071 break;
79072805 3072 case '~':
1604cfb0
MS
3073 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
3074 IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
3075 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
3076 break;
79072805 3077 case '=':
1604cfb0
MS
3078 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
3079 break;
79072805 3080 case '-':
1604cfb0
MS
3081 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
3082 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
3083 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
3084 break;
79072805 3085 case '%':
1604cfb0
MS
3086 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
3087 break;
79072805 3088 case '|':
1604cfb0
MS
3089 {
3090 IO * const io = GvIO(PL_defoutgv);
3091 if(!io)
3092 break;
3093 if ((SvIV(sv)) == 0)
3094 IoFLAGS(io) &= ~IOf_FLUSH;
3095 else {
3096 if (!(IoFLAGS(io) & IOf_FLUSH)) {
3097 PerlIO *ofp = IoOFP(io);
3098 if (ofp)
3099 (void)PerlIO_flush(ofp);
3100 IoFLAGS(io) |= IOf_FLUSH;
3101 }
3102 }
3103 }
3104 break;
79072805 3105 case '/':
1ab48e3a 3106 {
1ab48e3a 3107 if (SvROK(sv)) {
8d37cdf7
DIM
3108 SV *referent = SvRV(sv);
3109 const char *reftype = sv_reftype(referent, 0);
d239bea0
A
3110 /* XXX: dodgy type check: This leaves me feeling dirty, but
3111 * the alternative is to copy pretty much the entire
3112 * sv_reftype() into this routine, or to do a full string
3113 * comparison on the return of sv_reftype() both of which
3114 * make me feel worse! NOTE, do not modify this comment
3115 * without reviewing the corresponding comment in
3116 * sv_reftype(). - Yves */
1ab48e3a 3117 if (reftype[0] == 'S' || reftype[0] == 'L') {
8d37cdf7 3118 IV val = SvIV(referent);
1ab48e3a 3119 if (val <= 0) {
520b6fb6
DIM
3120 sv_setsv(sv, PL_rs);
3121 Perl_croak(aTHX_ "Setting $/ to a reference to %s is forbidden",
3122 val < 0 ? "a negative integer" : "zero");
1ab48e3a
YO
3123 }
3124 } else {
ddce084a 3125 sv_setsv(sv, PL_rs);
8d37cdf7 3126 /* diag_listed_as: Setting $/ to %s reference is forbidden */
a48e4205
FC
3127 Perl_croak(aTHX_ "Setting $/ to a%s %s reference is forbidden",
3128 *reftype == 'A' ? "n" : "", reftype);
1ab48e3a
YO
3129 }
3130 }
b3a2acfa 3131 SvREFCNT_dec(PL_rs);
520b6fb6 3132 PL_rs = newSVsv(sv);
b3a2acfa 3133 }
1604cfb0 3134 break;
79072805 3135 case '\\':
1604cfb0
MS
3136 SvREFCNT_dec(PL_ors_sv);
3137 if (SvOK(sv)) {
3138 PL_ors_sv = newSVsv(sv);
3139 }
3140 else {
3141 PL_ors_sv = NULL;
3142 }
3143 break;
7d69d4a6 3144 case '[':
1604cfb0
MS
3145 if (SvIV(sv) != 0)
3146 Perl_croak(aTHX_ "Assigning non-zero to $[ is no longer possible");
3147 break;
79072805 3148 case '?':
ff0cee69 3149#ifdef COMPLEX_STATUS
1604cfb0
MS
3150 if (PL_localizing == 2) {
3151 SvUPGRADE(sv, SVt_PVLV);
3152 PL_statusvalue = LvTARGOFF(sv);
3153 PL_statusvalue_vms = LvTARGLEN(sv);
3154 }
3155 else
ff0cee69 3156#endif
3157#ifdef VMSISH_STATUS
1604cfb0
MS
3158 if (VMSISH_STATUS)
3159 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
3160 else
ff0cee69 3161#endif
1604cfb0
MS
3162 STATUS_UNIX_EXIT_SET(SvIV(sv));
3163 break;
79072805 3164 case '!':
93189314
JH
3165 {
3166#ifdef VMS
3167# define PERL_VMS_BANG vaxc$errno
3168#else
3169# define PERL_VMS_BANG 0
3170#endif
79c32fc2 3171#if defined(WIN32)
1604cfb0
MS
3172 SETERRNO(win32_get_errno(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0),
3173 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
c9beaf97 3174#else
1604cfb0
MS
3175 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
3176 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
c9beaf97 3177#endif
1604cfb0
MS
3178 }
3179 break;
79072805 3180 case '<':
1604cfb0 3181 {
b469f1e0 3182 /* XXX $< currently silently ignores failures */
1604cfb0
MS
3183 const Uid_t new_uid = SvUID(sv);
3184 PL_delaymagic_uid = new_uid;
3185 if (PL_delaymagic) {
3186 PL_delaymagic |= DM_RUID;
3187 break; /* don't do magic till later */
3188 }
79072805 3189#ifdef HAS_SETRUID
1604cfb0 3190 PERL_UNUSED_RESULT(setruid(new_uid));
2abc681d 3191#elif defined(HAS_SETREUID)
b469f1e0 3192 PERL_UNUSED_RESULT(setreuid(new_uid, (Uid_t)-1));
2abc681d 3193#elif defined(HAS_SETRESUID)
b469f1e0 3194 PERL_UNUSED_RESULT(setresuid(new_uid, (Uid_t)-1, (Uid_t)-1));
79072805 3195#else
1604cfb0 3196 if (new_uid == PerlProc_geteuid()) { /* special case $< = $> */
2abc681d 3197# ifdef PERL_DARWIN
1604cfb0
MS
3198 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
3199 if (new_uid != 0 && PerlProc_getuid() == 0)
b469f1e0 3200 PERL_UNUSED_RESULT(PerlProc_setuid(0));
2abc681d 3201# endif
b469f1e0 3202 PERL_UNUSED_RESULT(PerlProc_setuid(new_uid));
1604cfb0
MS
3203 } else {
3204 Perl_croak(aTHX_ "setruid() not implemented");
3205 }
79072805 3206#endif
1604cfb0
MS
3207 break;
3208 }
79072805 3209 case '>':
1604cfb0 3210 {
b469f1e0 3211 /* XXX $> currently silently ignores failures */
1604cfb0
MS
3212 const Uid_t new_euid = SvUID(sv);
3213 PL_delaymagic_euid = new_euid;
3214 if (PL_delaymagic) {
3215 PL_delaymagic |= DM_EUID;
3216 break; /* don't do magic till later */
3217 }
79072805 3218#ifdef HAS_SETEUID
1604cfb0 3219 PERL_UNUSED_RESULT(seteuid(new_euid));
2abc681d 3220#elif defined(HAS_SETREUID)
1604cfb0 3221 PERL_UNUSED_RESULT(setreuid((Uid_t)-1, new_euid));
2abc681d 3222#elif defined(HAS_SETRESUID)
1604cfb0 3223 PERL_UNUSED_RESULT(setresuid((Uid_t)-1, new_euid, (Uid_t)-1));
79072805 3224#else
1604cfb0
MS
3225 if (new_euid == PerlProc_getuid()) /* special case $> = $< */
3226 PERL_UNUSED_RESULT(PerlProc_setuid(new_euid));
3227 else {
3228 Perl_croak(aTHX_ "seteuid() not implemented");
3229 }
3230#endif
3231 break;
3232 }
79072805 3233 case '(':
1604cfb0 3234 {
b469f1e0 3235 /* XXX $( currently silently ignores failures */
1604cfb0
MS
3236 const Gid_t new_gid = SvGID(sv);
3237 PL_delaymagic_gid = new_gid;
3238 if (PL_delaymagic) {
3239 PL_delaymagic |= DM_RGID;
3240 break; /* don't do magic till later */
3241 }
79072805 3242#ifdef HAS_SETRGID
1604cfb0 3243 PERL_UNUSED_RESULT(setrgid(new_gid));
2abc681d 3244#elif defined(HAS_SETREGID)
1604cfb0 3245 PERL_UNUSED_RESULT(setregid(new_gid, (Gid_t)-1));
2abc681d 3246#elif defined(HAS_SETRESGID)
b469f1e0 3247 PERL_UNUSED_RESULT(setresgid(new_gid, (Gid_t)-1, (Gid_t) -1));
79072805 3248#else
1604cfb0
MS
3249 if (new_gid == PerlProc_getegid()) /* special case $( = $) */
3250 PERL_UNUSED_RESULT(PerlProc_setgid(new_gid));
3251 else {
3252 Perl_croak(aTHX_ "setrgid() not implemented");
3253 }
3254#endif
3255 break;
3256 }
79072805 3257 case ')':
1604cfb0 3258 {
0635704a
HS
3259/* (hv) best guess: maybe we'll need configure probes to do a better job,
3260 * but you can override it if you need to.
3261 */
3262#ifndef INVALID_GID
3263#define INVALID_GID ((Gid_t)-1)
3264#endif
b469f1e0 3265 /* XXX $) currently silently ignores failures */
1604cfb0 3266 Gid_t new_egid;
5cd24f17 3267#ifdef HAS_SETGROUPS
1604cfb0
MS
3268 {
3269 const char *p = SvPV_const(sv, len);
757f63d8 3270 Groups_t *gary = NULL;
79e302e6
MM
3271 const char* p_end = p + len;
3272 const char* endptr = p_end;
22ff3130 3273 UV uv;
fb4089e0 3274#ifdef _SC_NGROUPS_MAX
3275 int maxgrp = sysconf(_SC_NGROUPS_MAX);
3276
3277 if (maxgrp < 0)
3278 maxgrp = NGROUPS;
3279#else
3280 int maxgrp = NGROUPS;
3281#endif
757f63d8
SP
3282
3283 while (isSPACE(*p))
3284 ++p;
22ff3130
HS
3285 if (grok_atoUV(p, &uv, &endptr))
3286 new_egid = (Gid_t)uv;
3287 else {
0635704a 3288 new_egid = INVALID_GID;
22ff3130
HS
3289 endptr = NULL;
3290 }
fb4089e0 3291 for (i = 0; i < maxgrp; ++i) {
fdadaf77
JH
3292 if (endptr == NULL)
3293 break;
3294 p = endptr;
79e302e6 3295 endptr = p_end;
757f63d8
SP
3296 while (isSPACE(*p))
3297 ++p;
3298 if (!*p)
3299 break;
fdadaf77 3300 if (!gary)
757f63d8
SP
3301 Newx(gary, i + 1, Groups_t);
3302 else
3303 Renew(gary, i + 1, Groups_t);
22ff3130
HS
3304 if (grok_atoUV(p, &uv, &endptr))
3305 gary[i] = (Groups_t)uv;
3306 else {
0635704a 3307 gary[i] = INVALID_GID;
22ff3130
HS
3308 endptr = NULL;
3309 }
757f63d8
SP
3310 }
3311 if (i)
b469f1e0 3312 PERL_UNUSED_RESULT(setgroups(i, gary));
1604cfb0
MS
3313 Safefree(gary);
3314 }
5cd24f17 3315#else /* HAS_SETGROUPS */
dfff4baf 3316 new_egid = SvGID(sv);
5cd24f17 3317#endif /* HAS_SETGROUPS */
1604cfb0
MS
3318 PL_delaymagic_egid = new_egid;
3319 if (PL_delaymagic) {
3320 PL_delaymagic |= DM_EGID;
3321 break; /* don't do magic till later */
3322 }
79072805 3323#ifdef HAS_SETEGID
1604cfb0 3324 PERL_UNUSED_RESULT(setegid(new_egid));
2abc681d 3325#elif defined(HAS_SETREGID)
1604cfb0 3326 PERL_UNUSED_RESULT(setregid((Gid_t)-1, new_egid));
2abc681d 3327#elif defined(HAS_SETRESGID)
1604cfb0 3328 PERL_UNUSED_RESULT(setresgid((Gid_t)-1, new_egid, (Gid_t)-1));
79072805 3329#else
1604cfb0
MS
3330 if (new_egid == PerlProc_getgid()) /* special case $) = $( */
3331 PERL_UNUSED_RESULT(PerlProc_setgid(new_egid));
3332 else {
3333 Perl_croak(aTHX_ "setegid() not implemented");
3334 }
3335#endif
3336 break;
3337 }
79072805 3338 case ':':
1604cfb0
MS
3339 PL_chopset = SvPV_force(sv,len);
3340 break;
9cdac2a2 3341 case '$': /* $$ */
1604cfb0
MS
3342 /* Store the pid in mg->mg_obj so we can tell when a fork has
3343 occurred. mg->mg_obj points to *$ by default, so clear it. */
3344 if (isGV(mg->mg_obj)) {
3345 if (mg->mg_flags & MGf_REFCOUNTED) /* probably never true */
3346 SvREFCNT_dec(mg->mg_obj);
3347 mg->mg_flags |= MGf_REFCOUNTED;
3348 mg->mg_obj = newSViv((IV)PerlProc_getpid());
3349 }
3350 else sv_setiv(mg->mg_obj, (IV)PerlProc_getpid());
3351 break;
79072805 3352 case '0':
2d3b3561
FG
3353 if (!sv_utf8_downgrade(sv, /* fail_ok */ TRUE)) {
3354
3355 /* Since we are going to set the string's UTF8-encoded form
3356 as the process name we should update $0 itself to contain
3357 that same (UTF8-encoded) value. */
3358 sv_utf8_encode(GvSV(mg->mg_obj));
3359
3360 Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "$0");
3361 }
3362
1604cfb0 3363 LOCK_DOLLARZERO_MUTEX;
f1540bed 3364 S_set_dollarzero(aTHX_ sv);
1604cfb0
MS
3365 UNLOCK_DOLLARZERO_MUTEX;
3366 break;
79072805
LW
3367 }
3368 return 0;
3369}
3370
ea81552b 3371/*
3f620621 3372=for apidoc_section $signals
ea81552b
KW
3373=for apidoc whichsig
3374=for apidoc_item whichsig_pv
3375=for apidoc_item whichsig_pvn
3376=for apidoc_item whichsig_sv
3377
3378These all convert a signal name into its corresponding signal number;
3379returning -1 if no corresponding number was found.
3380
3381They differ only in the source of the signal name:
3382
3383C<whichsig_pv> takes the name from the C<NUL>-terminated string starting at
3384C<sig>.
3385
3386C<whichsig> is merely a different spelling, a synonym, of C<whichsig_pv>.
3387
3388C<whichsig_pvn> takes the name from the string starting at C<sig>, with length
3389C<len> bytes.
3390
3391C<whichsig_sv> takes the name from the PV stored in the SV C<sigsv>.
3392
3393=cut
3394*/
3395
79072805 3396I32
84c7b88c
BF
3397Perl_whichsig_sv(pTHX_ SV *sigsv)
3398{
3399 const char *sigpv;
3400 STRLEN siglen;
3401 PERL_ARGS_ASSERT_WHICHSIG_SV;
84c7b88c
BF
3402 sigpv = SvPV_const(sigsv, siglen);
3403 return whichsig_pvn(sigpv, siglen);
3404}
3405
3406I32
3407Perl_whichsig_pv(pTHX_ const char *sig)
3408{
3409 PERL_ARGS_ASSERT_WHICHSIG_PV;
84c7b88c
BF
3410 return whichsig_pvn(sig, strlen(sig));
3411}
3412
3413I32
3414Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len)
79072805 3415{
eb578fdb 3416 char* const* sigv;
7918f24d 3417
84c7b88c 3418 PERL_ARGS_ASSERT_WHICHSIG_PVN;
96a5add6 3419 PERL_UNUSED_CONTEXT;
79072805 3420
aadb217d 3421 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
1604cfb0
MS
3422 if (strlen(*sigv) == len && memEQ(sig,*sigv, len))
3423 return PL_sig_num[sigv - (char* const*)PL_sig_name];
79072805 3424#ifdef SIGCLD
84c7b88c 3425 if (memEQs(sig, len, "CHLD"))
1604cfb0 3426 return SIGCLD;
79072805
LW
3427#endif
3428#ifdef SIGCHLD
84c7b88c 3429 if (memEQs(sig, len, "CLD"))
1604cfb0 3430 return SIGCHLD;
79072805 3431#endif
7f1236c0 3432 return -1;
79072805
LW
3433}
3434
dc37125b
DM
3435
3436/* Perl_sighandler(), Perl_sighandler1(), Perl_sighandler3():
3437 * these three function are intended to be called by the OS as 'C' level
3438 * signal handler functions in the case where unsafe signals are being
3439 * used - i.e. they immediately invoke Perl_perly_sighandler() to call the
3440 * perl-level sighandler, rather than deferring.
3441 * In fact, the core itself will normally use Perl_csighandler as the
3442 * OS-level handler; that function will then decide whether to queue the
3443 * signal or call Perl_sighandler / Perl_perly_sighandler itself. So these
3444 * functions are more useful for e.g. POSIX.xs when it wants explicit
3445 * control of what's happening.
3446 */
3447
3448
5e7940ce 3449#ifdef PERL_USE_3ARG_SIGHANDLER
8a5e470b
DM
3450
3451Signal_t
e7124897 3452Perl_sighandler(int sig, Siginfo_t *sip, void *uap)
8a5e470b
DM
3453{
3454 Perl_perly_sighandler(sig, sip, uap, 0);
3455}
3456
1e82f5a6 3457#else
8a5e470b
DM
3458
3459Signal_t
1e82f5a6 3460Perl_sighandler(int sig)
8a5e470b
DM
3461{
3462 Perl_perly_sighandler(sig, NULL, NULL, 0);
3463}
3464
1e82f5a6 3465#endif
8a5e470b 3466
dc37125b
DM
3467Signal_t
3468Perl_sighandler1(int sig)
3469{
3470 Perl_perly_sighandler(sig, NULL, NULL, 0);
3471}
3472
3473Signal_t
3474Perl_sighandler3(int sig, Siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
3475{
3476 Perl_perly_sighandler(sig, sip, uap, 0);
3477}
3478
3479
8a5e470b
DM
3480/* Invoke the perl-level signal handler. This function is called either
3481 * directly from one of the C-level signals handlers (Perl_sighandler or
3482 * Perl_csighandler), or for safe signals, later from
3483 * Perl_despatch_signals() at a suitable safe point during execution.
3484 *
3485 * 'safe' is a boolean indicating the latter call path.
3486 */
3487
3488Signal_t
3489Perl_perly_sighandler(int sig, Siginfo_t *sip PERL_UNUSED_DECL,
3490 void *uap PERL_UNUSED_DECL, bool safe)
79072805 3491{
1018e26f
NIS
3492#ifdef PERL_GET_SIG_CONTEXT
3493 dTHXa(PERL_GET_SIG_CONTEXT);
71d280e3 3494#else
cea2e8a9 3495 dTHX;
71d280e3 3496#endif
79072805 3497 dSP;
a0714e2c
SS
3498 GV *gv = NULL;
3499 SV *sv = NULL;
8772537c 3500 SV * const tSv = PL_Sv;
601f1833 3501 CV *cv = NULL;
533c011a 3502 OP *myop = PL_op;
84902520 3503 U32 flags = 0;
8772537c 3504 XPV * const tXpv = PL_Xpv;
0c4d3b5e 3505 I32 old_ss_ix = PL_savestack_ix;
100c03aa 3506 SV *errsv_save = NULL;
71d280e3 3507
84902520 3508
727405f8 3509 if (!PL_psig_ptr[sig]) {
1604cfb0
MS
3510 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
3511 PL_sig_name[sig]);
3512 exit(sig);
3513 }
ff0cee69 3514
a0d63a7b 3515 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG) {
1604cfb0
MS
3516 /* Max number of items pushed there is 3*n or 4. We cannot fix
3517 infinity, so we fix 4 (in fact 5): */
3518 if (PL_savestack_ix + 15 <= PL_savestack_max) {
3519 flags |= 1;
3520 PL_savestack_ix += 5; /* Protect save in progress. */
3521 SAVEDESTRUCTOR_X(S_unwind_handler_stack, NULL);
3522 }
84902520 3523 }
84902520 3524 /* sv_2cv is too complicated, try a simpler variant first: */
ea726b52 3525 if (!SvROK(PL_psig_ptr[sig]) || !(cv = MUTABLE_CV(SvRV(PL_psig_ptr[sig])))
1604cfb0
MS
3526 || SvTYPE(cv) != SVt_PVCV) {
3527 HV *st;
3528 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
8772537c 3529 }
84902520 3530
a0d0e21e 3531 if (!cv || !CvROOT(cv)) {
1604cfb0
MS
3532 const HEK * const hek = gv
3533 ? GvENAME_HEK(gv)
3534 : cv && CvNAMED(cv)
3535 ? CvNAME_HEK(cv)
3536 : cv && CvGV(cv) ? GvENAME_HEK(CvGV(cv)) : NULL;
3537 if (hek)
3538 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
3539 "SIG%s handler \"%" HEKf "\" not defined.\n",
3540 PL_sig_name[sig], HEKfARG(hek));
3541 /* diag_listed_as: SIG%s handler "%s" not defined */
3542 else Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
3543 "SIG%s handler \"__ANON__\" not defined.\n",
3544 PL_sig_name[sig]);
3545 goto cleanup;
79072805
LW
3546 }
3547
0c4d3b5e 3548 sv = PL_psig_name[sig]
1604cfb0
MS
3549 ? SvREFCNT_inc_NN(PL_psig_name[sig])
3550 : newSVpv(PL_sig_name[sig],0);
72048cfe 3551 flags |= 8;
0c4d3b5e
DM
3552 SAVEFREESV(sv);
3553
a0d63a7b 3554 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG) {
1604cfb0
MS
3555 /* make sure our assumption about the size of the SAVEs are correct:
3556 * 3 for SAVEDESTRUCTOR_X, 2 for SAVEFREESV */
3557 assert(old_ss_ix + 2 + ((flags & 1) ? 3+5 : 0) == PL_savestack_ix);
a0d63a7b 3558 }
e336de0d 3559
e788e7d3 3560 PUSHSTACKi(PERLSI_SIGNAL);
924508f0 3561 PUSHMARK(SP);
79072805 3562 PUSHs(sv);
dc43527e 3563
8aad04aa
JH
3564#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3565 {
1604cfb0 3566 struct sigaction oact;
8aad04aa 3567
1604cfb0 3568 if (sip && sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
dc43527e
DM
3569 HV *sih = newHV();
3570 SV *rv = newRV_noinc(MUTABLE_SV(sih));
3571 /* The siginfo fields signo, code, errno, pid, uid,
3572 * addr, status, and band are defined by POSIX/SUSv3. */
3573 (void)hv_stores(sih, "signo", newSViv(sip->si_signo));
3574 (void)hv_stores(sih, "code", newSViv(sip->si_code));
3575# ifdef HAS_SIGINFO_SI_ERRNO
3576 (void)hv_stores(sih, "errno", newSViv(sip->si_errno));
3577# endif
3578# ifdef HAS_SIGINFO_SI_STATUS
3579 (void)hv_stores(sih, "status", newSViv(sip->si_status));
3580# endif
3581# ifdef HAS_SIGINFO_SI_UID
3582 {
3583 SV *uid = newSV(0);
3584 sv_setuid(uid, sip->si_uid);
3585 (void)hv_stores(sih, "uid", uid);
3586 }
3587# endif
3588# ifdef HAS_SIGINFO_SI_PID
3589 (void)hv_stores(sih, "pid", newSViv(sip->si_pid));
3590# endif
3591# ifdef HAS_SIGINFO_SI_ADDR
3592 (void)hv_stores(sih, "addr", newSVuv(PTR2UV(sip->si_addr)));
3593# endif
3594# ifdef HAS_SIGINFO_SI_BAND
3595 (void)hv_stores(sih, "band", newSViv(sip->si_band));
3596# endif
3597 EXTEND(SP, 2);
3598 PUSHs(rv);
3599 mPUSHp((char *)sip, sizeof(*sip));
b4552a27 3600
1604cfb0 3601 }
8aad04aa
JH
3602 }
3603#endif
dc43527e 3604
79072805 3605 PUTBACK;
a0d0e21e 3606
100c03aa
JL
3607 errsv_save = newSVsv(ERRSV);
3608
ad64d0ec 3609 call_sv(MUTABLE_SV(cv), G_DISCARD|G_EVAL);
79072805 3610
d3acc0f7 3611 POPSTACK;
eed484f9 3612 {
1604cfb0
MS
3613 SV * const errsv = ERRSV;
3614 if (SvTRUE_NN(errsv)) {
3615 SvREFCNT_dec(errsv_save);
dc43527e 3616
c22d665b 3617#ifndef PERL_MICRO
dc43527e
DM
3618 /* Handler "died", for example to get out of a restart-able read().
3619 * Before we re-do that on its behalf re-enable the signal which was
3620 * blocked by the system when we entered.
3621 */
3622# ifdef HAS_SIGPROCMASK
1604cfb0 3623 if (!safe) {
8a5e470b
DM
3624 /* safe signals called via dispatch_signals() set up a
3625 * savestack destructor, unblock_sigmask(), to
3626 * automatically unblock the handler at the end. If
3627 * instead we get here directly, we have to do it
3628 * ourselves
3629 */
1604cfb0
MS
3630 sigset_t set;
3631 sigemptyset(&set);
3632 sigaddset(&set,sig);
3633 sigprocmask(SIG_UNBLOCK, &set, NULL);
3634 }
dc43527e 3635# else
1604cfb0 3636 /* Not clear if this will work */
8a5e470b
DM
3637 /* XXX not clear if this should be protected by 'if (safe)'
3638 * too */
3639
1604cfb0
MS
3640 (void)rsignal(sig, SIG_IGN);
3641 (void)rsignal(sig, PL_csighandlerp);
dc43527e 3642# endif
c22d665b 3643#endif /* !PERL_MICRO */
dc43527e 3644
1604cfb0
MS
3645 die_sv(errsv);
3646 }
3647 else {
3648 sv_setsv(errsv, errsv_save);
3649 SvREFCNT_dec(errsv_save);
3650 }
100c03aa
JL
3651 }
3652
7b52d656 3653 cleanup:
0c4d3b5e
DM
3654 /* pop any of SAVEFREESV, SAVEDESTRUCTOR_X and "save in progress" */
3655 PL_savestack_ix = old_ss_ix;
72048cfe 3656 if (flags & 8)
1604cfb0 3657 SvREFCNT_dec_NN(sv);
533c011a 3658 PL_op = myop; /* Apparently not needed... */
ac27b0f5 3659
3280af22
NIS
3660 PL_Sv = tSv; /* Restore global temporaries. */
3661 PL_Xpv = tXpv;
53bb94e2 3662 return;
79072805 3663}
4e35701f
NIS
3664
3665
51371543 3666static void
8772537c 3667S_restore_magic(pTHX_ const void *p)
51371543 3668{
8772537c
AL
3669 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
3670 SV* const sv = mgs->mgs_sv;
150b625d 3671 bool bumped;
51371543
GS
3672
3673 if (!sv)
3674 return;
3675
4bac9ae4 3676 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
1604cfb0
MS
3677 SvTEMP_off(sv); /* if it's still magical, this value isn't temporary */
3678 if (mgs->mgs_flags)
3679 SvFLAGS(sv) |= mgs->mgs_flags;
3680 else
3681 mg_magical(sv);
51371543
GS
3682 }
3683
150b625d 3684 bumped = mgs->mgs_bumped;
51371543
GS
3685 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
3686
3687 /* If we're still on top of the stack, pop us off. (That condition
3688 * will be satisfied if restore_magic was called explicitly, but *not*
3689 * if it's being called via leave_scope.)
3690 * The reason for doing this is that otherwise, things like sv_2cv()
3691 * may leave alloc gunk on the savestack, and some code
3692 * (e.g. sighandler) doesn't expect that...
3693 */
3694 if (PL_savestack_ix == mgs->mgs_ss_ix)
3695 {
1604cfb0 3696 UV popval = SSPOPUV;
1be36ce0 3697 assert(popval == SAVEt_DESTRUCTOR_X);
51371543 3698 PL_savestack_ix -= 2;
1604cfb0 3699 popval = SSPOPUV;
1be36ce0
NC
3700 assert((popval & SAVE_MASK) == SAVEt_ALLOC);
3701 PL_savestack_ix -= popval >> SAVE_TIGHT_SHIFT;
51371543 3702 }
150b625d 3703 if (bumped) {
1604cfb0
MS
3704 if (SvREFCNT(sv) == 1) {
3705 /* We hold the last reference to this SV, which implies that the
3706 SV was deleted as a side effect of the routines we called.
3707 So artificially keep it alive a bit longer.
3708 We avoid turning on the TEMP flag, which can cause the SV's
3709 buffer to get stolen (and maybe other stuff). */
3710 sv_2mortal(sv);
3711 SvTEMP_off(sv);
3712 }
3713 else
3714 SvREFCNT_dec_NN(sv); /* undo the inc in S_save_magic() */
8985fe98 3715 }
51371543
GS
3716}
3717
0c4d3b5e
DM
3718/* clean up the mess created by Perl_sighandler().
3719 * Note that this is only called during an exit in a signal handler;
3720 * a die is trapped by the call_sv() and the SAVEDESTRUCTOR_X manually
9a7f166c 3721 * skipped over. */
0c4d3b5e 3722
51371543 3723static void
8772537c 3724S_unwind_handler_stack(pTHX_ const void *p)
51371543 3725{
0c4d3b5e 3726 PERL_UNUSED_ARG(p);
7918f24d 3727
0c4d3b5e 3728 PL_savestack_ix -= 5; /* Unprotect save in progress. */
51371543 3729}
1018e26f 3730
66610fdd 3731/*
3f620621 3732=for apidoc_section $magic
b3ca2e83
NC
3733=for apidoc magic_sethint
3734
796b6530 3735Triggered by a store to C<%^H>, records the key/value pair to
c28fe1ec
NC
3736C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
3737anything that would need a deep copy. Maybe we should warn if we find a
3738reference.
b3ca2e83
NC
3739
3740=cut
3741*/
3742int
3743Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
3744{
ad64d0ec 3745 SV *key = (mg->mg_len == HEf_SVKEY) ? MUTABLE_SV(mg->mg_ptr)
1604cfb0 3746 : newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
b3ca2e83 3747
7918f24d
NC
3748 PERL_ARGS_ASSERT_MAGIC_SETHINT;
3749
e6e3e454
NC
3750 /* mg->mg_obj isn't being used. If needed, it would be possible to store
3751 an alternative leaf in there, with PL_compiling.cop_hints being used if
3752 it's NULL. If needed for threads, the alternative could lock a mutex,
3753 or take other more complex action. */
3754
5b9c0671
NC
3755 /* Something changed in %^H, so it will need to be restored on scope exit.
3756 Doing this here saves a lot of doing it manually in perl code (and
3757 forgetting to do it, and consequent subtle errors. */
3758 PL_hints |= HINT_LOCALIZE_HH;
20439bc7 3759 CopHINTHASH_set(&PL_compiling,
1604cfb0 3760 cophh_store_sv(CopHINTHASH_get(&PL_compiling), key, 0, sv, 0));
b34c1a7e 3761 magic_sethint_feature(key, NULL, 0, sv, 0);
b3ca2e83
NC
3762 return 0;
3763}
3764
3765/*
f175cff5 3766=for apidoc magic_clearhint
b3ca2e83 3767
796b6530 3768Triggered by a delete from C<%^H>, records the key to
c28fe1ec 3769C<PL_compiling.cop_hints_hash>.
b3ca2e83
NC
3770
3771=cut
3772*/
3773int
3774Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
3775{
7918f24d 3776 PERL_ARGS_ASSERT_MAGIC_CLEARHINT;
f5a63d97
AL
3777 PERL_UNUSED_ARG(sv);
3778
5b9c0671 3779 PL_hints |= HINT_LOCALIZE_HH;
20439bc7 3780 CopHINTHASH_set(&PL_compiling,
1604cfb0
MS
3781 mg->mg_len == HEf_SVKEY
3782 ? cophh_delete_sv(CopHINTHASH_get(&PL_compiling),
3783 MUTABLE_SV(mg->mg_ptr), 0, 0)
3784 : cophh_delete_pvn(CopHINTHASH_get(&PL_compiling),
3785 mg->mg_ptr, mg->mg_len, 0, 0));
b34c1a7e
TC
3786 if (mg->mg_len == HEf_SVKEY)
3787 magic_sethint_feature(MUTABLE_SV(mg->mg_ptr), NULL, 0, NULL, FALSE);
3788 else
3789 magic_sethint_feature(NULL, mg->mg_ptr, mg->mg_len, NULL, FALSE);
b3ca2e83
NC
3790 return 0;
3791}
3792
3793/*
f747ebd6
Z
3794=for apidoc magic_clearhints
3795
796b6530 3796Triggered by clearing C<%^H>, resets C<PL_compiling.cop_hints_hash>.
f747ebd6
Z
3797
3798=cut
3799*/
3800int
3801Perl_magic_clearhints(pTHX_ SV *sv, MAGIC *mg)
3802{
3803 PERL_ARGS_ASSERT_MAGIC_CLEARHINTS;
3804 PERL_UNUSED_ARG(sv);
3805 PERL_UNUSED_ARG(mg);
20439bc7
Z
3806 cophh_free(CopHINTHASH_get(&PL_compiling));
3807 CopHINTHASH_set(&PL_compiling, cophh_new_empty());
b34c1a7e 3808 CLEARFEATUREBITS();
f747ebd6
Z
3809 return 0;
3810}
3811
09fb282d
FC
3812int
3813Perl_magic_copycallchecker(pTHX_ SV *sv, MAGIC *mg, SV *nsv,
1604cfb0 3814 const char *name, I32 namlen)
09fb282d
FC
3815{
3816 MAGIC *nmg;
3817
3818 PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER;
4f8dbb2d 3819 PERL_UNUSED_ARG(sv);
09fb282d
FC
3820 PERL_UNUSED_ARG(name);
3821 PERL_UNUSED_ARG(namlen);
3822
3823 sv_magic(nsv, &PL_sv_undef, mg->mg_type, NULL, 0);
3824 nmg = mg_find(nsv, mg->mg_type);
316ebaf2 3825 assert(nmg);
09fb282d
FC
3826 if (nmg->mg_flags & MGf_REFCOUNTED) SvREFCNT_dec(nmg->mg_obj);
3827 nmg->mg_ptr = mg->mg_ptr;
3828 nmg->mg_obj = SvREFCNT_inc_simple(mg->mg_obj);
3829 nmg->mg_flags |= MGf_REFCOUNTED;
3830 return 1;
3831}
3832
a6d69523
TC
3833int
3834Perl_magic_setdebugvar(pTHX_ SV *sv, MAGIC *mg) {
3835 PERL_ARGS_ASSERT_MAGIC_SETDEBUGVAR;
3836
23270f96
DM
3837#if DBVARMG_SINGLE != 0
3838 assert(mg->mg_private >= DBVARMG_SINGLE);
3839#endif
3840 assert(mg->mg_private < DBVARMG_COUNT);
a6d69523
TC
3841
3842 PL_DBcontrol[mg->mg_private] = SvIV_nomg(sv);
3843
3844 return 1;
3845}
3846
3847int
3848Perl_magic_getdebugvar(pTHX_ SV *sv, MAGIC *mg) {
3849 PERL_ARGS_ASSERT_MAGIC_GETDEBUGVAR;
3850
23270f96
DM
3851#if DBVARMG_SINGLE != 0
3852 assert(mg->mg_private >= DBVARMG_SINGLE);
3853#endif
3854 assert(mg->mg_private < DBVARMG_COUNT);
a6d69523
TC
3855 sv_setiv(sv, PL_DBcontrol[mg->mg_private]);
3856
3857 return 0;
3858}
3859
f747ebd6 3860/*
14d04a33 3861 * ex: set ts=8 sts=4 sw=4 et:
37442d52 3862 */