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