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