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