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