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