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