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