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