This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Introduce the :5.10.0 feature bundle, and make :5.10 an
[perl5.git] / mg.c
CommitLineData
a0d0e21e 1/* mg.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
7272f7c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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/*
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."
79072805
LW
14 */
15
ccfc67b7
JH
16/*
17=head1 Magical Functions
166f8a29
DM
18
19"Magic" is special data attached to SV structures in order to give them
20"magical" properties. When any Perl code tries to read from, or assign to,
21an SV marked as magical, it calls the 'get' or 'set' function associated
22with that SV's magic. A get is called prior to reading an SV, in order to
ddfa107c 23give it a chance to update its internal value (get on $. writes the line
166f8a29
DM
24number of the last read filehandle into to the SV's IV slot), while
25set is called after an SV has been written to, in order to allow it to make
ddfa107c 26use of its changed value (set on $/ copies the SV's new value to the
166f8a29
DM
27PL_rs global variable).
28
29Magic is implemented as a linked list of MAGIC structures attached to the
30SV. Each MAGIC struct holds the type of the magic, a pointer to an array
31of functions that implement the get(), set(), length() etc functions,
32plus space for some flags and pointers. For example, a tied variable has
33a MAGIC structure that contains a pointer to the object associated with the
34tie.
35
ccfc67b7
JH
36*/
37
79072805 38#include "EXTERN.h"
864dbfa3 39#define PERL_IN_MG_C
79072805
LW
40#include "perl.h"
41
5cd24f17 42#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
b7953727
JH
43# ifdef I_GRP
44# include <grp.h>
45# endif
188ea221
CS
46#endif
47
757f63d8
SP
48#if defined(HAS_SETGROUPS)
49# ifndef NGROUPS
50# define NGROUPS 32
51# endif
52#endif
53
17aa7f3d
JH
54#ifdef __hpux
55# include <sys/pstat.h>
56#endif
57
8aad04aa
JH
58#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
59Signal_t Perl_csighandler(int sig, ...);
60#else
e69880a5 61Signal_t Perl_csighandler(int sig);
8aad04aa 62#endif
e69880a5 63
9cffb111
OS
64#ifdef __Lynx__
65/* Missing protos on LynxOS */
66void setruid(uid_t id);
67void seteuid(uid_t id);
68void setrgid(uid_t id);
69void setegid(uid_t id);
70#endif
71
c07a80fd 72/*
73 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
74 */
75
76struct magic_state {
77 SV* mgs_sv;
78 U32 mgs_flags;
455ece5e 79 I32 mgs_ss_ix;
c07a80fd 80};
455ece5e 81/* MGS is typedef'ed to struct magic_state in perl.h */
76e3520e
GS
82
83STATIC void
8fb26106 84S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
c07a80fd 85{
97aff369 86 dVAR;
455ece5e 87 MGS* mgs;
c07a80fd 88 assert(SvMAGICAL(sv));
d8b2590f
NC
89 /* Turning READONLY off for a copy-on-write scalar (including shared
90 hash keys) is a bad idea. */
765f542d 91 if (SvIsCOW(sv))
9a265e59 92 sv_force_normal_flags(sv, 0);
c07a80fd 93
8772537c 94 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
455ece5e
AD
95
96 mgs = SSPTR(mgs_ix, MGS*);
c07a80fd 97 mgs->mgs_sv = sv;
98 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
455ece5e 99 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
c07a80fd 100
101 SvMAGICAL_off(sv);
102 SvREADONLY_off(sv);
085bde85
NC
103 if (!(SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK))) {
104 /* No public flags are set, so promote any private flags to public. */
105 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
106 }
c07a80fd 107}
108
954c1994
GS
109/*
110=for apidoc mg_magical
111
112Turns on the magical status of an SV. See C<sv_magic>.
113
114=cut
115*/
116
8990e307 117void
864dbfa3 118Perl_mg_magical(pTHX_ SV *sv)
8990e307 119{
e1ec3a88 120 const MAGIC* mg;
96a5add6 121 PERL_UNUSED_CONTEXT;
8990e307 122 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 123 const MGVTBL* const vtbl = mg->mg_virtual;
8990e307 124 if (vtbl) {
2b260de0 125 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
8990e307
LW
126 SvGMAGICAL_on(sv);
127 if (vtbl->svt_set)
128 SvSMAGICAL_on(sv);
2b260de0 129 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
8990e307
LW
130 SvRMAGICAL_on(sv);
131 }
132 }
133}
134
954c1994
GS
135/*
136=for apidoc mg_get
137
138Do magic after a value is retrieved from the SV. See C<sv_magic>.
139
140=cut
141*/
142
79072805 143int
864dbfa3 144Perl_mg_get(pTHX_ SV *sv)
79072805 145{
97aff369 146 dVAR;
35a4481c 147 const I32 mgs_ix = SSNEW(sizeof(MGS));
fe2774ed 148 const bool was_temp = (bool)SvTEMP(sv);
0723351e 149 int have_new = 0;
ff76feab 150 MAGIC *newmg, *head, *cur, *mg;
20135930 151 /* guard against sv having being freed midway by holding a private
6683b158
NC
152 reference. */
153
154 /* sv_2mortal has this side effect of turning on the TEMP flag, which can
155 cause the SV's buffer to get stolen (and maybe other stuff).
156 So restore it.
157 */
46da273f 158 sv_2mortal(SvREFCNT_inc_simple_NN(sv));
6683b158
NC
159 if (!was_temp) {
160 SvTEMP_off(sv);
161 }
162
455ece5e 163 save_magic(mgs_ix, sv);
463ee0b2 164
ff76feab
AMS
165 /* We must call svt_get(sv, mg) for each valid entry in the linked
166 list of magic. svt_get() may delete the current entry, add new
167 magic to the head of the list, or upgrade the SV. AMS 20010810 */
168
169 newmg = cur = head = mg = SvMAGIC(sv);
170 while (mg) {
35a4481c 171 const MGVTBL * const vtbl = mg->mg_virtual;
ff76feab 172
2b260de0 173 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
316ad4fe 174 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
b77f7d40 175
58f82c5c
DM
176 /* guard against magic having been deleted - eg FETCH calling
177 * untie */
178 if (!SvMAGIC(sv))
179 break;
b77f7d40 180
ff76feab
AMS
181 /* Don't restore the flags for this entry if it was deleted. */
182 if (mg->mg_flags & MGf_GSKIP)
183 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
a0d0e21e 184 }
ff76feab
AMS
185
186 mg = mg->mg_moremagic;
187
0723351e 188 if (have_new) {
ff76feab
AMS
189 /* Have we finished with the new entries we saw? Start again
190 where we left off (unless there are more new entries). */
191 if (mg == head) {
0723351e 192 have_new = 0;
ff76feab
AMS
193 mg = cur;
194 head = newmg;
195 }
196 }
197
198 /* Were any new entries added? */
0723351e
NC
199 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
200 have_new = 1;
ff76feab
AMS
201 cur = mg;
202 mg = newmg;
760ac839 203 }
79072805 204 }
463ee0b2 205
8772537c 206 restore_magic(INT2PTR(void *, (IV)mgs_ix));
6683b158
NC
207
208 if (SvREFCNT(sv) == 1) {
209 /* We hold the last reference to this SV, which implies that the
210 SV was deleted as a side effect of the routines we called. */
0c34ef67 211 SvOK_off(sv);
6683b158 212 }
79072805
LW
213 return 0;
214}
215
954c1994
GS
216/*
217=for apidoc mg_set
218
219Do magic after a value is assigned to the SV. See C<sv_magic>.
220
221=cut
222*/
223
79072805 224int
864dbfa3 225Perl_mg_set(pTHX_ SV *sv)
79072805 226{
97aff369 227 dVAR;
35a4481c 228 const I32 mgs_ix = SSNEW(sizeof(MGS));
79072805 229 MAGIC* mg;
463ee0b2
LW
230 MAGIC* nextmg;
231
455ece5e 232 save_magic(mgs_ix, sv);
463ee0b2
LW
233
234 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
e1ec3a88 235 const MGVTBL* vtbl = mg->mg_virtual;
463ee0b2 236 nextmg = mg->mg_moremagic; /* it may delete itself */
a0d0e21e
LW
237 if (mg->mg_flags & MGf_GSKIP) {
238 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
455ece5e 239 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
a0d0e21e 240 }
2b260de0 241 if (vtbl && vtbl->svt_set)
fc0dc3b3 242 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
79072805 243 }
463ee0b2 244
8772537c 245 restore_magic(INT2PTR(void*, (IV)mgs_ix));
79072805
LW
246 return 0;
247}
248
954c1994
GS
249/*
250=for apidoc mg_length
251
252Report on the SV's length. See C<sv_magic>.
253
254=cut
255*/
256
79072805 257U32
864dbfa3 258Perl_mg_length(pTHX_ SV *sv)
79072805 259{
97aff369 260 dVAR;
79072805 261 MAGIC* mg;
463ee0b2 262 STRLEN len;
463ee0b2 263
79072805 264 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 265 const MGVTBL * const vtbl = mg->mg_virtual;
2b260de0 266 if (vtbl && vtbl->svt_len) {
35a4481c 267 const I32 mgs_ix = SSNEW(sizeof(MGS));
455ece5e 268 save_magic(mgs_ix, sv);
a0d0e21e 269 /* omit MGf_GSKIP -- not changed here */
fc0dc3b3 270 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
8772537c 271 restore_magic(INT2PTR(void*, (IV)mgs_ix));
85e6fe83
LW
272 return len;
273 }
274 }
275
35a4481c 276 if (DO_UTF8(sv)) {
10516c54 277 const U8 *s = (U8*)SvPV_const(sv, len);
f5a63d97 278 len = utf8_length(s, s + len);
5636d518
DB
279 }
280 else
10516c54 281 (void)SvPV_const(sv, len);
463ee0b2 282 return len;
79072805
LW
283}
284
8fb26106 285I32
864dbfa3 286Perl_mg_size(pTHX_ SV *sv)
93965878
NIS
287{
288 MAGIC* mg;
ac27b0f5 289
93965878 290 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 291 const MGVTBL* const vtbl = mg->mg_virtual;
2b260de0 292 if (vtbl && vtbl->svt_len) {
35a4481c
AL
293 const I32 mgs_ix = SSNEW(sizeof(MGS));
294 I32 len;
455ece5e 295 save_magic(mgs_ix, sv);
93965878 296 /* omit MGf_GSKIP -- not changed here */
fc0dc3b3 297 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
8772537c 298 restore_magic(INT2PTR(void*, (IV)mgs_ix));
93965878
NIS
299 return len;
300 }
301 }
302
303 switch(SvTYPE(sv)) {
304 case SVt_PVAV:
35a4481c 305 return AvFILLp((AV *) sv); /* Fallback to non-tied array */
93965878
NIS
306 case SVt_PVHV:
307 /* FIXME */
308 default:
cea2e8a9 309 Perl_croak(aTHX_ "Size magic not implemented");
93965878
NIS
310 break;
311 }
312 return 0;
313}
314
954c1994
GS
315/*
316=for apidoc mg_clear
317
318Clear something magical that the SV represents. See C<sv_magic>.
319
320=cut
321*/
322
79072805 323int
864dbfa3 324Perl_mg_clear(pTHX_ SV *sv)
79072805 325{
35a4481c 326 const I32 mgs_ix = SSNEW(sizeof(MGS));
79072805 327 MAGIC* mg;
463ee0b2 328
455ece5e 329 save_magic(mgs_ix, sv);
463ee0b2 330
79072805 331 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 332 const MGVTBL* const vtbl = mg->mg_virtual;
a0d0e21e 333 /* omit GSKIP -- never set here */
727405f8 334
2b260de0 335 if (vtbl && vtbl->svt_clear)
fc0dc3b3 336 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
79072805 337 }
463ee0b2 338
8772537c 339 restore_magic(INT2PTR(void*, (IV)mgs_ix));
79072805
LW
340 return 0;
341}
342
954c1994
GS
343/*
344=for apidoc mg_find
345
346Finds the magic pointer for type matching the SV. See C<sv_magic>.
347
348=cut
349*/
350
93a17b20 351MAGIC*
35a4481c 352Perl_mg_find(pTHX_ const SV *sv, int type)
93a17b20 353{
96a5add6 354 PERL_UNUSED_CONTEXT;
35a4481c
AL
355 if (sv) {
356 MAGIC *mg;
357 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
358 if (mg->mg_type == type)
359 return mg;
360 }
93a17b20 361 }
5f66b61c 362 return NULL;
93a17b20
LW
363}
364
954c1994
GS
365/*
366=for apidoc mg_copy
367
368Copies the magic from one SV to another. See C<sv_magic>.
369
370=cut
371*/
372
79072805 373int
864dbfa3 374Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
79072805 375{
463ee0b2 376 int count = 0;
79072805 377 MAGIC* mg;
463ee0b2 378 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
35a4481c 379 const MGVTBL* const vtbl = mg->mg_virtual;
68795e93
NIS
380 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
381 count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
382 }
823a54a3
AL
383 else {
384 const char type = mg->mg_type;
1e73acc8 385 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
823a54a3
AL
386 sv_magic(nsv,
387 (type == PERL_MAGIC_tied)
388 ? SvTIED_obj(sv, mg)
389 : (type == PERL_MAGIC_regdata && mg->mg_obj)
390 ? sv
391 : mg->mg_obj,
392 toLOWER(type), key, klen);
393 count++;
394 }
79072805 395 }
79072805 396 }
463ee0b2 397 return count;
79072805
LW
398}
399
954c1994 400/*
0cbee0a4
DM
401=for apidoc mg_localize
402
403Copy some of the magic from an existing SV to new localized version of
404that SV. Container magic (eg %ENV, $1, tie) gets copied, value magic
405doesn't (eg taint, pos).
406
407=cut
408*/
409
410void
411Perl_mg_localize(pTHX_ SV *sv, SV *nsv)
412{
97aff369 413 dVAR;
0cbee0a4
DM
414 MAGIC *mg;
415 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
92e67595 416 MGVTBL* const vtbl = mg->mg_virtual;
0cbee0a4
DM
417 switch (mg->mg_type) {
418 /* value magic types: don't copy */
419 case PERL_MAGIC_bm:
420 case PERL_MAGIC_fm:
421 case PERL_MAGIC_regex_global:
422 case PERL_MAGIC_nkeys:
423#ifdef USE_LOCALE_COLLATE
424 case PERL_MAGIC_collxfrm:
425#endif
426 case PERL_MAGIC_qr:
427 case PERL_MAGIC_taint:
428 case PERL_MAGIC_vec:
429 case PERL_MAGIC_vstring:
430 case PERL_MAGIC_utf8:
431 case PERL_MAGIC_substr:
432 case PERL_MAGIC_defelem:
433 case PERL_MAGIC_arylen:
434 case PERL_MAGIC_pos:
435 case PERL_MAGIC_backref:
436 case PERL_MAGIC_arylen_p:
437 case PERL_MAGIC_rhash:
438 case PERL_MAGIC_symtab:
439 continue;
440 }
441
a5063e7c
DM
442 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
443 (void)CALL_FPTR(vtbl->svt_local)(aTHX_ nsv, mg);
444 else
0cbee0a4
DM
445 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
446 mg->mg_ptr, mg->mg_len);
a5063e7c 447
0cbee0a4
DM
448 /* container types should remain read-only across localization */
449 SvFLAGS(nsv) |= SvREADONLY(sv);
450 }
451
452 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
453 SvFLAGS(nsv) |= SvMAGICAL(sv);
454 PL_localizing = 1;
455 SvSETMAGIC(nsv);
456 PL_localizing = 0;
457 }
458}
459
460/*
954c1994
GS
461=for apidoc mg_free
462
463Free any magic storage used by the SV. See C<sv_magic>.
464
465=cut
466*/
467
79072805 468int
864dbfa3 469Perl_mg_free(pTHX_ SV *sv)
79072805
LW
470{
471 MAGIC* mg;
472 MAGIC* moremagic;
473 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
35a4481c 474 const MGVTBL* const vtbl = mg->mg_virtual;
79072805 475 moremagic = mg->mg_moremagic;
2b260de0 476 if (vtbl && vtbl->svt_free)
fc0dc3b3 477 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 478 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
979acdb5 479 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
88e89b8a 480 Safefree(mg->mg_ptr);
565764a8 481 else if (mg->mg_len == HEf_SVKEY)
88e89b8a 482 SvREFCNT_dec((SV*)mg->mg_ptr);
d460ef45 483 }
b881518d
JH
484 if (mg->mg_flags & MGf_REFCOUNTED)
485 SvREFCNT_dec(mg->mg_obj);
79072805
LW
486 Safefree(mg);
487 }
b162af07 488 SvMAGIC_set(sv, NULL);
79072805
LW
489 return 0;
490}
491
79072805 492#include <signal.h>
79072805 493
942e002e 494U32
864dbfa3 495Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
6cef1e77 496{
97aff369 497 dVAR;
8772537c 498 PERL_UNUSED_ARG(sv);
6cef1e77 499
0bd48802
AL
500 if (PL_curpm) {
501 register const REGEXP * const rx = PM_GETRE(PL_curpm);
502 if (rx) {
a678b0e4
YO
503 if (mg->mg_obj) { /* @+ */
504 /* return the number possible */
505 return rx->nparens;
506 } else { /* @- */
507 I32 paren = rx->lastparen;
508
509 /* return the last filled */
f46c4081
RGS
510 while ( paren >= 0
511 && (rx->startp[paren] == -1 || rx->endp[paren] == -1) )
512 paren--;
a678b0e4
YO
513 return (U32)paren;
514 }
0bd48802 515 }
8f580fb8 516 }
ac27b0f5 517
942e002e 518 return (U32)-1;
6cef1e77
IZ
519}
520
521int
864dbfa3 522Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
6cef1e77 523{
97aff369 524 dVAR;
0bd48802
AL
525 if (PL_curpm) {
526 register const REGEXP * const rx = PM_GETRE(PL_curpm);
527 if (rx) {
528 register const I32 paren = mg->mg_len;
529 register I32 s;
530 register I32 t;
531 if (paren < 0)
532 return 0;
533 if (paren <= (I32)rx->nparens &&
534 (s = rx->startp[paren]) != -1 &&
535 (t = rx->endp[paren]) != -1)
536 {
537 register I32 i;
538 if (mg->mg_obj) /* @+ */
539 i = t;
540 else /* @- */
541 i = s;
542
543 if (i > 0 && RX_MATCH_UTF8(rx)) {
544 const char * const b = rx->subbeg;
545 if (b)
f5a63d97 546 i = utf8_length((U8*)b, (U8*)(b+i));
0bd48802 547 }
727405f8 548
0bd48802 549 sv_setiv(sv, i);
1aa99e6b 550 }
0bd48802 551 }
6cef1e77
IZ
552 }
553 return 0;
554}
555
e4b89193 556int
a29d06ed
MG
557Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
558{
d4c19fe8
AL
559 PERL_UNUSED_ARG(sv);
560 PERL_UNUSED_ARG(mg);
a29d06ed 561 Perl_croak(aTHX_ PL_no_modify);
0dbb1585 562 NORETURN_FUNCTION_END;
a29d06ed
MG
563}
564
93a17b20 565U32
864dbfa3 566Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
93a17b20 567{
97aff369 568 dVAR;
93a17b20 569 register I32 paren;
93a17b20 570 register I32 i;
dd374669 571 register const REGEXP *rx;
a197cbdd 572 I32 s1, t1;
93a17b20
LW
573
574 switch (*mg->mg_ptr) {
575 case '1': case '2': case '3': case '4':
576 case '5': case '6': case '7': case '8': case '9': case '&':
aaa362c4 577 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
cf93c79d 578
ffc61ed2 579 paren = atoi(mg->mg_ptr); /* $& is in [0] */
93a17b20 580 getparen:
eb160463 581 if (paren <= (I32)rx->nparens &&
cf93c79d
IZ
582 (s1 = rx->startp[paren]) != -1 &&
583 (t1 = rx->endp[paren]) != -1)
bbce6d69 584 {
cf93c79d 585 i = t1 - s1;
a197cbdd 586 getlen:
a30b2f1f 587 if (i > 0 && RX_MATCH_UTF8(rx)) {
a28509cc 588 const char * const s = rx->subbeg + s1;
768c67ee
JH
589 const U8 *ep;
590 STRLEN el;
ffc61ed2 591
6d5fa195 592 i = t1 - s1;
768c67ee
JH
593 if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
594 i = el;
a197cbdd 595 }
ffc61ed2 596 if (i < 0)
0844c848 597 Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
ffc61ed2 598 return i;
93a17b20 599 }
235bddc8
NIS
600 else {
601 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 602 report_uninit(sv);
235bddc8
NIS
603 }
604 }
605 else {
606 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 607 report_uninit(sv);
93a17b20 608 }
748a9306 609 return 0;
93a17b20 610 case '+':
aaa362c4 611 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
d9f97599 612 paren = rx->lastparen;
13f57bf8
CS
613 if (paren)
614 goto getparen;
93a17b20 615 }
748a9306 616 return 0;
a01268b5
JH
617 case '\016': /* ^N */
618 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
619 paren = rx->lastcloseparen;
620 if (paren)
621 goto getparen;
622 }
623 return 0;
93a17b20 624 case '`':
aaa362c4 625 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
cf93c79d
IZ
626 if (rx->startp[0] != -1) {
627 i = rx->startp[0];
a197cbdd
GS
628 if (i > 0) {
629 s1 = 0;
630 t1 = i;
631 goto getlen;
632 }
93a17b20 633 }
93a17b20 634 }
748a9306 635 return 0;
93a17b20 636 case '\'':
aaa362c4 637 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
cf93c79d
IZ
638 if (rx->endp[0] != -1) {
639 i = rx->sublen - rx->endp[0];
a197cbdd
GS
640 if (i > 0) {
641 s1 = rx->endp[0];
642 t1 = rx->sublen;
643 goto getlen;
644 }
93a17b20 645 }
93a17b20 646 }
748a9306 647 return 0;
93a17b20
LW
648 }
649 magic_get(sv,mg);
2d8e6c8d 650 if (!SvPOK(sv) && SvNIOK(sv)) {
8b6b16e7 651 sv_2pv(sv, 0);
2d8e6c8d 652 }
93a17b20
LW
653 if (SvPOK(sv))
654 return SvCUR(sv);
655 return 0;
656}
657
ad3296c6 658#define SvRTRIM(sv) STMT_START { \
eae92ea0
GA
659 if (SvPOK(sv)) { \
660 STRLEN len = SvCUR(sv); \
661 char * const p = SvPVX(sv); \
8e6b4db6
PC
662 while (len > 0 && isSPACE(p[len-1])) \
663 --len; \
664 SvCUR_set(sv, len); \
665 p[len] = '\0'; \
666 } \
ad3296c6
SH
667} STMT_END
668
79072805 669int
864dbfa3 670Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
79072805 671{
27da23d5 672 dVAR;
79072805 673 register I32 paren;
35272f84 674 register char *s = NULL;
d9f97599 675 register REGEXP *rx;
823a54a3
AL
676 const char * const remaining = mg->mg_ptr + 1;
677 const char nextchar = *remaining;
79072805
LW
678
679 switch (*mg->mg_ptr) {
748a9306 680 case '\001': /* ^A */
3280af22 681 sv_setsv(sv, PL_bodytarget);
748a9306 682 break;
e5218da5 683 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
823a54a3 684 if (nextchar == '\0') {
e5218da5
GA
685 sv_setiv(sv, (IV)PL_minus_c);
686 }
823a54a3 687 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
e5218da5
GA
688 sv_setiv(sv, (IV)STATUS_NATIVE);
689 }
49460fe6
NIS
690 break;
691
79072805 692 case '\004': /* ^D */
aea4f609 693 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
79072805 694 break;
28f23441 695 case '\005': /* ^E */
823a54a3 696 if (nextchar == '\0') {
4b645107 697#if defined(MACOS_TRADITIONAL)
0a378802
JH
698 {
699 char msg[256];
727405f8 700
0a378802 701 sv_setnv(sv,(double)gMacPerl_OSErr);
727405f8 702 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
0a378802 703 }
4b645107 704#elif defined(VMS)
0a378802
JH
705 {
706# include <descrip.h>
707# include <starlet.h>
708 char msg[255];
709 $DESCRIPTOR(msgdsc,msg);
710 sv_setnv(sv,(NV) vaxc$errno);
711 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
712 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
713 else
c69006e4 714 sv_setpvn(sv,"",0);
0a378802 715 }
4b645107 716#elif defined(OS2)
0a378802
JH
717 if (!(_emx_env & 0x200)) { /* Under DOS */
718 sv_setnv(sv, (NV)errno);
719 sv_setpv(sv, errno ? Strerror(errno) : "");
720 } else {
721 if (errno != errno_isOS2) {
823a54a3 722 const int tmp = _syserrno();
0a378802
JH
723 if (tmp) /* 2nd call to _syserrno() makes it 0 */
724 Perl_rc = tmp;
725 }
726 sv_setnv(sv, (NV)Perl_rc);
727 sv_setpv(sv, os2error(Perl_rc));
728 }
4b645107 729#elif defined(WIN32)
0a378802 730 {
d4c19fe8 731 const DWORD dwErr = GetLastError();
0a378802 732 sv_setnv(sv, (NV)dwErr);
823a54a3 733 if (dwErr) {
0a378802
JH
734 PerlProc_GetOSError(sv, dwErr);
735 }
736 else
c69006e4 737 sv_setpvn(sv, "", 0);
0a378802
JH
738 SetLastError(dwErr);
739 }
22fae026 740#else
f6c8f21d 741 {
8772537c 742 const int saveerrno = errno;
f6c8f21d 743 sv_setnv(sv, (NV)errno);
666ea192 744 sv_setpv(sv, errno ? Strerror(errno) : "");
f6c8f21d
RGS
745 errno = saveerrno;
746 }
28f23441 747#endif
ad3296c6 748 SvRTRIM(sv);
0a378802
JH
749 SvNOK_on(sv); /* what a wonderful hack! */
750 }
823a54a3 751 else if (strEQ(remaining, "NCODING"))
0a378802
JH
752 sv_setsv(sv, PL_encoding);
753 break;
79072805 754 case '\006': /* ^F */
3280af22 755 sv_setiv(sv, (IV)PL_maxsysfd);
79072805 756 break;
a0d0e21e 757 case '\010': /* ^H */
3280af22 758 sv_setiv(sv, (IV)PL_hints);
a0d0e21e 759 break;
9d116dd7 760 case '\011': /* ^I */ /* NOT \t in EBCDIC */
3280af22
NIS
761 if (PL_inplace)
762 sv_setpv(sv, PL_inplace);
79072805 763 else
3280af22 764 sv_setsv(sv, &PL_sv_undef);
79072805 765 break;
ac27b0f5 766 case '\017': /* ^O & ^OPEN */
823a54a3 767 if (nextchar == '\0') {
ac27b0f5 768 sv_setpv(sv, PL_osname);
3511154c
DM
769 SvTAINTED_off(sv);
770 }
823a54a3 771 else if (strEQ(remaining, "PEN")) {
11bcd5da 772 if (!(CopHINTS_get(&PL_compiling) & HINT_LEXICAL_IO))
ac27b0f5
NIS
773 sv_setsv(sv, &PL_sv_undef);
774 else {
11bcd5da
NC
775 sv_setsv(sv,
776 Perl_refcounted_he_fetch(aTHX_
777 PL_compiling.cop_hints_hash,
778 0, "open", 4, 0, 0));
ac27b0f5
NIS
779 }
780 }
28f23441 781 break;
79072805 782 case '\020': /* ^P */
3280af22 783 sv_setiv(sv, (IV)PL_perldb);
79072805 784 break;
fb73857a 785 case '\023': /* ^S */
823a54a3 786 if (nextchar == '\0') {
3280af22 787 if (PL_lex_state != LEX_NOTPARSING)
0c34ef67 788 SvOK_off(sv);
3280af22 789 else if (PL_in_eval)
6dc8a9e4 790 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
a4268c0a
AMS
791 else
792 sv_setiv(sv, 0);
d58bf5aa 793 }
fb73857a 794 break;
79072805 795 case '\024': /* ^T */
823a54a3 796 if (nextchar == '\0') {
88e89b8a 797#ifdef BIG_TIME
7c36658b 798 sv_setnv(sv, PL_basetime);
88e89b8a 799#else
7c36658b 800 sv_setiv(sv, (IV)PL_basetime);
88e89b8a 801#endif
7c36658b 802 }
823a54a3 803 else if (strEQ(remaining, "AINT"))
9aa05f58
RGS
804 sv_setiv(sv, PL_tainting
805 ? (PL_taint_warn || PL_unsafe ? -1 : 1)
806 : 0);
7c36658b 807 break;
e07ea26a 808 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
823a54a3 809 if (strEQ(remaining, "NICODE"))
a05d7ebb 810 sv_setuv(sv, (UV) PL_unicode);
823a54a3 811 else if (strEQ(remaining, "TF8LOCALE"))
7cebcbc0 812 sv_setuv(sv, (UV) PL_utf8locale);
e07ea26a
NC
813 else if (strEQ(remaining, "TF8CACHE"))
814 sv_setiv(sv, (IV) PL_utf8cache);
fde18df1
JH
815 break;
816 case '\027': /* ^W & $^WARNING_BITS */
823a54a3 817 if (nextchar == '\0')
4438c4b7 818 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
823a54a3 819 else if (strEQ(remaining, "ARNING_BITS")) {
013b78e8 820 if (PL_compiling.cop_warnings == pWARN_NONE) {
4438c4b7 821 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
013b78e8
RGS
822 }
823 else if (PL_compiling.cop_warnings == pWARN_STD) {
666ea192
JH
824 sv_setpvn(
825 sv,
826 (PL_dowarn & G_WARN_ON) ? WARN_ALLstring : WARN_NONEstring,
827 WARNsize
828 );
013b78e8 829 }
d3a7d8c7 830 else if (PL_compiling.cop_warnings == pWARN_ALL) {
75b6c4ca
RGS
831 /* Get the bit mask for $warnings::Bits{all}, because
832 * it could have been extended by warnings::register */
823a54a3 833 HV * const bits=get_hv("warnings::Bits", FALSE);
f5a63d97
AL
834 if (bits) {
835 SV ** const bits_all = hv_fetchs(bits, "all", FALSE);
836 if (bits_all)
837 sv_setsv(sv, *bits_all);
75b6c4ca
RGS
838 }
839 else {
840 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
841 }
ac27b0f5 842 }
4438c4b7 843 else {
72dc9ed5
NC
844 sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
845 *PL_compiling.cop_warnings);
ac27b0f5 846 }
d3a7d8c7 847 SvPOK_only(sv);
4438c4b7 848 }
79072805
LW
849 break;
850 case '1': case '2': case '3': case '4':
851 case '5': case '6': case '7': case '8': case '9': case '&':
aaa362c4 852 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
a863c7d1
MB
853 /*
854 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
855 * XXX Does the new way break anything?
856 */
ffc61ed2 857 paren = atoi(mg->mg_ptr); /* $& is in [0] */
44a2ac75
YO
858 reg_numbered_buff_get( paren, rx, sv, 0);
859 break;
79072805 860 }
3280af22 861 sv_setsv(sv,&PL_sv_undef);
79072805
LW
862 break;
863 case '+':
aaa362c4 864 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
44a2ac75
YO
865 if (rx->lastparen) {
866 reg_numbered_buff_get( rx->lastparen, rx, sv, 0);
867 break;
868 }
79072805 869 }
3280af22 870 sv_setsv(sv,&PL_sv_undef);
79072805 871 break;
a01268b5
JH
872 case '\016': /* ^N */
873 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
44a2ac75
YO
874 if (rx->lastcloseparen) {
875 reg_numbered_buff_get( rx->lastcloseparen, rx, sv, 0);
876 break;
877 }
878
a01268b5
JH
879 }
880 sv_setsv(sv,&PL_sv_undef);
881 break;
79072805 882 case '`':
aaa362c4 883 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
44a2ac75
YO
884 reg_numbered_buff_get( -2, rx, sv, 0);
885 break;
79072805 886 }
3280af22 887 sv_setsv(sv,&PL_sv_undef);
79072805
LW
888 break;
889 case '\'':
aaa362c4 890 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
44a2ac75
YO
891 reg_numbered_buff_get( -1, rx, sv, 0);
892 break;
79072805 893 }
3280af22 894 sv_setsv(sv,&PL_sv_undef);
79072805
LW
895 break;
896 case '.':
3280af22 897 if (GvIO(PL_last_in_gv)) {
357c8808 898 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
79072805 899 }
79072805
LW
900 break;
901 case '?':
809a5acc 902 {
809a5acc 903 sv_setiv(sv, (IV)STATUS_CURRENT);
ff0cee69 904#ifdef COMPLEX_STATUS
6b88bc9c
GS
905 LvTARGOFF(sv) = PL_statusvalue;
906 LvTARGLEN(sv) = PL_statusvalue_vms;
ff0cee69 907#endif
809a5acc 908 }
79072805
LW
909 break;
910 case '^':
0daa599b
RGS
911 if (GvIOp(PL_defoutgv))
912 s = IoTOP_NAME(GvIOp(PL_defoutgv));
79072805
LW
913 if (s)
914 sv_setpv(sv,s);
915 else {
3280af22 916 sv_setpv(sv,GvENAME(PL_defoutgv));
79072805
LW
917 sv_catpv(sv,"_TOP");
918 }
919 break;
920 case '~':
0daa599b
RGS
921 if (GvIOp(PL_defoutgv))
922 s = IoFMT_NAME(GvIOp(PL_defoutgv));
79072805 923 if (!s)
3280af22 924 s = GvENAME(PL_defoutgv);
79072805
LW
925 sv_setpv(sv,s);
926 break;
79072805 927 case '=':
0daa599b
RGS
928 if (GvIOp(PL_defoutgv))
929 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
79072805
LW
930 break;
931 case '-':
0daa599b
RGS
932 if (GvIOp(PL_defoutgv))
933 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
79072805
LW
934 break;
935 case '%':
0daa599b
RGS
936 if (GvIOp(PL_defoutgv))
937 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
79072805 938 break;
79072805
LW
939 case ':':
940 break;
941 case '/':
942 break;
943 case '[':
11206fdd 944 sv_setiv(sv, (IV)CopARYBASE_get(PL_curcop));
79072805
LW
945 break;
946 case '|':
0daa599b
RGS
947 if (GvIOp(PL_defoutgv))
948 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
79072805
LW
949 break;
950 case ',':
79072805
LW
951 break;
952 case '\\':
b2ce0fda 953 if (PL_ors_sv)
f28098ff 954 sv_copypv(sv, PL_ors_sv);
79072805 955 break;
79072805 956 case '!':
a5f75d66 957#ifdef VMS
65202027 958 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
88e89b8a 959 sv_setpv(sv, errno ? Strerror(errno) : "");
a5f75d66 960#else
88e89b8a 961 {
8772537c 962 const int saveerrno = errno;
65202027 963 sv_setnv(sv, (NV)errno);
88e89b8a 964#ifdef OS2
ed344e4f
IZ
965 if (errno == errno_isOS2 || errno == errno_isOS2_set)
966 sv_setpv(sv, os2error(Perl_rc));
88e89b8a 967 else
a5f75d66 968#endif
666ea192 969 sv_setpv(sv, errno ? Strerror(errno) : "");
88e89b8a 970 errno = saveerrno;
971 }
972#endif
ad3296c6 973 SvRTRIM(sv);
946ec16e 974 SvNOK_on(sv); /* what a wonderful hack! */
79072805
LW
975 break;
976 case '<':
3280af22 977 sv_setiv(sv, (IV)PL_uid);
79072805
LW
978 break;
979 case '>':
3280af22 980 sv_setiv(sv, (IV)PL_euid);
79072805
LW
981 break;
982 case '(':
3280af22 983 sv_setiv(sv, (IV)PL_gid);
79072805
LW
984 goto add_groups;
985 case ')':
3280af22 986 sv_setiv(sv, (IV)PL_egid);
79072805 987 add_groups:
79072805 988#ifdef HAS_GETGROUPS
79072805 989 {
57d7c65e 990 Groups_t *gary = NULL;
fb45abb2 991 I32 i, num_groups = getgroups(0, gary);
57d7c65e
JC
992 Newx(gary, num_groups, Groups_t);
993 num_groups = getgroups(num_groups, gary);
fb45abb2
GA
994 for (i = 0; i < num_groups; i++)
995 Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]);
57d7c65e 996 Safefree(gary);
79072805 997 }
155aba94 998 (void)SvIOK_on(sv); /* what a wonderful hack! */
cd70abae 999#endif
79072805 1000 break;
cd39f2b6 1001#ifndef MACOS_TRADITIONAL
79072805
LW
1002 case '0':
1003 break;
cd39f2b6 1004#endif
79072805 1005 }
a0d0e21e 1006 return 0;
79072805
LW
1007}
1008
1009int
864dbfa3 1010Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
79072805 1011{
8772537c 1012 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
79072805
LW
1013
1014 if (uf && uf->uf_val)
24f81a43 1015 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
79072805
LW
1016 return 0;
1017}
1018
1019int
864dbfa3 1020Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
79072805 1021{
27da23d5 1022 dVAR;
9ae3433d 1023 STRLEN len = 0, klen;
666ea192 1024 const char *s = SvOK(sv) ? SvPV_const(sv,len) : "";
fabdb6c0 1025 const char * const ptr = MgPV_const(mg,klen);
88e89b8a 1026 my_setenv(ptr, s);
1e422769 1027
a0d0e21e
LW
1028#ifdef DYNAMIC_ENV_FETCH
1029 /* We just undefd an environment var. Is a replacement */
1030 /* waiting in the wings? */
1031 if (!len) {
fabdb6c0
AL
1032 SV ** const valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE);
1033 if (valp)
4ab59fcc 1034 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
a0d0e21e
LW
1035 }
1036#endif
1e422769 1037
39e571d4 1038#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
79072805
LW
1039 /* And you'll never guess what the dog had */
1040 /* in its mouth... */
3280af22 1041 if (PL_tainting) {
1e422769 1042 MgTAINTEDDIR_off(mg);
1043#ifdef VMS
5aabfad6 1044 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
b8ffc8df 1045 char pathbuf[256], eltbuf[256], *cp, *elt;
c623ac67 1046 Stat_t sbuf;
1e422769 1047 int i = 0, j = 0;
1048
6fca0082 1049 my_strlcpy(eltbuf, s, sizeof(eltbuf));
b8ffc8df 1050 elt = eltbuf;
1e422769 1051 do { /* DCL$PATH may be a search list */
1052 while (1) { /* as may dev portion of any element */
1053 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1054 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1055 cando_by_name(S_IWUSR,0,elt) ) {
1056 MgTAINTEDDIR_on(mg);
1057 return 0;
1058 }
1059 }
bd61b366 1060 if ((cp = strchr(elt, ':')) != NULL)
1e422769 1061 *cp = '\0';
1062 if (my_trnlnm(elt, eltbuf, j++))
1063 elt = eltbuf;
1064 else
1065 break;
1066 }
1067 j = 0;
1068 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1069 }
1070#endif /* VMS */
5aabfad6 1071 if (s && klen == 4 && strEQ(ptr,"PATH")) {
8772537c 1072 const char * const strend = s + len;
463ee0b2
LW
1073
1074 while (s < strend) {
96827780 1075 char tmpbuf[256];
c623ac67 1076 Stat_t st;
5f74f29c 1077 I32 i;
f5a63d97
AL
1078#ifdef VMS /* Hmm. How do we get $Config{path_sep} from C? */
1079 const char path_sep = '|';
1080#else
1081 const char path_sep = ':';
1082#endif
96827780 1083 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
427eaa01 1084 s, strend, path_sep, &i);
463ee0b2 1085 s++;
bb7a0f54 1086 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
326b5008
CB
1087#ifdef VMS
1088 || !strchr(tmpbuf, ':') /* no colon thus no device name -- assume relative path */
1089#else
1090 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1091#endif
c6ed36e1 1092 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
8990e307 1093 MgTAINTEDDIR_on(mg);
1e422769 1094 return 0;
1095 }
463ee0b2 1096 }
79072805
LW
1097 }
1098 }
39e571d4 1099#endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1e422769 1100
79072805
LW
1101 return 0;
1102}
1103
1104int
864dbfa3 1105Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
85e6fe83 1106{
8772537c 1107 PERL_UNUSED_ARG(sv);
bd61b366 1108 my_setenv(MgPV_nolen_const(mg),NULL);
85e6fe83
LW
1109 return 0;
1110}
1111
88e89b8a 1112int
864dbfa3 1113Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
fb73857a 1114{
97aff369 1115 dVAR;
65e66c80 1116 PERL_UNUSED_ARG(mg);
b0269e46 1117#if defined(VMS)
cea2e8a9 1118 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
fb73857a 1119#else
3280af22 1120 if (PL_localizing) {
fb73857a 1121 HE* entry;
b0269e46 1122 my_clearenv();
fb73857a 1123 hv_iterinit((HV*)sv);
155aba94 1124 while ((entry = hv_iternext((HV*)sv))) {
fb73857a 1125 I32 keylen;
1126 my_setenv(hv_iterkey(entry, &keylen),
b83604b4 1127 SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
fb73857a 1128 }
1129 }
1130#endif
1131 return 0;
1132}
1133
1134int
864dbfa3 1135Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
66b1d557 1136{
27da23d5 1137 dVAR;
8772537c
AL
1138 PERL_UNUSED_ARG(sv);
1139 PERL_UNUSED_ARG(mg);
b0269e46
AB
1140#if defined(VMS)
1141 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1142#else
1143 my_clearenv();
1144#endif
3e3baf6d 1145 return 0;
66b1d557
HM
1146}
1147
64ca3a65 1148#ifndef PERL_MICRO
2d4fcd5e
AJ
1149#ifdef HAS_SIGPROCMASK
1150static void
1151restore_sigmask(pTHX_ SV *save_sv)
1152{
0bd48802 1153 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
f5a63d97 1154 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
2d4fcd5e
AJ
1155}
1156#endif
66b1d557 1157int
864dbfa3 1158Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 1159{
97aff369 1160 dVAR;
88e89b8a 1161 /* Are we fetching a signal entry? */
8772537c 1162 const I32 i = whichsig(MgPV_nolen_const(mg));
e02bfb16 1163 if (i > 0) {
22c35a8c
GS
1164 if(PL_psig_ptr[i])
1165 sv_setsv(sv,PL_psig_ptr[i]);
88e89b8a 1166 else {
46da273f 1167 Sighandler_t sigstate = rsignal_state(i);
23ada85b 1168#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
46da273f
AL
1169 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1170 sigstate = SIG_IGN;
2e34cc90
CL
1171#endif
1172#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
46da273f
AL
1173 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1174 sigstate = SIG_DFL;
85b332e2 1175#endif
88e89b8a 1176 /* cache state so we don't fetch it again */
8aad04aa 1177 if(sigstate == (Sighandler_t) SIG_IGN)
88e89b8a 1178 sv_setpv(sv,"IGNORE");
1179 else
3280af22 1180 sv_setsv(sv,&PL_sv_undef);
46da273f 1181 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
88e89b8a 1182 SvTEMP_off(sv);
1183 }
1184 }
1185 return 0;
1186}
1187int
864dbfa3 1188Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 1189{
2d4fcd5e
AJ
1190 /* XXX Some of this code was copied from Perl_magic_setsig. A little
1191 * refactoring might be in order.
1192 */
27da23d5 1193 dVAR;
8772537c
AL
1194 register const char * const s = MgPV_nolen_const(mg);
1195 PERL_UNUSED_ARG(sv);
2d4fcd5e 1196 if (*s == '_') {
cbbf8932 1197 SV** svp = NULL;
2d4fcd5e
AJ
1198 if (strEQ(s,"__DIE__"))
1199 svp = &PL_diehook;
b274dc4e 1200 else if (strEQ(s,"__WARN__") && PL_warnhook != PERL_WARNHOOK_FATAL)
2d4fcd5e 1201 svp = &PL_warnhook;
27da23d5 1202 if (svp && *svp) {
b274dc4e 1203 SV *const to_dec = *svp;
cbbf8932 1204 *svp = NULL;
b274dc4e 1205 SvREFCNT_dec(to_dec);
2d4fcd5e
AJ
1206 }
1207 }
1208 else {
2d4fcd5e 1209 /* Are we clearing a signal entry? */
8772537c 1210 const I32 i = whichsig(s);
e02bfb16 1211 if (i > 0) {
2d4fcd5e
AJ
1212#ifdef HAS_SIGPROCMASK
1213 sigset_t set, save;
1214 SV* save_sv;
1215 /* Avoid having the signal arrive at a bad time, if possible. */
1216 sigemptyset(&set);
1217 sigaddset(&set,i);
1218 sigprocmask(SIG_BLOCK, &set, &save);
1219 ENTER;
1220 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1221 SAVEFREESV(save_sv);
1222 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1223#endif
1224 PERL_ASYNC_CHECK();
1225#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
27da23d5 1226 if (!PL_sig_handlers_initted) Perl_csighandler_init();
2d4fcd5e
AJ
1227#endif
1228#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1229 PL_sig_defaulting[i] = 1;
5c1546dc 1230 (void)rsignal(i, PL_csighandlerp);
2d4fcd5e 1231#else
8aad04aa 1232 (void)rsignal(i, (Sighandler_t) SIG_DFL);
2d4fcd5e
AJ
1233#endif
1234 if(PL_psig_name[i]) {
1235 SvREFCNT_dec(PL_psig_name[i]);
1236 PL_psig_name[i]=0;
1237 }
1238 if(PL_psig_ptr[i]) {
6136c704 1239 SV * const to_dec=PL_psig_ptr[i];
2d4fcd5e
AJ
1240 PL_psig_ptr[i]=0;
1241 LEAVE;
1242 SvREFCNT_dec(to_dec);
1243 }
1244 else
1245 LEAVE;
1246 }
88e89b8a 1247 }
1248 return 0;
1249}
3d37d572 1250
2563cec5
IZ
1251#ifndef SIG_PENDING_DIE_COUNT
1252# define SIG_PENDING_DIE_COUNT 120
1253#endif
1254
dd374669
AL
1255static void
1256S_raise_signal(pTHX_ int sig)
0a8e0eff 1257{
97aff369 1258 dVAR;
0a8e0eff
NIS
1259 /* Set a flag to say this signal is pending */
1260 PL_psig_pend[sig]++;
1261 /* And one to say _a_ signal is pending */
2563cec5
IZ
1262 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1263 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1264 (unsigned long)SIG_PENDING_DIE_COUNT);
0a8e0eff
NIS
1265}
1266
1267Signal_t
8aad04aa
JH
1268#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1269Perl_csighandler(int sig, ...)
1270#else
0a8e0eff 1271Perl_csighandler(int sig)
8aad04aa 1272#endif
0a8e0eff 1273{
1018e26f
NIS
1274#ifdef PERL_GET_SIG_CONTEXT
1275 dTHXa(PERL_GET_SIG_CONTEXT);
1276#else
85b332e2
CL
1277 dTHX;
1278#endif
23ada85b 1279#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
5c1546dc 1280 (void) rsignal(sig, PL_csighandlerp);
27da23d5 1281 if (PL_sig_ignoring[sig]) return;
85b332e2 1282#endif
2e34cc90 1283#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1284 if (PL_sig_defaulting[sig])
2e34cc90
CL
1285#ifdef KILL_BY_SIGPRC
1286 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1287#else
1288 exit(1);
1289#endif
1290#endif
853d2c32
RGS
1291 if (
1292#ifdef SIGILL
1293 sig == SIGILL ||
1294#endif
1295#ifdef SIGBUS
1296 sig == SIGBUS ||
1297#endif
1298#ifdef SIGSEGV
1299 sig == SIGSEGV ||
1300#endif
1301 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
4ffa73a3
JH
1302 /* Call the perl level handler now--
1303 * with risk we may be in malloc() etc. */
1304 (*PL_sighandlerp)(sig);
1305 else
dd374669 1306 S_raise_signal(aTHX_ sig);
0a8e0eff
NIS
1307}
1308
2e34cc90
CL
1309#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1310void
1311Perl_csighandler_init(void)
1312{
1313 int sig;
27da23d5 1314 if (PL_sig_handlers_initted) return;
2e34cc90
CL
1315
1316 for (sig = 1; sig < SIG_SIZE; sig++) {
1317#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
218fdd94 1318 dTHX;
27da23d5 1319 PL_sig_defaulting[sig] = 1;
5c1546dc 1320 (void) rsignal(sig, PL_csighandlerp);
2e34cc90
CL
1321#endif
1322#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1323 PL_sig_ignoring[sig] = 0;
2e34cc90
CL
1324#endif
1325 }
27da23d5 1326 PL_sig_handlers_initted = 1;
2e34cc90
CL
1327}
1328#endif
1329
0a8e0eff
NIS
1330void
1331Perl_despatch_signals(pTHX)
1332{
97aff369 1333 dVAR;
0a8e0eff
NIS
1334 int sig;
1335 PL_sig_pending = 0;
1336 for (sig = 1; sig < SIG_SIZE; sig++) {
1337 if (PL_psig_pend[sig]) {
25da4428
JH
1338 PERL_BLOCKSIG_ADD(set, sig);
1339 PL_psig_pend[sig] = 0;
1340 PERL_BLOCKSIG_BLOCK(set);
f5203343 1341 (*PL_sighandlerp)(sig);
25da4428 1342 PERL_BLOCKSIG_UNBLOCK(set);
0a8e0eff
NIS
1343 }
1344 }
1345}
1346
85e6fe83 1347int
864dbfa3 1348Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
79072805 1349{
27da23d5 1350 dVAR;
79072805 1351 I32 i;
cbbf8932 1352 SV** svp = NULL;
2d4fcd5e
AJ
1353 /* Need to be careful with SvREFCNT_dec(), because that can have side
1354 * effects (due to closures). We must make sure that the new disposition
1355 * is in place before it is called.
1356 */
cbbf8932 1357 SV* to_dec = NULL;
e72dc28c 1358 STRLEN len;
2d4fcd5e
AJ
1359#ifdef HAS_SIGPROCMASK
1360 sigset_t set, save;
1361 SV* save_sv;
1362#endif
a0d0e21e 1363
d5263905 1364 register const char *s = MgPV_const(mg,len);
748a9306
LW
1365 if (*s == '_') {
1366 if (strEQ(s,"__DIE__"))
3280af22 1367 svp = &PL_diehook;
748a9306 1368 else if (strEQ(s,"__WARN__"))
3280af22 1369 svp = &PL_warnhook;
748a9306 1370 else
cea2e8a9 1371 Perl_croak(aTHX_ "No such hook: %s", s);
748a9306 1372 i = 0;
4633a7c4 1373 if (*svp) {
9289f461
RGS
1374 if (*svp != PERL_WARNHOOK_FATAL)
1375 to_dec = *svp;
cbbf8932 1376 *svp = NULL;
4633a7c4 1377 }
748a9306
LW
1378 }
1379 else {
1380 i = whichsig(s); /* ...no, a brick */
86d86cad 1381 if (i <= 0) {
e476b1b5 1382 if (ckWARN(WARN_SIGNAL))
9014280d 1383 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
748a9306
LW
1384 return 0;
1385 }
2d4fcd5e
AJ
1386#ifdef HAS_SIGPROCMASK
1387 /* Avoid having the signal arrive at a bad time, if possible. */
1388 sigemptyset(&set);
1389 sigaddset(&set,i);
1390 sigprocmask(SIG_BLOCK, &set, &save);
1391 ENTER;
1392 save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1393 SAVEFREESV(save_sv);
1394 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1395#endif
1396 PERL_ASYNC_CHECK();
2e34cc90 1397#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
27da23d5 1398 if (!PL_sig_handlers_initted) Perl_csighandler_init();
2e34cc90 1399#endif
23ada85b 1400#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1401 PL_sig_ignoring[i] = 0;
85b332e2 1402#endif
2e34cc90 1403#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
27da23d5 1404 PL_sig_defaulting[i] = 0;
2e34cc90 1405#endif
22c35a8c 1406 SvREFCNT_dec(PL_psig_name[i]);
2d4fcd5e 1407 to_dec = PL_psig_ptr[i];
46da273f 1408 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
88e89b8a 1409 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
e72dc28c 1410 PL_psig_name[i] = newSVpvn(s, len);
22c35a8c 1411 SvREADONLY_on(PL_psig_name[i]);
748a9306 1412 }
a0d0e21e 1413 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
2d4fcd5e 1414 if (i) {
5c1546dc 1415 (void)rsignal(i, PL_csighandlerp);
2d4fcd5e
AJ
1416#ifdef HAS_SIGPROCMASK
1417 LEAVE;
1418#endif
1419 }
748a9306 1420 else
b37c2d43 1421 *svp = SvREFCNT_inc_simple_NN(sv);
2d4fcd5e
AJ
1422 if(to_dec)
1423 SvREFCNT_dec(to_dec);
a0d0e21e
LW
1424 return 0;
1425 }
baf38871 1426 s = SvOK(sv) ? SvPV_force(sv,len) : "DEFAULT";
748a9306 1427 if (strEQ(s,"IGNORE")) {
85b332e2 1428 if (i) {
23ada85b 1429#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
27da23d5 1430 PL_sig_ignoring[i] = 1;
5c1546dc 1431 (void)rsignal(i, PL_csighandlerp);
85b332e2 1432#else
8aad04aa 1433 (void)rsignal(i, (Sighandler_t) SIG_IGN);
85b332e2 1434#endif
2d4fcd5e 1435 }
748a9306
LW
1436 }
1437 else if (strEQ(s,"DEFAULT") || !*s) {
1438 if (i)
2e34cc90
CL
1439#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1440 {
27da23d5 1441 PL_sig_defaulting[i] = 1;
5c1546dc 1442 (void)rsignal(i, PL_csighandlerp);
2e34cc90
CL
1443 }
1444#else
8aad04aa 1445 (void)rsignal(i, (Sighandler_t) SIG_DFL);
2e34cc90 1446#endif
748a9306 1447 }
79072805 1448 else {
5aabfad6 1449 /*
1450 * We should warn if HINT_STRICT_REFS, but without
1451 * access to a known hint bit in a known OP, we can't
1452 * tell whether HINT_STRICT_REFS is in force or not.
1453 */
46fc3d4c 1454 if (!strchr(s,':') && !strchr(s,'\''))
89529cee 1455 Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"));
748a9306 1456 if (i)
5c1546dc 1457 (void)rsignal(i, PL_csighandlerp);
748a9306 1458 else
46da273f 1459 *svp = SvREFCNT_inc_simple_NN(sv);
79072805 1460 }
2d4fcd5e
AJ
1461#ifdef HAS_SIGPROCMASK
1462 if(i)
1463 LEAVE;
1464#endif
1465 if(to_dec)
1466 SvREFCNT_dec(to_dec);
79072805
LW
1467 return 0;
1468}
64ca3a65 1469#endif /* !PERL_MICRO */
79072805
LW
1470
1471int
864dbfa3 1472Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
79072805 1473{
97aff369 1474 dVAR;
8772537c
AL
1475 PERL_UNUSED_ARG(sv);
1476 PERL_UNUSED_ARG(mg);
3280af22 1477 PL_sub_generation++;
463ee0b2
LW
1478 return 0;
1479}
1480
1481int
864dbfa3 1482Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1483{
97aff369 1484 dVAR;
8772537c
AL
1485 PERL_UNUSED_ARG(sv);
1486 PERL_UNUSED_ARG(mg);
a0d0e21e 1487 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
3280af22 1488 PL_amagic_generation++;
463ee0b2 1489
a0d0e21e
LW
1490 return 0;
1491}
463ee0b2 1492
946ec16e 1493int
864dbfa3 1494Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
6ff81951 1495{
dd374669 1496 HV * const hv = (HV*)LvTARG(sv);
6ff81951 1497 I32 i = 0;
8772537c 1498 PERL_UNUSED_ARG(mg);
7719e241 1499
6ff81951 1500 if (hv) {
497b47a8
JH
1501 (void) hv_iterinit(hv);
1502 if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1503 i = HvKEYS(hv);
1504 else {
1505 while (hv_iternext(hv))
1506 i++;
1507 }
6ff81951
GS
1508 }
1509
1510 sv_setiv(sv, (IV)i);
1511 return 0;
1512}
1513
1514int
864dbfa3 1515Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
946ec16e 1516{
8772537c 1517 PERL_UNUSED_ARG(mg);
946ec16e 1518 if (LvTARG(sv)) {
1519 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
946ec16e 1520 }
1521 return 0;
ac27b0f5 1522}
946ec16e 1523
e336de0d 1524/* caller is responsible for stack switching/cleanup */
565764a8 1525STATIC int
e1ec3a88 1526S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val)
a0d0e21e 1527{
97aff369 1528 dVAR;
a0d0e21e 1529 dSP;
463ee0b2 1530
924508f0
GS
1531 PUSHMARK(SP);
1532 EXTEND(SP, n);
33c27489 1533 PUSHs(SvTIED_obj(sv, mg));
ac27b0f5 1534 if (n > 1) {
93965878 1535 if (mg->mg_ptr) {
565764a8 1536 if (mg->mg_len >= 0)
79cb57f6 1537 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
565764a8 1538 else if (mg->mg_len == HEf_SVKEY)
93965878
NIS
1539 PUSHs((SV*)mg->mg_ptr);
1540 }
14befaf4 1541 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
565764a8 1542 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
93965878
NIS
1543 }
1544 }
1545 if (n > 2) {
1546 PUSHs(val);
88e89b8a 1547 }
463ee0b2
LW
1548 PUTBACK;
1549
864dbfa3 1550 return call_method(meth, flags);
946ec16e 1551}
1552
76e3520e 1553STATIC int
e1ec3a88 1554S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
a0d0e21e 1555{
27da23d5 1556 dVAR; dSP;
463ee0b2 1557
a0d0e21e
LW
1558 ENTER;
1559 SAVETMPS;
e788e7d3 1560 PUSHSTACKi(PERLSI_MAGIC);
463ee0b2 1561
33c27489 1562 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
3280af22 1563 sv_setsv(sv, *PL_stack_sp--);
93965878 1564 }
463ee0b2 1565
d3acc0f7 1566 POPSTACK;
a0d0e21e
LW
1567 FREETMPS;
1568 LEAVE;
1569 return 0;
1570}
463ee0b2 1571
a0d0e21e 1572int
864dbfa3 1573Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1574{
a0d0e21e
LW
1575 if (mg->mg_ptr)
1576 mg->mg_flags |= MGf_GSKIP;
58f82c5c 1577 magic_methpack(sv,mg,"FETCH");
463ee0b2
LW
1578 return 0;
1579}
1580
1581int
864dbfa3 1582Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
e336de0d 1583{
27da23d5 1584 dVAR; dSP;
a60c0954 1585 ENTER;
e788e7d3 1586 PUSHSTACKi(PERLSI_MAGIC);
33c27489 1587 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
d3acc0f7 1588 POPSTACK;
a60c0954 1589 LEAVE;
463ee0b2
LW
1590 return 0;
1591}
1592
1593int
864dbfa3 1594Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1595{
a0d0e21e
LW
1596 return magic_methpack(sv,mg,"DELETE");
1597}
463ee0b2 1598
93965878
NIS
1599
1600U32
864dbfa3 1601Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
ac27b0f5 1602{
27da23d5 1603 dVAR; dSP;
93965878
NIS
1604 U32 retval = 0;
1605
1606 ENTER;
1607 SAVETMPS;
e788e7d3 1608 PUSHSTACKi(PERLSI_MAGIC);
33c27489 1609 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
3280af22 1610 sv = *PL_stack_sp--;
a60c0954 1611 retval = (U32) SvIV(sv)-1;
93965878 1612 }
d3acc0f7 1613 POPSTACK;
93965878
NIS
1614 FREETMPS;
1615 LEAVE;
1616 return retval;
1617}
1618
cea2e8a9
GS
1619int
1620Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1621{
27da23d5 1622 dVAR; dSP;
463ee0b2 1623
e336de0d 1624 ENTER;
e788e7d3 1625 PUSHSTACKi(PERLSI_MAGIC);
924508f0 1626 PUSHMARK(SP);
33c27489 1627 XPUSHs(SvTIED_obj(sv, mg));
463ee0b2 1628 PUTBACK;
864dbfa3 1629 call_method("CLEAR", G_SCALAR|G_DISCARD);
d3acc0f7 1630 POPSTACK;
a60c0954 1631 LEAVE;
a3bcc51e 1632
463ee0b2
LW
1633 return 0;
1634}
1635
1636int
864dbfa3 1637Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
463ee0b2 1638{
27da23d5 1639 dVAR; dSP;
666ea192 1640 const char * const meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
463ee0b2
LW
1641
1642 ENTER;
a0d0e21e 1643 SAVETMPS;
e788e7d3 1644 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
1645 PUSHMARK(SP);
1646 EXTEND(SP, 2);
33c27489 1647 PUSHs(SvTIED_obj(sv, mg));
463ee0b2
LW
1648 if (SvOK(key))
1649 PUSHs(key);
1650 PUTBACK;
1651
864dbfa3 1652 if (call_method(meth, G_SCALAR))
3280af22 1653 sv_setsv(key, *PL_stack_sp--);
463ee0b2 1654
d3acc0f7 1655 POPSTACK;
a0d0e21e
LW
1656 FREETMPS;
1657 LEAVE;
79072805
LW
1658 return 0;
1659}
1660
1661int
1146e912 1662Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
a0d0e21e
LW
1663{
1664 return magic_methpack(sv,mg,"EXISTS");
ac27b0f5 1665}
a0d0e21e 1666
a3bcc51e
TP
1667SV *
1668Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
1669{
27da23d5 1670 dVAR; dSP;
5fcbf73d 1671 SV *retval;
8772537c
AL
1672 SV * const tied = SvTIED_obj((SV*)hv, mg);
1673 HV * const pkg = SvSTASH((SV*)SvRV(tied));
a3bcc51e
TP
1674
1675 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
1676 SV *key;
bfcb3514 1677 if (HvEITER_get(hv))
a3bcc51e
TP
1678 /* we are in an iteration so the hash cannot be empty */
1679 return &PL_sv_yes;
1680 /* no xhv_eiter so now use FIRSTKEY */
1681 key = sv_newmortal();
1682 magic_nextpack((SV*)hv, mg, key);
bfcb3514 1683 HvEITER_set(hv, NULL); /* need to reset iterator */
a3bcc51e
TP
1684 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
1685 }
1686
1687 /* there is a SCALAR method that we can call */
1688 ENTER;
1689 PUSHSTACKi(PERLSI_MAGIC);
1690 PUSHMARK(SP);
1691 EXTEND(SP, 1);
1692 PUSHs(tied);
1693 PUTBACK;
1694
1695 if (call_method("SCALAR", G_SCALAR))
1696 retval = *PL_stack_sp--;
5fcbf73d
AL
1697 else
1698 retval = &PL_sv_undef;
a3bcc51e
TP
1699 POPSTACK;
1700 LEAVE;
1701 return retval;
1702}
1703
a0d0e21e 1704int
864dbfa3 1705Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
79072805 1706{
97aff369 1707 dVAR;
8772537c
AL
1708 GV * const gv = PL_DBline;
1709 const I32 i = SvTRUE(sv);
1710 SV ** const svp = av_fetch(GvAV(gv),
01b8bcb7 1711 atoi(MgPV_nolen_const(mg)), FALSE);
8772537c
AL
1712 if (svp && SvIOKp(*svp)) {
1713 OP * const o = INT2PTR(OP*,SvIVX(*svp));
1714 if (o) {
1715 /* set or clear breakpoint in the relevant control op */
1716 if (i)
1717 o->op_flags |= OPf_SPECIAL;
1718 else
1719 o->op_flags &= ~OPf_SPECIAL;
1720 }
5df8de69 1721 }
79072805
LW
1722 return 0;
1723}
1724
1725int
8772537c 1726Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
79072805 1727{
97aff369 1728 dVAR;
8772537c 1729 const AV * const obj = (AV*)mg->mg_obj;
83bf042f 1730 if (obj) {
fc15ae8f 1731 sv_setiv(sv, AvFILL(obj) + CopARYBASE_get(PL_curcop));
83bf042f
NC
1732 } else {
1733 SvOK_off(sv);
1734 }
79072805
LW
1735 return 0;
1736}
1737
1738int
864dbfa3 1739Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
79072805 1740{
97aff369 1741 dVAR;
8772537c 1742 AV * const obj = (AV*)mg->mg_obj;
83bf042f 1743 if (obj) {
fc15ae8f 1744 av_fill(obj, SvIV(sv) - CopARYBASE_get(PL_curcop));
83bf042f
NC
1745 } else {
1746 if (ckWARN(WARN_MISC))
1747 Perl_warner(aTHX_ packWARN(WARN_MISC),
1748 "Attempt to set length of freed array");
1749 }
1750 return 0;
1751}
1752
1753int
1754Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
1755{
97aff369 1756 dVAR;
53c1dcc0 1757 PERL_UNUSED_ARG(sv);
94f3782b
DM
1758 /* during global destruction, mg_obj may already have been freed */
1759 if (PL_in_clean_all)
1ea47f64 1760 return 0;
94f3782b 1761
83bf042f
NC
1762 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
1763
1764 if (mg) {
1765 /* arylen scalar holds a pointer back to the array, but doesn't own a
1766 reference. Hence the we (the array) are about to go away with it
1767 still pointing at us. Clear its pointer, else it would be pointing
1768 at free memory. See the comment in sv_magic about reference loops,
1769 and why it can't own a reference to us. */
1770 mg->mg_obj = 0;
1771 }
a0d0e21e
LW
1772 return 0;
1773}
1774
1775int
864dbfa3 1776Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1777{
97aff369 1778 dVAR;
8772537c 1779 SV* const lsv = LvTARG(sv);
3881461a 1780 PERL_UNUSED_ARG(mg);
ac27b0f5 1781
a0d0e21e 1782 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
3881461a
AL
1783 MAGIC * const found = mg_find(lsv, PERL_MAGIC_regex_global);
1784 if (found && found->mg_len >= 0) {
1785 I32 i = found->mg_len;
7e2040f0 1786 if (DO_UTF8(lsv))
a0ed51b3 1787 sv_pos_b2u(lsv, &i);
fc15ae8f 1788 sv_setiv(sv, i + CopARYBASE_get(PL_curcop));
a0d0e21e
LW
1789 return 0;
1790 }
1791 }
0c34ef67 1792 SvOK_off(sv);
a0d0e21e
LW
1793 return 0;
1794}
1795
1796int
864dbfa3 1797Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e 1798{
97aff369 1799 dVAR;
8772537c 1800 SV* const lsv = LvTARG(sv);
a0d0e21e
LW
1801 SSize_t pos;
1802 STRLEN len;
c00206c8 1803 STRLEN ulen = 0;
53d44271 1804 MAGIC* found;
a0d0e21e 1805
3881461a 1806 PERL_UNUSED_ARG(mg);
ac27b0f5 1807
a0d0e21e 1808 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
3881461a
AL
1809 found = mg_find(lsv, PERL_MAGIC_regex_global);
1810 else
1811 found = NULL;
1812 if (!found) {
a0d0e21e
LW
1813 if (!SvOK(sv))
1814 return 0;
d83f0a82
NC
1815#ifdef PERL_OLD_COPY_ON_WRITE
1816 if (SvIsCOW(lsv))
1817 sv_force_normal_flags(lsv, 0);
1818#endif
3881461a 1819 found = sv_magicext(lsv, NULL, PERL_MAGIC_regex_global, &PL_vtbl_mglob,
53d44271 1820 NULL, 0);
a0d0e21e
LW
1821 }
1822 else if (!SvOK(sv)) {
3881461a 1823 found->mg_len = -1;
a0d0e21e
LW
1824 return 0;
1825 }
1826 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1827
fc15ae8f 1828 pos = SvIV(sv) - CopARYBASE_get(PL_curcop);
a0ed51b3 1829
7e2040f0 1830 if (DO_UTF8(lsv)) {
a0ed51b3
LW
1831 ulen = sv_len_utf8(lsv);
1832 if (ulen)
1833 len = ulen;
a0ed51b3
LW
1834 }
1835
a0d0e21e
LW
1836 if (pos < 0) {
1837 pos += len;
1838 if (pos < 0)
1839 pos = 0;
1840 }
eb160463 1841 else if (pos > (SSize_t)len)
a0d0e21e 1842 pos = len;
a0ed51b3
LW
1843
1844 if (ulen) {
1845 I32 p = pos;
1846 sv_pos_u2b(lsv, &p, 0);
1847 pos = p;
1848 }
727405f8 1849
3881461a
AL
1850 found->mg_len = pos;
1851 found->mg_flags &= ~MGf_MINMATCH;
a0d0e21e 1852
79072805
LW
1853 return 0;
1854}
1855
1856int
864dbfa3 1857Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
79072805 1858{
79072805 1859 GV* gv;
8772537c
AL
1860 PERL_UNUSED_ARG(mg);
1861
79072805
LW
1862 if (!SvOK(sv))
1863 return 0;
2e5b91de 1864 if (isGV_with_GP(sv)) {
180488f8
NC
1865 /* We're actually already a typeglob, so don't need the stuff below.
1866 */
1867 return 0;
1868 }
f776e3cd 1869 gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV);
79072805
LW
1870 if (sv == (SV*)gv)
1871 return 0;
1872 if (GvGP(sv))
88e89b8a 1873 gp_free((GV*)sv);
79072805 1874 GvGP(sv) = gp_ref(GvGP(gv));
79072805
LW
1875 return 0;
1876}
1877
1878int
864dbfa3 1879Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
6ff81951
GS
1880{
1881 STRLEN len;
35a4481c 1882 SV * const lsv = LvTARG(sv);
b83604b4 1883 const char * const tmps = SvPV_const(lsv,len);
6ff81951
GS
1884 I32 offs = LvTARGOFF(sv);
1885 I32 rem = LvTARGLEN(sv);
8772537c 1886 PERL_UNUSED_ARG(mg);
6ff81951 1887
9aa983d2
JH
1888 if (SvUTF8(lsv))
1889 sv_pos_u2b(lsv, &offs, &rem);
eb160463 1890 if (offs > (I32)len)
6ff81951 1891 offs = len;
eb160463 1892 if (rem + offs > (I32)len)
6ff81951
GS
1893 rem = len - offs;
1894 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
9aa983d2 1895 if (SvUTF8(lsv))
2ef4b674 1896 SvUTF8_on(sv);
6ff81951
GS
1897 return 0;
1898}
1899
1900int
864dbfa3 1901Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
79072805 1902{
97aff369 1903 dVAR;
9aa983d2 1904 STRLEN len;
5fcbf73d 1905 const char * const tmps = SvPV_const(sv, len);
dd374669 1906 SV * const lsv = LvTARG(sv);
9aa983d2
JH
1907 I32 lvoff = LvTARGOFF(sv);
1908 I32 lvlen = LvTARGLEN(sv);
8772537c 1909 PERL_UNUSED_ARG(mg);
075a4a2b 1910
1aa99e6b 1911 if (DO_UTF8(sv)) {
9aa983d2
JH
1912 sv_utf8_upgrade(lsv);
1913 sv_pos_u2b(lsv, &lvoff, &lvlen);
1914 sv_insert(lsv, lvoff, lvlen, tmps, len);
b76f3ce2 1915 LvTARGLEN(sv) = sv_len_utf8(sv);
9aa983d2
JH
1916 SvUTF8_on(lsv);
1917 }
9bf12eaf 1918 else if (lsv && SvUTF8(lsv)) {
5fcbf73d 1919 const char *utf8;
9aa983d2 1920 sv_pos_u2b(lsv, &lvoff, &lvlen);
b76f3ce2 1921 LvTARGLEN(sv) = len;
5fcbf73d
AL
1922 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
1923 sv_insert(lsv, lvoff, lvlen, utf8, len);
1924 Safefree(utf8);
1aa99e6b 1925 }
b76f3ce2
GB
1926 else {
1927 sv_insert(lsv, lvoff, lvlen, tmps, len);
1928 LvTARGLEN(sv) = len;
1929 }
1930
1aa99e6b 1931
79072805
LW
1932 return 0;
1933}
1934
1935int
864dbfa3 1936Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1937{
97aff369 1938 dVAR;
8772537c 1939 PERL_UNUSED_ARG(sv);
27cc343c 1940 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
463ee0b2
LW
1941 return 0;
1942}
1943
1944int
864dbfa3 1945Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1946{
97aff369 1947 dVAR;
8772537c 1948 PERL_UNUSED_ARG(sv);
0a9c116b
DM
1949 /* update taint status unless we're restoring at scope exit */
1950 if (PL_localizing != 2) {
1951 if (PL_tainted)
1952 mg->mg_len |= 1;
1953 else
1954 mg->mg_len &= ~1;
1955 }
463ee0b2
LW
1956 return 0;
1957}
1958
1959int
864dbfa3 1960Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
6ff81951 1961{
35a4481c 1962 SV * const lsv = LvTARG(sv);
8772537c 1963 PERL_UNUSED_ARG(mg);
6ff81951 1964
6136c704
AL
1965 if (lsv)
1966 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1967 else
0c34ef67 1968 SvOK_off(sv);
6ff81951 1969
6ff81951
GS
1970 return 0;
1971}
1972
1973int
864dbfa3 1974Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
79072805 1975{
8772537c 1976 PERL_UNUSED_ARG(mg);
79072805
LW
1977 do_vecset(sv); /* XXX slurp this routine */
1978 return 0;
1979}
1980
1981int
864dbfa3 1982Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
5f05dabc 1983{
97aff369 1984 dVAR;
a0714e2c 1985 SV *targ = NULL;
5f05dabc 1986 if (LvTARGLEN(sv)) {
68dc0745 1987 if (mg->mg_obj) {
8772537c
AL
1988 SV * const ahv = LvTARG(sv);
1989 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
6d822dc4
MS
1990 if (he)
1991 targ = HeVAL(he);
68dc0745 1992 }
1993 else {
8772537c 1994 AV* const av = (AV*)LvTARG(sv);
68dc0745 1995 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1996 targ = AvARRAY(av)[LvTARGOFF(sv)];
1997 }
46da273f 1998 if (targ && (targ != &PL_sv_undef)) {
68dc0745 1999 /* somebody else defined it for us */
2000 SvREFCNT_dec(LvTARG(sv));
b37c2d43 2001 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
68dc0745 2002 LvTARGLEN(sv) = 0;
2003 SvREFCNT_dec(mg->mg_obj);
a0714e2c 2004 mg->mg_obj = NULL;
68dc0745 2005 mg->mg_flags &= ~MGf_REFCOUNTED;
2006 }
5f05dabc 2007 }
71be2cbc 2008 else
2009 targ = LvTARG(sv);
3280af22 2010 sv_setsv(sv, targ ? targ : &PL_sv_undef);
71be2cbc 2011 return 0;
2012}
2013
2014int
864dbfa3 2015Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
71be2cbc 2016{
8772537c 2017 PERL_UNUSED_ARG(mg);
71be2cbc 2018 if (LvTARGLEN(sv))
68dc0745 2019 vivify_defelem(sv);
2020 if (LvTARG(sv)) {
5f05dabc 2021 sv_setsv(LvTARG(sv), sv);
68dc0745 2022 SvSETMAGIC(LvTARG(sv));
2023 }
5f05dabc 2024 return 0;
2025}
2026
71be2cbc 2027void
864dbfa3 2028Perl_vivify_defelem(pTHX_ SV *sv)
71be2cbc 2029{
97aff369 2030 dVAR;
74e13ce4 2031 MAGIC *mg;
a0714e2c 2032 SV *value = NULL;
71be2cbc 2033
14befaf4 2034 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
71be2cbc 2035 return;
68dc0745 2036 if (mg->mg_obj) {
8772537c
AL
2037 SV * const ahv = LvTARG(sv);
2038 HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
6d822dc4
MS
2039 if (he)
2040 value = HeVAL(he);
3280af22 2041 if (!value || value == &PL_sv_undef)
be2597df 2042 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
71be2cbc 2043 }
68dc0745 2044 else {
8772537c 2045 AV* const av = (AV*)LvTARG(sv);
5aabfad6 2046 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
a0714e2c 2047 LvTARG(sv) = NULL; /* array can't be extended */
68dc0745 2048 else {
d4c19fe8 2049 SV* const * const svp = av_fetch(av, LvTARGOFF(sv), TRUE);
3280af22 2050 if (!svp || (value = *svp) == &PL_sv_undef)
cea2e8a9 2051 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
68dc0745 2052 }
2053 }
b37c2d43 2054 SvREFCNT_inc_simple_void(value);
68dc0745 2055 SvREFCNT_dec(LvTARG(sv));
2056 LvTARG(sv) = value;
71be2cbc 2057 LvTARGLEN(sv) = 0;
68dc0745 2058 SvREFCNT_dec(mg->mg_obj);
a0714e2c 2059 mg->mg_obj = NULL;
68dc0745 2060 mg->mg_flags &= ~MGf_REFCOUNTED;
5f05dabc 2061}
2062
2063int
864dbfa3 2064Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
810b8aa5 2065{
86f55936 2066 return Perl_sv_kill_backrefs(aTHX_ sv, (AV*)mg->mg_obj);
810b8aa5
GS
2067}
2068
2069int
864dbfa3 2070Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
93a17b20 2071{
96a5add6 2072 PERL_UNUSED_CONTEXT;
565764a8 2073 mg->mg_len = -1;
c6496cc7 2074 SvSCREAM_off(sv);
93a17b20
LW
2075 return 0;
2076}
2077
2078int
864dbfa3 2079Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
79072805 2080{
8772537c 2081 PERL_UNUSED_ARG(mg);
14befaf4 2082 sv_unmagic(sv, PERL_MAGIC_bm);
b84d1fce 2083 SvTAIL_off(sv);
79072805
LW
2084 SvVALID_off(sv);
2085 return 0;
2086}
2087
2088int
864dbfa3 2089Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
55497cff 2090{
8772537c 2091 PERL_UNUSED_ARG(mg);
14befaf4 2092 sv_unmagic(sv, PERL_MAGIC_fm);
55497cff 2093 SvCOMPILED_off(sv);
2094 return 0;
2095}
2096
2097int
864dbfa3 2098Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
79072805 2099{
35a4481c 2100 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
79072805
LW
2101
2102 if (uf && uf->uf_set)
24f81a43 2103 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
79072805
LW
2104 return 0;
2105}
2106
c277df42 2107int
faf82a0b
AE
2108Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2109{
8772537c 2110 PERL_UNUSED_ARG(mg);
faf82a0b
AE
2111 sv_unmagic(sv, PERL_MAGIC_qr);
2112 return 0;
2113}
2114
2115int
864dbfa3 2116Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
c277df42 2117{
97aff369 2118 dVAR;
8772537c
AL
2119 regexp * const re = (regexp *)mg->mg_obj;
2120 PERL_UNUSED_ARG(sv);
2121
c277df42
IZ
2122 ReREFCNT_dec(re);
2123 return 0;
2124}
2125
7a4c00b4 2126#ifdef USE_LOCALE_COLLATE
79072805 2127int
864dbfa3 2128Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
bbce6d69 2129{
2130 /*
838b5b74 2131 * RenE<eacute> Descartes said "I think not."
bbce6d69 2132 * and vanished with a faint plop.
2133 */
96a5add6 2134 PERL_UNUSED_CONTEXT;
8772537c 2135 PERL_UNUSED_ARG(sv);
7a4c00b4 2136 if (mg->mg_ptr) {
2137 Safefree(mg->mg_ptr);
2138 mg->mg_ptr = NULL;
565764a8 2139 mg->mg_len = -1;
7a4c00b4 2140 }
bbce6d69 2141 return 0;
2142}
7a4c00b4 2143#endif /* USE_LOCALE_COLLATE */
bbce6d69 2144
7e8c5dac
HS
2145/* Just clear the UTF-8 cache data. */
2146int
2147Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2148{
96a5add6 2149 PERL_UNUSED_CONTEXT;
8772537c 2150 PERL_UNUSED_ARG(sv);
7e8c5dac 2151 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
3881461a 2152 mg->mg_ptr = NULL;
7e8c5dac
HS
2153 mg->mg_len = -1; /* The mg_len holds the len cache. */
2154 return 0;
2155}
2156
bbce6d69 2157int
864dbfa3 2158Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
79072805 2159{
97aff369 2160 dVAR;
e1ec3a88 2161 register const char *s;
79072805 2162 I32 i;
8990e307 2163 STRLEN len;
79072805 2164 switch (*mg->mg_ptr) {
748a9306 2165 case '\001': /* ^A */
3280af22 2166 sv_setsv(PL_bodytarget, sv);
748a9306 2167 break;
49460fe6 2168 case '\003': /* ^C */
38ab35f8 2169 PL_minus_c = (bool)SvIV(sv);
49460fe6
NIS
2170 break;
2171
79072805 2172 case '\004': /* ^D */
b4ab917c 2173#ifdef DEBUGGING
b83604b4 2174 s = SvPV_nolen_const(sv);
ddcf8bc1 2175 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
79072805 2176 DEBUG_x(dump_all());
b4ab917c 2177#else
38ab35f8 2178 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
b4ab917c 2179#endif
79072805 2180 break;
28f23441 2181 case '\005': /* ^E */
d0063567 2182 if (*(mg->mg_ptr+1) == '\0') {
cd39f2b6 2183#ifdef MACOS_TRADITIONAL
38ab35f8 2184 gMacPerl_OSErr = SvIV(sv);
28f23441 2185#else
cd39f2b6 2186# ifdef VMS
38ab35f8 2187 set_vaxc_errno(SvIV(sv));
048c1ddf 2188# else
cd39f2b6 2189# ifdef WIN32
d0063567 2190 SetLastError( SvIV(sv) );
cd39f2b6 2191# else
9fed8b87 2192# ifdef OS2
38ab35f8 2193 os2_setsyserrno(SvIV(sv));
9fed8b87 2194# else
d0063567 2195 /* will anyone ever use this? */
38ab35f8 2196 SETERRNO(SvIV(sv), 4);
cd39f2b6 2197# endif
048c1ddf
IZ
2198# endif
2199# endif
22fae026 2200#endif
d0063567
DK
2201 }
2202 else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2203 if (PL_encoding)
2204 SvREFCNT_dec(PL_encoding);
2205 if (SvOK(sv) || SvGMAGICAL(sv)) {
2206 PL_encoding = newSVsv(sv);
2207 }
2208 else {
a0714e2c 2209 PL_encoding = NULL;
d0063567
DK
2210 }
2211 }
2212 break;
79072805 2213 case '\006': /* ^F */
38ab35f8 2214 PL_maxsysfd = SvIV(sv);
79072805 2215 break;
a0d0e21e 2216 case '\010': /* ^H */
38ab35f8 2217 PL_hints = SvIV(sv);
a0d0e21e 2218 break;
9d116dd7 2219 case '\011': /* ^I */ /* NOT \t in EBCDIC */
43c5f42d 2220 Safefree(PL_inplace);
bd61b366 2221 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
da78da6e 2222 break;
28f23441 2223 case '\017': /* ^O */
ac27b0f5 2224 if (*(mg->mg_ptr+1) == '\0') {
43c5f42d 2225 Safefree(PL_osname);
bd61b366 2226 PL_osname = NULL;
3511154c
DM
2227 if (SvOK(sv)) {
2228 TAINT_PROPER("assigning to $^O");
2e0de35c 2229 PL_osname = savesvpv(sv);
3511154c 2230 }
ac27b0f5
NIS
2231 }
2232 else if (strEQ(mg->mg_ptr, "\017PEN")) {
11bcd5da
NC
2233 PL_compiling.cop_hints |= HINT_LEXICAL_IO;
2234 PL_hints |= HINT_LOCALIZE_HH | HINT_LEXICAL_IO;
2235 PL_compiling.cop_hints_hash
2236 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
2237 sv_2mortal(newSVpvs("open")), sv);
ac27b0f5 2238 }
28f23441 2239 break;
79072805 2240 case '\020': /* ^P */
38ab35f8 2241 PL_perldb = SvIV(sv);
f2a7f298 2242 if (PL_perldb && !PL_DBsingle)
1ee4443e 2243 init_debugger();
79072805
LW
2244 break;
2245 case '\024': /* ^T */
88e89b8a 2246#ifdef BIG_TIME
6b88bc9c 2247 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
88e89b8a 2248#else
38ab35f8 2249 PL_basetime = (Time_t)SvIV(sv);
88e89b8a 2250#endif
79072805 2251 break;
e07ea26a
NC
2252 case '\025': /* ^UTF8CACHE */
2253 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2254 PL_utf8cache = (signed char) sv_2iv(sv);
2255 }
2256 break;
fde18df1 2257 case '\027': /* ^W & $^WARNING_BITS */
4438c4b7
JH
2258 if (*(mg->mg_ptr+1) == '\0') {
2259 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
38ab35f8 2260 i = SvIV(sv);
ac27b0f5 2261 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
0453d815 2262 | (i ? G_WARN_ON : G_WARN_OFF) ;
4438c4b7 2263 }
599cee73 2264 }
0a378802 2265 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
4438c4b7 2266 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
d775746e
GS
2267 if (!SvPOK(sv) && PL_localizing) {
2268 sv_setpvn(sv, WARN_NONEstring, WARNsize);
d3a7d8c7 2269 PL_compiling.cop_warnings = pWARN_NONE;
d775746e
GS
2270 break;
2271 }
f4fc7782 2272 {
b5477537 2273 STRLEN len, i;
d3a7d8c7 2274 int accumulate = 0 ;
f4fc7782 2275 int any_fatals = 0 ;
b83604b4 2276 const char * const ptr = SvPV_const(sv, len) ;
f4fc7782
JH
2277 for (i = 0 ; i < len ; ++i) {
2278 accumulate |= ptr[i] ;
2279 any_fatals |= (ptr[i] & 0xAA) ;
2280 }
4243c432
NC
2281 if (!accumulate) {
2282 if (!specialWARN(PL_compiling.cop_warnings))
2283 PerlMemShared_free(PL_compiling.cop_warnings);
2284 PL_compiling.cop_warnings = pWARN_NONE;
2285 }
72dc9ed5
NC
2286 /* Yuck. I can't see how to abstract this: */
2287 else if (isWARN_on(((STRLEN *)SvPV_nolen_const(sv)) - 1,
2288 WARN_ALL) && !any_fatals) {
4243c432
NC
2289 if (!specialWARN(PL_compiling.cop_warnings))
2290 PerlMemShared_free(PL_compiling.cop_warnings);
f4fc7782
JH
2291 PL_compiling.cop_warnings = pWARN_ALL;
2292 PL_dowarn |= G_WARN_ONCE ;
727405f8 2293 }
d3a7d8c7 2294 else {
72dc9ed5
NC
2295 STRLEN len;
2296 const char *const p = SvPV_const(sv, len);
2297
2298 PL_compiling.cop_warnings
8ee4cf24 2299 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
72dc9ed5
NC
2300 p, len);
2301
d3a7d8c7
GS
2302 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2303 PL_dowarn |= G_WARN_ONCE ;
2304 }
f4fc7782 2305
d3a7d8c7 2306 }
4438c4b7 2307 }
971a9dd3 2308 }
79072805
LW
2309 break;
2310 case '.':
3280af22
NIS
2311 if (PL_localizing) {
2312 if (PL_localizing == 1)
7766f137 2313 SAVESPTR(PL_last_in_gv);
748a9306 2314 }
3280af22 2315 else if (SvOK(sv) && GvIO(PL_last_in_gv))
632db599 2316 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
79072805
LW
2317 break;
2318 case '^':
3280af22 2319 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
e1ec3a88 2320 s = IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
f776e3cd 2321 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
79072805
LW
2322 break;
2323 case '~':
3280af22 2324 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
e1ec3a88 2325 s = IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
f776e3cd 2326 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
79072805
LW
2327 break;
2328 case '=':
38ab35f8 2329 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
79072805
LW
2330 break;
2331 case '-':
38ab35f8 2332 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
3280af22
NIS
2333 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2334 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
79072805
LW
2335 break;
2336 case '%':
38ab35f8 2337 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
79072805
LW
2338 break;
2339 case '|':
4b65379b 2340 {
8772537c 2341 IO * const io = GvIOp(PL_defoutgv);
720f287d
AB
2342 if(!io)
2343 break;
38ab35f8 2344 if ((SvIV(sv)) == 0)
4b65379b
CS
2345 IoFLAGS(io) &= ~IOf_FLUSH;
2346 else {
2347 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2348 PerlIO *ofp = IoOFP(io);
2349 if (ofp)
2350 (void)PerlIO_flush(ofp);
2351 IoFLAGS(io) |= IOf_FLUSH;
2352 }
2353 }
79072805
LW
2354 }
2355 break;
79072805 2356 case '/':
3280af22 2357 SvREFCNT_dec(PL_rs);
8bfdd7d9 2358 PL_rs = newSVsv(sv);
79072805
LW
2359 break;
2360 case '\\':
7889fe52
NIS
2361 if (PL_ors_sv)
2362 SvREFCNT_dec(PL_ors_sv);
009c130f 2363 if (SvOK(sv) || SvGMAGICAL(sv)) {
7889fe52 2364 PL_ors_sv = newSVsv(sv);
009c130f 2365 }
e3c19b7b 2366 else {
a0714e2c 2367 PL_ors_sv = NULL;
e3c19b7b 2368 }
79072805
LW
2369 break;
2370 case ',':
7889fe52
NIS
2371 if (PL_ofs_sv)
2372 SvREFCNT_dec(PL_ofs_sv);
2373 if (SvOK(sv) || SvGMAGICAL(sv)) {
2374 PL_ofs_sv = newSVsv(sv);
2375 }
2376 else {
a0714e2c 2377 PL_ofs_sv = NULL;
7889fe52 2378 }
79072805 2379 break;
79072805 2380 case '[':
38ab35f8 2381 CopARYBASE_set(&PL_compiling, SvIV(sv));
79072805
LW
2382 break;
2383 case '?':
ff0cee69 2384#ifdef COMPLEX_STATUS
6b88bc9c
GS
2385 if (PL_localizing == 2) {
2386 PL_statusvalue = LvTARGOFF(sv);
2387 PL_statusvalue_vms = LvTARGLEN(sv);
ff0cee69 2388 }
2389 else
2390#endif
2391#ifdef VMSISH_STATUS
2392 if (VMSISH_STATUS)
fb38d079 2393 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
ff0cee69 2394 else
2395#endif
38ab35f8 2396 STATUS_UNIX_EXIT_SET(SvIV(sv));
79072805
LW
2397 break;
2398 case '!':
93189314
JH
2399 {
2400#ifdef VMS
2401# define PERL_VMS_BANG vaxc$errno
2402#else
2403# define PERL_VMS_BANG 0
2404#endif
91487cfc 2405 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
93189314
JH
2406 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2407 }
79072805
LW
2408 break;
2409 case '<':
38ab35f8 2410 PL_uid = SvIV(sv);
3280af22
NIS
2411 if (PL_delaymagic) {
2412 PL_delaymagic |= DM_RUID;
79072805
LW
2413 break; /* don't do magic till later */
2414 }
2415#ifdef HAS_SETRUID
b28d0864 2416 (void)setruid((Uid_t)PL_uid);
79072805
LW
2417#else
2418#ifdef HAS_SETREUID
3280af22 2419 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
748a9306 2420#else
85e6fe83 2421#ifdef HAS_SETRESUID
b28d0864 2422 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
79072805 2423#else
75870ed3 2424 if (PL_uid == PL_euid) { /* special case $< = $> */
2425#ifdef PERL_DARWIN
2426 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
2427 if (PL_uid != 0 && PerlProc_getuid() == 0)
2428 (void)PerlProc_setuid(0);
2429#endif
b28d0864 2430 (void)PerlProc_setuid(PL_uid);
75870ed3 2431 } else {
d8eceb89 2432 PL_uid = PerlProc_getuid();
cea2e8a9 2433 Perl_croak(aTHX_ "setruid() not implemented");
a0d0e21e 2434 }
79072805
LW
2435#endif
2436#endif
85e6fe83 2437#endif
d8eceb89 2438 PL_uid = PerlProc_getuid();
3280af22 2439 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805
LW
2440 break;
2441 case '>':
38ab35f8 2442 PL_euid = SvIV(sv);
3280af22
NIS
2443 if (PL_delaymagic) {
2444 PL_delaymagic |= DM_EUID;
79072805
LW
2445 break; /* don't do magic till later */
2446 }
2447#ifdef HAS_SETEUID
3280af22 2448 (void)seteuid((Uid_t)PL_euid);
79072805
LW
2449#else
2450#ifdef HAS_SETREUID
b28d0864 2451 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
85e6fe83
LW
2452#else
2453#ifdef HAS_SETRESUID
6b88bc9c 2454 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
79072805 2455#else
b28d0864
NIS
2456 if (PL_euid == PL_uid) /* special case $> = $< */
2457 PerlProc_setuid(PL_euid);
a0d0e21e 2458 else {
e8ee3774 2459 PL_euid = PerlProc_geteuid();
cea2e8a9 2460 Perl_croak(aTHX_ "seteuid() not implemented");
a0d0e21e 2461 }
79072805
LW
2462#endif
2463#endif
85e6fe83 2464#endif
d8eceb89 2465 PL_euid = PerlProc_geteuid();
3280af22 2466 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805
LW
2467 break;
2468 case '(':
38ab35f8 2469 PL_gid = SvIV(sv);
3280af22
NIS
2470 if (PL_delaymagic) {
2471 PL_delaymagic |= DM_RGID;
79072805
LW
2472 break; /* don't do magic till later */
2473 }
2474#ifdef HAS_SETRGID
b28d0864 2475 (void)setrgid((Gid_t)PL_gid);
79072805
LW
2476#else
2477#ifdef HAS_SETREGID
3280af22 2478 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
85e6fe83
LW
2479#else
2480#ifdef HAS_SETRESGID
b28d0864 2481 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
79072805 2482#else
b28d0864
NIS
2483 if (PL_gid == PL_egid) /* special case $( = $) */
2484 (void)PerlProc_setgid(PL_gid);
748a9306 2485 else {
d8eceb89 2486 PL_gid = PerlProc_getgid();
cea2e8a9 2487 Perl_croak(aTHX_ "setrgid() not implemented");
748a9306 2488 }
79072805
LW
2489#endif
2490#endif
85e6fe83 2491#endif
d8eceb89 2492 PL_gid = PerlProc_getgid();
3280af22 2493 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805
LW
2494 break;
2495 case ')':
5cd24f17 2496#ifdef HAS_SETGROUPS
2497 {
b83604b4 2498 const char *p = SvPV_const(sv, len);
757f63d8
SP
2499 Groups_t *gary = NULL;
2500
2501 while (isSPACE(*p))
2502 ++p;
2503 PL_egid = Atol(p);
2504 for (i = 0; i < NGROUPS; ++i) {
2505 while (*p && !isSPACE(*p))
2506 ++p;
2507 while (isSPACE(*p))
2508 ++p;
2509 if (!*p)
2510 break;
2511 if(!gary)
2512 Newx(gary, i + 1, Groups_t);
2513 else
2514 Renew(gary, i + 1, Groups_t);
2515 gary[i] = Atol(p);
2516 }
2517 if (i)
2518 (void)setgroups(i, gary);
f5a63d97 2519 Safefree(gary);
5cd24f17 2520 }
2521#else /* HAS_SETGROUPS */
38ab35f8 2522 PL_egid = SvIV(sv);
5cd24f17 2523#endif /* HAS_SETGROUPS */
3280af22
NIS
2524 if (PL_delaymagic) {
2525 PL_delaymagic |= DM_EGID;
79072805
LW
2526 break; /* don't do magic till later */
2527 }
2528#ifdef HAS_SETEGID
3280af22 2529 (void)setegid((Gid_t)PL_egid);
79072805
LW
2530#else
2531#ifdef HAS_SETREGID
b28d0864 2532 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
85e6fe83
LW
2533#else
2534#ifdef HAS_SETRESGID
b28d0864 2535 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
79072805 2536#else
b28d0864
NIS
2537 if (PL_egid == PL_gid) /* special case $) = $( */
2538 (void)PerlProc_setgid(PL_egid);
748a9306 2539 else {
d8eceb89 2540 PL_egid = PerlProc_getegid();
cea2e8a9 2541 Perl_croak(aTHX_ "setegid() not implemented");
748a9306 2542 }
79072805
LW
2543#endif
2544#endif
85e6fe83 2545#endif
d8eceb89 2546 PL_egid = PerlProc_getegid();
3280af22 2547 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805
LW
2548 break;
2549 case ':':
2d8e6c8d 2550 PL_chopset = SvPV_force(sv,len);
79072805 2551 break;
cd39f2b6 2552#ifndef MACOS_TRADITIONAL
79072805 2553 case '0':
e2975953 2554 LOCK_DOLLARZERO_MUTEX;
4bc88a62
PS
2555#ifdef HAS_SETPROCTITLE
2556 /* The BSDs don't show the argv[] in ps(1) output, they
2557 * show a string from the process struct and provide
2558 * the setproctitle() routine to manipulate that. */
a2722ac9 2559 if (PL_origalen != 1) {
b83604b4 2560 s = SvPV_const(sv, len);
98b76f99 2561# if __FreeBSD_version > 410001
9aad2c0e 2562 /* The leading "-" removes the "perl: " prefix,
4bc88a62
PS
2563 * but not the "(perl) suffix from the ps(1)
2564 * output, because that's what ps(1) shows if the
2565 * argv[] is modified. */
6f2ad931 2566 setproctitle("-%s", s);
9aad2c0e 2567# else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
4bc88a62
PS
2568 /* This doesn't really work if you assume that
2569 * $0 = 'foobar'; will wipe out 'perl' from the $0
2570 * because in ps(1) output the result will be like
2571 * sprintf("perl: %s (perl)", s)
2572 * I guess this is a security feature:
2573 * one (a user process) cannot get rid of the original name.
2574 * --jhi */
2575 setproctitle("%s", s);
2576# endif
2577 }
9d3968b2 2578#elif defined(__hpux) && defined(PSTAT_SETCMD)
a2722ac9 2579 if (PL_origalen != 1) {
17aa7f3d 2580 union pstun un;
b83604b4 2581 s = SvPV_const(sv, len);
6867be6d 2582 un.pst_command = (char *)s;
17aa7f3d
JH
2583 pstat(PSTAT_SETCMD, un, len, 0, 0);
2584 }
9d3968b2 2585#else
2d2af554
GA
2586 if (PL_origalen > 1) {
2587 /* PL_origalen is set in perl_parse(). */
2588 s = SvPV_force(sv,len);
2589 if (len >= (STRLEN)PL_origalen-1) {
2590 /* Longer than original, will be truncated. We assume that
2591 * PL_origalen bytes are available. */
2592 Copy(s, PL_origargv[0], PL_origalen-1, char);
2593 }
2594 else {
2595 /* Shorter than original, will be padded. */
235ac35d 2596#ifdef PERL_DARWIN
60777a0d
JH
2597 /* Special case for Mac OS X: see [perl #38868] */
2598 const int pad = 0;
235ac35d 2599#else
8a89a4f1
MB
2600 /* Is the space counterintuitive? Yes.
2601 * (You were expecting \0?)
2602 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2603 * --jhi */
60777a0d 2604 const int pad = ' ';
235ac35d 2605#endif
60777a0d
JH
2606 Copy(s, PL_origargv[0], len, char);
2607 PL_origargv[0][len] = 0;
2608 memset(PL_origargv[0] + len + 1,
2609 pad, PL_origalen - len - 1);
2d2af554
GA
2610 }
2611 PL_origargv[0][PL_origalen-1] = 0;
2612 for (i = 1; i < PL_origargc; i++)
2613 PL_origargv[i] = 0;
79072805 2614 }
9d3968b2 2615#endif
e2975953 2616 UNLOCK_DOLLARZERO_MUTEX;
79072805 2617 break;
cd39f2b6 2618#endif
79072805
LW
2619 }
2620 return 0;
2621}
2622
2623I32
35a4481c 2624Perl_whichsig(pTHX_ const char *sig)
79072805 2625{
aadb217d 2626 register char* const* sigv;
96a5add6 2627 PERL_UNUSED_CONTEXT;
79072805 2628
aadb217d 2629 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
79072805 2630 if (strEQ(sig,*sigv))
aadb217d 2631 return PL_sig_num[sigv - (char* const*)PL_sig_name];
79072805
LW
2632#ifdef SIGCLD
2633 if (strEQ(sig,"CHLD"))
2634 return SIGCLD;
2635#endif
2636#ifdef SIGCHLD
2637 if (strEQ(sig,"CLD"))
2638 return SIGCHLD;
2639#endif
7f1236c0 2640 return -1;
79072805
LW
2641}
2642
ecfc5424 2643Signal_t
1e82f5a6 2644#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
8aad04aa 2645Perl_sighandler(int sig, ...)
1e82f5a6
SH
2646#else
2647Perl_sighandler(int sig)
2648#endif
79072805 2649{
1018e26f
NIS
2650#ifdef PERL_GET_SIG_CONTEXT
2651 dTHXa(PERL_GET_SIG_CONTEXT);
71d280e3 2652#else
cea2e8a9 2653 dTHX;
71d280e3 2654#endif
79072805 2655 dSP;
a0714e2c
SS
2656 GV *gv = NULL;
2657 SV *sv = NULL;
8772537c 2658 SV * const tSv = PL_Sv;
601f1833 2659 CV *cv = NULL;
533c011a 2660 OP *myop = PL_op;
84902520 2661 U32 flags = 0;
8772537c 2662 XPV * const tXpv = PL_Xpv;
71d280e3 2663
3280af22 2664 if (PL_savestack_ix + 15 <= PL_savestack_max)
84902520 2665 flags |= 1;
3280af22 2666 if (PL_markstack_ptr < PL_markstack_max - 2)
84902520 2667 flags |= 4;
3280af22 2668 if (PL_scopestack_ix < PL_scopestack_max - 3)
84902520
TB
2669 flags |= 16;
2670
727405f8 2671 if (!PL_psig_ptr[sig]) {
99ef548b 2672 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
727405f8
NIS
2673 PL_sig_name[sig]);
2674 exit(sig);
2675 }
ff0cee69 2676
84902520
TB
2677 /* Max number of items pushed there is 3*n or 4. We cannot fix
2678 infinity, so we fix 4 (in fact 5): */
2679 if (flags & 1) {
3280af22 2680 PL_savestack_ix += 5; /* Protect save in progress. */
8772537c 2681 SAVEDESTRUCTOR_X(S_unwind_handler_stack, (void*)&flags);
84902520 2682 }
ac27b0f5 2683 if (flags & 4)
3280af22 2684 PL_markstack_ptr++; /* Protect mark. */
84902520 2685 if (flags & 16)
3280af22 2686 PL_scopestack_ix += 1;
84902520 2687 /* sv_2cv is too complicated, try a simpler variant first: */
ac27b0f5 2688 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
8772537c
AL
2689 || SvTYPE(cv) != SVt_PVCV) {
2690 HV *st;
f2c0649b 2691 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
8772537c 2692 }
84902520 2693
a0d0e21e 2694 if (!cv || !CvROOT(cv)) {
599cee73 2695 if (ckWARN(WARN_SIGNAL))
9014280d 2696 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
22c35a8c 2697 PL_sig_name[sig], (gv ? GvENAME(gv)
00d579c5
GS
2698 : ((cv && CvGV(cv))
2699 ? GvENAME(CvGV(cv))
2700 : "__ANON__")));
2701 goto cleanup;
79072805
LW
2702 }
2703
22c35a8c 2704 if(PL_psig_name[sig]) {
b37c2d43 2705 sv = SvREFCNT_inc_NN(PL_psig_name[sig]);
84902520 2706 flags |= 64;
df3728a2 2707#if !defined(PERL_IMPLICIT_CONTEXT)
27da23d5 2708 PL_sig_sv = sv;
df3728a2 2709#endif
84902520 2710 } else {
ff0cee69 2711 sv = sv_newmortal();
22c35a8c 2712 sv_setpv(sv,PL_sig_name[sig]);
88e89b8a 2713 }
e336de0d 2714
e788e7d3 2715 PUSHSTACKi(PERLSI_SIGNAL);
924508f0 2716 PUSHMARK(SP);
79072805 2717 PUSHs(sv);
8aad04aa
JH
2718#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
2719 {
2720 struct sigaction oact;
2721
2722 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
2723 siginfo_t *sip;
2724 va_list args;
2725
2726 va_start(args, sig);
2727 sip = (siginfo_t*)va_arg(args, siginfo_t*);
2728 if (sip) {
2729 HV *sih = newHV();
2730 SV *rv = newRV_noinc((SV*)sih);
2731 /* The siginfo fields signo, code, errno, pid, uid,
2732 * addr, status, and band are defined by POSIX/SUSv3. */
2733 hv_store(sih, "signo", 5, newSViv(sip->si_signo), 0);
2734 hv_store(sih, "code", 4, newSViv(sip->si_code), 0);
79dec0f4 2735#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. */
ea1bde16 2736 hv_store(sih, "errno", 5, newSViv(sip->si_errno), 0);
79dec0f4 2737 hv_store(sih, "status", 6, newSViv(sip->si_status), 0);
8aad04aa
JH
2738 hv_store(sih, "uid", 3, newSViv(sip->si_uid), 0);
2739 hv_store(sih, "pid", 3, newSViv(sip->si_pid), 0);
2740 hv_store(sih, "addr", 4, newSVuv(PTR2UV(sip->si_addr)), 0);
8aad04aa 2741 hv_store(sih, "band", 4, newSViv(sip->si_band), 0);
79dec0f4 2742#endif
8aad04aa
JH
2743 EXTEND(SP, 2);
2744 PUSHs((SV*)rv);
10edeb5d 2745 PUSHs(newSVpv((char *)sip, sizeof(*sip)));
8aad04aa 2746 }
b4552a27 2747
31427afe 2748 va_end(args);
8aad04aa
JH
2749 }
2750 }
2751#endif
79072805 2752 PUTBACK;
a0d0e21e 2753
1b266415 2754 call_sv((SV*)cv, G_DISCARD|G_EVAL);
79072805 2755
d3acc0f7 2756 POPSTACK;
1b266415 2757 if (SvTRUE(ERRSV)) {
1d615522 2758#ifndef PERL_MICRO
983dbef6 2759#ifdef HAS_SIGPROCMASK
1b266415
NIS
2760 /* Handler "died", for example to get out of a restart-able read().
2761 * Before we re-do that on its behalf re-enable the signal which was
2762 * blocked by the system when we entered.
2763 */
2764 sigset_t set;
2765 sigemptyset(&set);
2766 sigaddset(&set,sig);
2767 sigprocmask(SIG_UNBLOCK, &set, NULL);
2768#else
2769 /* Not clear if this will work */
2770 (void)rsignal(sig, SIG_IGN);
5c1546dc 2771 (void)rsignal(sig, PL_csighandlerp);
1b266415 2772#endif
1d615522 2773#endif /* !PERL_MICRO */
bd61b366 2774 Perl_die(aTHX_ NULL);
1b266415 2775 }
00d579c5 2776cleanup:
84902520 2777 if (flags & 1)
3280af22 2778 PL_savestack_ix -= 8; /* Unprotect save in progress. */
ac27b0f5 2779 if (flags & 4)
3280af22 2780 PL_markstack_ptr--;
84902520 2781 if (flags & 16)
3280af22 2782 PL_scopestack_ix -= 1;
84902520
TB
2783 if (flags & 64)
2784 SvREFCNT_dec(sv);
533c011a 2785 PL_op = myop; /* Apparently not needed... */
ac27b0f5 2786
3280af22
NIS
2787 PL_Sv = tSv; /* Restore global temporaries. */
2788 PL_Xpv = tXpv;
53bb94e2 2789 return;
79072805 2790}
4e35701f
NIS
2791
2792
51371543 2793static void
8772537c 2794S_restore_magic(pTHX_ const void *p)
51371543 2795{
97aff369 2796 dVAR;
8772537c
AL
2797 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
2798 SV* const sv = mgs->mgs_sv;
51371543
GS
2799
2800 if (!sv)
2801 return;
2802
2803 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2804 {
f8c7b90f 2805#ifdef PERL_OLD_COPY_ON_WRITE
f9701176
NC
2806 /* While magic was saved (and off) sv_setsv may well have seen
2807 this SV as a prime candidate for COW. */
2808 if (SvIsCOW(sv))
e424a81e 2809 sv_force_normal_flags(sv, 0);
f9701176
NC
2810#endif
2811
51371543
GS
2812 if (mgs->mgs_flags)
2813 SvFLAGS(sv) |= mgs->mgs_flags;
2814 else
2815 mg_magical(sv);
2b77b520
YST
2816 if (SvGMAGICAL(sv)) {
2817 /* downgrade public flags to private,
2818 and discard any other private flags */
2819
10edeb5d
JH
2820 const U32 pubflags = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
2821 if (pubflags) {
2822 SvFLAGS(sv) &= ~( pubflags | (SVp_IOK|SVp_NOK|SVp_POK) );
2823 SvFLAGS(sv) |= ( pubflags << PRIVSHIFT );
2b77b520
YST
2824 }
2825 }
51371543
GS
2826 }
2827
2828 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2829
2830 /* If we're still on top of the stack, pop us off. (That condition
2831 * will be satisfied if restore_magic was called explicitly, but *not*
2832 * if it's being called via leave_scope.)
2833 * The reason for doing this is that otherwise, things like sv_2cv()
2834 * may leave alloc gunk on the savestack, and some code
2835 * (e.g. sighandler) doesn't expect that...
2836 */
2837 if (PL_savestack_ix == mgs->mgs_ss_ix)
2838 {
2839 I32 popval = SSPOPINT;
c76ac1ee 2840 assert(popval == SAVEt_DESTRUCTOR_X);
51371543
GS
2841 PL_savestack_ix -= 2;
2842 popval = SSPOPINT;
2843 assert(popval == SAVEt_ALLOC);
2844 popval = SSPOPINT;
2845 PL_savestack_ix -= popval;
2846 }
2847
2848}
2849
2850static void
8772537c 2851S_unwind_handler_stack(pTHX_ const void *p)
51371543 2852{
27da23d5 2853 dVAR;
e1ec3a88 2854 const U32 flags = *(const U32*)p;
51371543
GS
2855
2856 if (flags & 1)
2857 PL_savestack_ix -= 5; /* Unprotect save in progress. */
df3728a2 2858#if !defined(PERL_IMPLICIT_CONTEXT)
51371543 2859 if (flags & 64)
27da23d5 2860 SvREFCNT_dec(PL_sig_sv);
df3728a2 2861#endif
51371543 2862}
1018e26f 2863
66610fdd 2864/*
b3ca2e83
NC
2865=for apidoc magic_sethint
2866
2867Triggered by a store to %^H, records the key/value pair to
c28fe1ec
NC
2868C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
2869anything that would need a deep copy. Maybe we should warn if we find a
2870reference.
b3ca2e83
NC
2871
2872=cut
2873*/
2874int
2875Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
2876{
2877 dVAR;
2878 assert(mg->mg_len == HEf_SVKEY);
2879
e6e3e454
NC
2880 /* mg->mg_obj isn't being used. If needed, it would be possible to store
2881 an alternative leaf in there, with PL_compiling.cop_hints being used if
2882 it's NULL. If needed for threads, the alternative could lock a mutex,
2883 or take other more complex action. */
2884
5b9c0671
NC
2885 /* Something changed in %^H, so it will need to be restored on scope exit.
2886 Doing this here saves a lot of doing it manually in perl code (and
2887 forgetting to do it, and consequent subtle errors. */
2888 PL_hints |= HINT_LOCALIZE_HH;
c28fe1ec
NC
2889 PL_compiling.cop_hints_hash
2890 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
ec2a1de7 2891 (SV *)mg->mg_ptr, sv);
b3ca2e83
NC
2892 return 0;
2893}
2894
2895/*
2896=for apidoc magic_sethint
2897
c28fe1ec
NC
2898Triggered by a delete from %^H, records the key to
2899C<PL_compiling.cop_hints_hash>.
b3ca2e83
NC
2900
2901=cut
2902*/
2903int
2904Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
2905{
2906 dVAR;
f5a63d97
AL
2907 PERL_UNUSED_ARG(sv);
2908
b3ca2e83
NC
2909 assert(mg->mg_len == HEf_SVKEY);
2910
b3f24c00
MHM
2911 PERL_UNUSED_ARG(sv);
2912
5b9c0671 2913 PL_hints |= HINT_LOCALIZE_HH;
c28fe1ec
NC
2914 PL_compiling.cop_hints_hash
2915 = Perl_refcounted_he_new(aTHX_ PL_compiling.cop_hints_hash,
b3ca2e83
NC
2916 (SV *)mg->mg_ptr, &PL_sv_placeholder);
2917 return 0;
2918}
2919
2920/*
66610fdd
RGS
2921 * Local variables:
2922 * c-indentation-style: bsd
2923 * c-basic-offset: 4
2924 * indent-tabs-mode: t
2925 * End:
2926 *
37442d52
RGS
2927 * ex: set ts=8 sts=4 sw=4 noet:
2928 */