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