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