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