This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [ID 20001129.009] Not OK: perl v5.7.0 +DEVEL7928 on os2-64int-ld 2.30 (UNINSTALLED)
[perl5.git] / mg.c
CommitLineData
a0d0e21e 1/* mg.c
79072805 2 *
3818b22b 3 * Copyright (c) 1991-2000, Larry Wall
79072805
LW
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
a0d0e21e
LW
8 */
9
10/*
11 * "Sam sat on the ground and put his head in his hands. 'I wish I had never
12 * come here, and I don't want to see no more magic,' he said, and fell silent."
79072805
LW
13 */
14
15#include "EXTERN.h"
864dbfa3 16#define PERL_IN_MG_C
79072805
LW
17#include "perl.h"
18
5cd24f17 19#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
188ea221
CS
20# ifndef NGROUPS
21# define NGROUPS 32
22# endif
23#endif
24
51371543
GS
25static void restore_magic(pTHXo_ void *p);
26static void unwind_handler_stack(pTHXo_ void *p);
27
c07a80fd 28/*
29 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
30 */
31
32struct magic_state {
33 SV* mgs_sv;
34 U32 mgs_flags;
455ece5e 35 I32 mgs_ss_ix;
c07a80fd 36};
455ece5e 37/* MGS is typedef'ed to struct magic_state in perl.h */
76e3520e
GS
38
39STATIC void
cea2e8a9 40S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
c07a80fd 41{
46124e9e 42 dTHR;
455ece5e 43 MGS* mgs;
c07a80fd 44 assert(SvMAGICAL(sv));
45
c76ac1ee 46 SAVEDESTRUCTOR_X(restore_magic, (void*)mgs_ix);
455ece5e
AD
47
48 mgs = SSPTR(mgs_ix, MGS*);
c07a80fd 49 mgs->mgs_sv = sv;
50 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
455ece5e 51 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
c07a80fd 52
53 SvMAGICAL_off(sv);
54 SvREADONLY_off(sv);
55 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
c07a80fd 56}
57
954c1994
GS
58/*
59=for apidoc mg_magical
60
61Turns on the magical status of an SV. See C<sv_magic>.
62
63=cut
64*/
65
8990e307 66void
864dbfa3 67Perl_mg_magical(pTHX_ SV *sv)
8990e307
LW
68{
69 MAGIC* mg;
70 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
71 MGVTBL* vtbl = mg->mg_virtual;
72 if (vtbl) {
2b260de0 73 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
8990e307
LW
74 SvGMAGICAL_on(sv);
75 if (vtbl->svt_set)
76 SvSMAGICAL_on(sv);
2b260de0 77 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
8990e307
LW
78 SvRMAGICAL_on(sv);
79 }
80 }
81}
82
954c1994
GS
83/*
84=for apidoc mg_get
85
86Do magic after a value is retrieved from the SV. See C<sv_magic>.
87
88=cut
89*/
90
79072805 91int
864dbfa3 92Perl_mg_get(pTHX_ SV *sv)
79072805 93{
46124e9e 94 dTHR;
455ece5e 95 I32 mgs_ix;
79072805 96 MAGIC* mg;
c6496cc7 97 MAGIC** mgp;
760ac839 98 int mgp_valid = 0;
463ee0b2 99
455ece5e
AD
100 mgs_ix = SSNEW(sizeof(MGS));
101 save_magic(mgs_ix, sv);
463ee0b2 102
c6496cc7 103 mgp = &SvMAGIC(sv);
104 while ((mg = *mgp) != 0) {
79072805 105 MGVTBL* vtbl = mg->mg_virtual;
2b260de0 106 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
316ad4fe 107 CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
c6496cc7 108 /* Ignore this magic if it's been deleted */
48e43a1c
CS
109 if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) &&
110 (mg->mg_flags & MGf_GSKIP))
455ece5e 111 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
a0d0e21e 112 }
c6496cc7 113 /* Advance to next magic (complicated by possible deletion) */
760ac839 114 if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
c6496cc7 115 mgp = &mg->mg_moremagic;
760ac839
LW
116 mgp_valid = 1;
117 }
118 else
119 mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
79072805 120 }
463ee0b2 121
51371543 122 restore_magic(aTHXo_ (void*)mgs_ix);
79072805
LW
123 return 0;
124}
125
954c1994
GS
126/*
127=for apidoc mg_set
128
129Do magic after a value is assigned to the SV. See C<sv_magic>.
130
131=cut
132*/
133
79072805 134int
864dbfa3 135Perl_mg_set(pTHX_ SV *sv)
79072805 136{
46124e9e 137 dTHR;
455ece5e 138 I32 mgs_ix;
79072805 139 MAGIC* mg;
463ee0b2
LW
140 MAGIC* nextmg;
141
455ece5e
AD
142 mgs_ix = SSNEW(sizeof(MGS));
143 save_magic(mgs_ix, sv);
463ee0b2
LW
144
145 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
79072805 146 MGVTBL* vtbl = mg->mg_virtual;
463ee0b2 147 nextmg = mg->mg_moremagic; /* it may delete itself */
a0d0e21e
LW
148 if (mg->mg_flags & MGf_GSKIP) {
149 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
455ece5e 150 (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
a0d0e21e 151 }
2b260de0 152 if (vtbl && vtbl->svt_set)
fc0dc3b3 153 CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
79072805 154 }
463ee0b2 155
51371543 156 restore_magic(aTHXo_ (void*)mgs_ix);
79072805
LW
157 return 0;
158}
159
954c1994
GS
160/*
161=for apidoc mg_length
162
163Report on the SV's length. See C<sv_magic>.
164
165=cut
166*/
167
79072805 168U32
864dbfa3 169Perl_mg_length(pTHX_ SV *sv)
79072805
LW
170{
171 MAGIC* mg;
748a9306 172 char *junk;
463ee0b2 173 STRLEN len;
463ee0b2 174
79072805
LW
175 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
176 MGVTBL* vtbl = mg->mg_virtual;
2b260de0 177 if (vtbl && vtbl->svt_len) {
455ece5e 178 I32 mgs_ix;
48e43a1c 179
455ece5e
AD
180 mgs_ix = SSNEW(sizeof(MGS));
181 save_magic(mgs_ix, sv);
a0d0e21e 182 /* omit MGf_GSKIP -- not changed here */
fc0dc3b3 183 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
51371543 184 restore_magic(aTHXo_ (void*)mgs_ix);
85e6fe83
LW
185 return len;
186 }
187 }
188
748a9306 189 junk = SvPV(sv, len);
463ee0b2 190 return len;
79072805
LW
191}
192
93965878 193I32
864dbfa3 194Perl_mg_size(pTHX_ SV *sv)
93965878
NIS
195{
196 MAGIC* mg;
197 I32 len;
ac27b0f5 198
93965878
NIS
199 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
200 MGVTBL* vtbl = mg->mg_virtual;
2b260de0 201 if (vtbl && vtbl->svt_len) {
455ece5e
AD
202 I32 mgs_ix;
203
204 mgs_ix = SSNEW(sizeof(MGS));
205 save_magic(mgs_ix, sv);
93965878 206 /* omit MGf_GSKIP -- not changed here */
fc0dc3b3 207 len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
51371543 208 restore_magic(aTHXo_ (void*)mgs_ix);
93965878
NIS
209 return len;
210 }
211 }
212
213 switch(SvTYPE(sv)) {
214 case SVt_PVAV:
215 len = AvFILLp((AV *) sv); /* Fallback to non-tied array */
216 return len;
217 case SVt_PVHV:
218 /* FIXME */
219 default:
cea2e8a9 220 Perl_croak(aTHX_ "Size magic not implemented");
93965878
NIS
221 break;
222 }
223 return 0;
224}
225
954c1994
GS
226/*
227=for apidoc mg_clear
228
229Clear something magical that the SV represents. See C<sv_magic>.
230
231=cut
232*/
233
79072805 234int
864dbfa3 235Perl_mg_clear(pTHX_ SV *sv)
79072805 236{
455ece5e 237 I32 mgs_ix;
79072805 238 MAGIC* mg;
463ee0b2 239
455ece5e
AD
240 mgs_ix = SSNEW(sizeof(MGS));
241 save_magic(mgs_ix, sv);
463ee0b2 242
79072805
LW
243 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
244 MGVTBL* vtbl = mg->mg_virtual;
a0d0e21e
LW
245 /* omit GSKIP -- never set here */
246
2b260de0 247 if (vtbl && vtbl->svt_clear)
fc0dc3b3 248 CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
79072805 249 }
463ee0b2 250
51371543 251 restore_magic(aTHXo_ (void*)mgs_ix);
79072805
LW
252 return 0;
253}
254
954c1994
GS
255/*
256=for apidoc mg_find
257
258Finds the magic pointer for type matching the SV. See C<sv_magic>.
259
260=cut
261*/
262
93a17b20 263MAGIC*
864dbfa3 264Perl_mg_find(pTHX_ SV *sv, int type)
93a17b20
LW
265{
266 MAGIC* mg;
93a17b20
LW
267 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
268 if (mg->mg_type == type)
269 return mg;
270 }
271 return 0;
272}
273
954c1994
GS
274/*
275=for apidoc mg_copy
276
277Copies the magic from one SV to another. See C<sv_magic>.
278
279=cut
280*/
281
79072805 282int
864dbfa3 283Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
79072805 284{
463ee0b2 285 int count = 0;
79072805 286 MAGIC* mg;
463ee0b2
LW
287 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
288 if (isUPPER(mg->mg_type)) {
33c27489 289 sv_magic(nsv,
fd345fa8
MG
290 mg->mg_type == 'P' ? SvTIED_obj(sv, mg) :
291 (mg->mg_type == 'D' && mg->mg_obj) ? sv : mg->mg_obj,
33c27489 292 toLOWER(mg->mg_type), key, klen);
463ee0b2 293 count++;
79072805 294 }
79072805 295 }
463ee0b2 296 return count;
79072805
LW
297}
298
954c1994
GS
299/*
300=for apidoc mg_free
301
302Free any magic storage used by the SV. See C<sv_magic>.
303
304=cut
305*/
306
79072805 307int
864dbfa3 308Perl_mg_free(pTHX_ SV *sv)
79072805
LW
309{
310 MAGIC* mg;
311 MAGIC* moremagic;
312 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
313 MGVTBL* vtbl = mg->mg_virtual;
314 moremagic = mg->mg_moremagic;
2b260de0 315 if (vtbl && vtbl->svt_free)
fc0dc3b3 316 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
93a17b20 317 if (mg->mg_ptr && mg->mg_type != 'g')
565764a8 318 if (mg->mg_len >= 0)
88e89b8a 319 Safefree(mg->mg_ptr);
565764a8 320 else if (mg->mg_len == HEf_SVKEY)
88e89b8a 321 SvREFCNT_dec((SV*)mg->mg_ptr);
85e6fe83 322 if (mg->mg_flags & MGf_REFCOUNTED)
8990e307 323 SvREFCNT_dec(mg->mg_obj);
79072805
LW
324 Safefree(mg);
325 }
326 SvMAGIC(sv) = 0;
327 return 0;
328}
329
330#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
331#include <signal.h>
332#endif
333
942e002e 334U32
864dbfa3 335Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
6cef1e77
IZ
336{
337 dTHR;
6cef1e77 338 register REGEXP *rx;
6cef1e77 339
8f580fb8
IZ
340 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
341 if (mg->mg_obj) /* @+ */
342 return rx->nparens;
343 else /* @- */
344 return rx->lastparen;
345 }
ac27b0f5 346
942e002e 347 return (U32)-1;
6cef1e77
IZ
348}
349
350int
864dbfa3 351Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
6cef1e77
IZ
352{
353 dTHR;
354 register I32 paren;
cf93c79d 355 register I32 s;
6cef1e77
IZ
356 register I32 i;
357 register REGEXP *rx;
cf93c79d 358 I32 t;
6cef1e77
IZ
359
360 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
361 paren = mg->mg_len;
362 if (paren < 0)
363 return 0;
364 if (paren <= rx->nparens &&
cf93c79d
IZ
365 (s = rx->startp[paren]) != -1 &&
366 (t = rx->endp[paren]) != -1)
6cef1e77
IZ
367 {
368 if (mg->mg_obj) /* @+ */
cf93c79d 369 i = t;
6cef1e77 370 else /* @- */
cf93c79d 371 i = s;
6cef1e77
IZ
372 sv_setiv(sv,i);
373 }
374 }
375 return 0;
376}
377
e4b89193 378int
a29d06ed
MG
379Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
380{
381 dTHR;
382 Perl_croak(aTHX_ PL_no_modify);
e4b89193
GS
383 /* NOT REACHED */
384 return 0;
a29d06ed
MG
385}
386
93a17b20 387U32
864dbfa3 388Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
93a17b20 389{
a863c7d1 390 dTHR;
93a17b20 391 register I32 paren;
93a17b20 392 register I32 i;
d9f97599 393 register REGEXP *rx;
a197cbdd 394 I32 s1, t1;
93a17b20
LW
395
396 switch (*mg->mg_ptr) {
397 case '1': case '2': case '3': case '4':
398 case '5': case '6': case '7': case '8': case '9': case '&':
3280af22 399 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
cf93c79d 400
93a17b20
LW
401 paren = atoi(mg->mg_ptr);
402 getparen:
d9f97599 403 if (paren <= rx->nparens &&
cf93c79d
IZ
404 (s1 = rx->startp[paren]) != -1 &&
405 (t1 = rx->endp[paren]) != -1)
bbce6d69 406 {
cf93c79d 407 i = t1 - s1;
a197cbdd
GS
408 getlen:
409 if (i > 0 && (PL_curpm->op_pmdynflags & PMdf_UTF8) && !IN_BYTE) {
410 char *s = rx->subbeg + s1;
411 char *send = rx->subbeg + t1;
412 i = 0;
413 while (s < send) {
414 s += UTF8SKIP(s);
415 i++;
416 }
417 }
71be2cbc 418 if (i >= 0)
93a17b20 419 return i;
93a17b20 420 }
93a17b20 421 }
748a9306 422 return 0;
93a17b20 423 case '+':
3280af22 424 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
d9f97599 425 paren = rx->lastparen;
13f57bf8
CS
426 if (paren)
427 goto getparen;
93a17b20 428 }
748a9306 429 return 0;
93a17b20 430 case '`':
3280af22 431 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
cf93c79d
IZ
432 if (rx->startp[0] != -1) {
433 i = rx->startp[0];
a197cbdd
GS
434 if (i > 0) {
435 s1 = 0;
436 t1 = i;
437 goto getlen;
438 }
93a17b20 439 }
93a17b20 440 }
748a9306 441 return 0;
93a17b20 442 case '\'':
3280af22 443 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
cf93c79d
IZ
444 if (rx->endp[0] != -1) {
445 i = rx->sublen - rx->endp[0];
a197cbdd
GS
446 if (i > 0) {
447 s1 = rx->endp[0];
448 t1 = rx->sublen;
449 goto getlen;
450 }
93a17b20 451 }
93a17b20 452 }
748a9306 453 return 0;
93a17b20 454 case ',':
3280af22 455 return (STRLEN)PL_ofslen;
93a17b20 456 case '\\':
3280af22 457 return (STRLEN)PL_orslen;
93a17b20
LW
458 }
459 magic_get(sv,mg);
2d8e6c8d
GS
460 if (!SvPOK(sv) && SvNIOK(sv)) {
461 STRLEN n_a;
462 sv_2pv(sv, &n_a);
463 }
93a17b20
LW
464 if (SvPOK(sv))
465 return SvCUR(sv);
466 return 0;
467}
468
79072805 469int
864dbfa3 470Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
79072805 471{
a863c7d1 472 dTHR;
79072805
LW
473 register I32 paren;
474 register char *s;
475 register I32 i;
d9f97599 476 register REGEXP *rx;
79072805
LW
477
478 switch (*mg->mg_ptr) {
748a9306 479 case '\001': /* ^A */
3280af22 480 sv_setsv(sv, PL_bodytarget);
748a9306 481 break;
49460fe6
NIS
482 case '\003': /* ^C */
483 sv_setiv(sv, (IV)PL_minus_c);
484 break;
485
79072805 486 case '\004': /* ^D */
3280af22 487 sv_setiv(sv, (IV)(PL_debug & 32767));
d056ab3f
GS
488#if defined(YYDEBUG) && defined(DEBUGGING)
489 PL_yydebug = (PL_debug & 1);
490#endif
79072805 491 break;
28f23441 492 case '\005': /* ^E */
cd39f2b6
JH
493#ifdef MACOS_TRADITIONAL
494 {
495 char msg[256];
ac27b0f5 496
bf4acbe4
GS
497 sv_setnv(sv,(double)gMacPerl_OSErr);
498 sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
cd39f2b6
JH
499 }
500#else
28f23441 501#ifdef VMS
502 {
503# include <descrip.h>
504# include <starlet.h>
505 char msg[255];
506 $DESCRIPTOR(msgdsc,msg);
65202027 507 sv_setnv(sv,(NV) vaxc$errno);
28f23441 508 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
509 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
510 else
511 sv_setpv(sv,"");
512 }
513#else
88e89b8a 514#ifdef OS2
fb73857a 515 if (!(_emx_env & 0x200)) { /* Under DOS */
65202027 516 sv_setnv(sv, (NV)errno);
fb73857a 517 sv_setpv(sv, errno ? Strerror(errno) : "");
518 } else {
017f25f1
IZ
519 if (errno != errno_isOS2) {
520 int tmp = _syserrno();
521 if (tmp) /* 2nd call to _syserrno() makes it 0 */
522 Perl_rc = tmp;
523 }
65202027 524 sv_setnv(sv, (NV)Perl_rc);
fb73857a 525 sv_setpv(sv, os2error(Perl_rc));
526 }
88e89b8a 527#else
22fae026
TM
528#ifdef WIN32
529 {
530 DWORD dwErr = GetLastError();
65202027 531 sv_setnv(sv, (NV)dwErr);
22fae026 532 if (dwErr)
76e3520e 533 {
0cb96387 534 PerlProc_GetOSError(sv, dwErr);
76e3520e 535 }
22fae026
TM
536 else
537 sv_setpv(sv, "");
538 SetLastError(dwErr);
539 }
540#else
65202027 541 sv_setnv(sv, (NV)errno);
28f23441 542 sv_setpv(sv, errno ? Strerror(errno) : "");
543#endif
88e89b8a 544#endif
22fae026 545#endif
cd39f2b6 546#endif
946ec16e 547 SvNOK_on(sv); /* what a wonderful hack! */
28f23441 548 break;
79072805 549 case '\006': /* ^F */
3280af22 550 sv_setiv(sv, (IV)PL_maxsysfd);
79072805 551 break;
a0d0e21e 552 case '\010': /* ^H */
3280af22 553 sv_setiv(sv, (IV)PL_hints);
a0d0e21e 554 break;
9d116dd7 555 case '\011': /* ^I */ /* NOT \t in EBCDIC */
3280af22
NIS
556 if (PL_inplace)
557 sv_setpv(sv, PL_inplace);
79072805 558 else
3280af22 559 sv_setsv(sv, &PL_sv_undef);
79072805 560 break;
ac27b0f5
NIS
561 case '\017': /* ^O & ^OPEN */
562 if (*(mg->mg_ptr+1) == '\0')
563 sv_setpv(sv, PL_osname);
564 else if (strEQ(mg->mg_ptr, "\017PEN")) {
565 if (!PL_compiling.cop_io)
566 sv_setsv(sv, &PL_sv_undef);
567 else {
568 sv_setsv(sv, PL_compiling.cop_io);
569 }
570 }
28f23441 571 break;
79072805 572 case '\020': /* ^P */
3280af22 573 sv_setiv(sv, (IV)PL_perldb);
79072805 574 break;
fb73857a 575 case '\023': /* ^S */
d58bf5aa
MB
576 {
577 dTHR;
3280af22 578 if (PL_lex_state != LEX_NOTPARSING)
155aba94 579 (void)SvOK_off(sv);
3280af22 580 else if (PL_in_eval)
6dc8a9e4 581 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
d58bf5aa 582 }
fb73857a 583 break;
79072805 584 case '\024': /* ^T */
88e89b8a 585#ifdef BIG_TIME
6b88bc9c 586 sv_setnv(sv, PL_basetime);
88e89b8a 587#else
3280af22 588 sv_setiv(sv, (IV)PL_basetime);
88e89b8a 589#endif
79072805 590 break;
46487f74 591 case '\027': /* ^W & $^WARNING_BITS & ^WIDE_SYSTEM_CALLS */
4438c4b7
JH
592 if (*(mg->mg_ptr+1) == '\0')
593 sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
6a818117 594 else if (strEQ(mg->mg_ptr, "\027ARNING_BITS")) {
d3a7d8c7
GS
595 if (PL_compiling.cop_warnings == pWARN_NONE ||
596 PL_compiling.cop_warnings == pWARN_STD)
4438c4b7
JH
597 {
598 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
599 }
d3a7d8c7 600 else if (PL_compiling.cop_warnings == pWARN_ALL) {
4438c4b7 601 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
ac27b0f5 602 }
4438c4b7
JH
603 else {
604 sv_setsv(sv, PL_compiling.cop_warnings);
ac27b0f5 605 }
d3a7d8c7 606 SvPOK_only(sv);
4438c4b7 607 }
46487f74
GS
608 else if (strEQ(mg->mg_ptr, "\027IDE_SYSTEM_CALLS"))
609 sv_setiv(sv, (IV)PL_widesyscalls);
79072805
LW
610 break;
611 case '1': case '2': case '3': case '4':
612 case '5': case '6': case '7': case '8': case '9': case '&':
3280af22 613 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
cf93c79d
IZ
614 I32 s1, t1;
615
a863c7d1
MB
616 /*
617 * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
618 * XXX Does the new way break anything?
619 */
620 paren = atoi(mg->mg_ptr);
79072805 621 getparen:
d9f97599 622 if (paren <= rx->nparens &&
cf93c79d
IZ
623 (s1 = rx->startp[paren]) != -1 &&
624 (t1 = rx->endp[paren]) != -1)
bbce6d69 625 {
cf93c79d
IZ
626 i = t1 - s1;
627 s = rx->subbeg + s1;
01ec43d0 628 if (!rx->subbeg)
c2e66d9e
GS
629 break;
630
13f57bf8 631 getrx:
748a9306 632 if (i >= 0) {
13f57bf8 633 bool was_tainted;
3280af22
NIS
634 if (PL_tainting) {
635 was_tainted = PL_tainted;
636 PL_tainted = FALSE;
13f57bf8 637 }
cf93c79d 638 sv_setpvn(sv, s, i);
7e2040f0
GS
639 if ((PL_curpm->op_pmdynflags & PMdf_UTF8) && !IN_BYTE)
640 SvUTF8_on(sv);
641 else
642 SvUTF8_off(sv);
3280af22
NIS
643 if (PL_tainting)
644 PL_tainted = (was_tainted || RX_MATCH_TAINTED(rx));
748a9306
LW
645 break;
646 }
79072805 647 }
79072805 648 }
3280af22 649 sv_setsv(sv,&PL_sv_undef);
79072805
LW
650 break;
651 case '+':
3280af22 652 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
d9f97599 653 paren = rx->lastparen;
a0d0e21e
LW
654 if (paren)
655 goto getparen;
79072805 656 }
3280af22 657 sv_setsv(sv,&PL_sv_undef);
79072805
LW
658 break;
659 case '`':
3280af22 660 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
cf93c79d
IZ
661 if ((s = rx->subbeg) && rx->startp[0] != -1) {
662 i = rx->startp[0];
13f57bf8 663 goto getrx;
79072805 664 }
79072805 665 }
3280af22 666 sv_setsv(sv,&PL_sv_undef);
79072805
LW
667 break;
668 case '\'':
3280af22 669 if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
cf93c79d
IZ
670 if (rx->subbeg && rx->endp[0] != -1) {
671 s = rx->subbeg + rx->endp[0];
672 i = rx->sublen - rx->endp[0];
13f57bf8 673 goto getrx;
79072805 674 }
79072805 675 }
3280af22 676 sv_setsv(sv,&PL_sv_undef);
79072805
LW
677 break;
678 case '.':
679#ifndef lint
3280af22
NIS
680 if (GvIO(PL_last_in_gv)) {
681 sv_setiv(sv, (IV)IoLINES(GvIO(PL_last_in_gv)));
79072805
LW
682 }
683#endif
684 break;
685 case '?':
809a5acc 686 {
809a5acc 687 sv_setiv(sv, (IV)STATUS_CURRENT);
ff0cee69 688#ifdef COMPLEX_STATUS
6b88bc9c
GS
689 LvTARGOFF(sv) = PL_statusvalue;
690 LvTARGLEN(sv) = PL_statusvalue_vms;
ff0cee69 691#endif
809a5acc 692 }
79072805
LW
693 break;
694 case '^':
3280af22 695 s = IoTOP_NAME(GvIOp(PL_defoutgv));
79072805
LW
696 if (s)
697 sv_setpv(sv,s);
698 else {
3280af22 699 sv_setpv(sv,GvENAME(PL_defoutgv));
79072805
LW
700 sv_catpv(sv,"_TOP");
701 }
702 break;
703 case '~':
3280af22 704 s = IoFMT_NAME(GvIOp(PL_defoutgv));
79072805 705 if (!s)
3280af22 706 s = GvENAME(PL_defoutgv);
79072805
LW
707 sv_setpv(sv,s);
708 break;
709#ifndef lint
710 case '=':
3280af22 711 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
79072805
LW
712 break;
713 case '-':
3280af22 714 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
79072805
LW
715 break;
716 case '%':
3280af22 717 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
79072805
LW
718 break;
719#endif
720 case ':':
721 break;
722 case '/':
723 break;
724 case '[':
3280af22 725 WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
79072805
LW
726 break;
727 case '|':
3280af22 728 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
79072805
LW
729 break;
730 case ',':
3280af22 731 sv_setpvn(sv,PL_ofs,PL_ofslen);
79072805
LW
732 break;
733 case '\\':
3280af22 734 sv_setpvn(sv,PL_ors,PL_orslen);
79072805
LW
735 break;
736 case '#':
3280af22 737 sv_setpv(sv,PL_ofmt);
79072805
LW
738 break;
739 case '!':
a5f75d66 740#ifdef VMS
65202027 741 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
88e89b8a 742 sv_setpv(sv, errno ? Strerror(errno) : "");
a5f75d66 743#else
88e89b8a 744 {
745 int saveerrno = errno;
65202027 746 sv_setnv(sv, (NV)errno);
88e89b8a 747#ifdef OS2
ed344e4f
IZ
748 if (errno == errno_isOS2 || errno == errno_isOS2_set)
749 sv_setpv(sv, os2error(Perl_rc));
88e89b8a 750 else
a5f75d66 751#endif
2304df62 752 sv_setpv(sv, errno ? Strerror(errno) : "");
88e89b8a 753 errno = saveerrno;
754 }
755#endif
946ec16e 756 SvNOK_on(sv); /* what a wonderful hack! */
79072805
LW
757 break;
758 case '<':
3280af22 759 sv_setiv(sv, (IV)PL_uid);
79072805
LW
760 break;
761 case '>':
3280af22 762 sv_setiv(sv, (IV)PL_euid);
79072805
LW
763 break;
764 case '(':
3280af22 765 sv_setiv(sv, (IV)PL_gid);
a52cb5f7 766#ifdef HAS_GETGROUPS
785fb66b 767 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_gid);
a52cb5f7 768#endif
79072805
LW
769 goto add_groups;
770 case ')':
3280af22 771 sv_setiv(sv, (IV)PL_egid);
a52cb5f7 772#ifdef HAS_GETGROUPS
785fb66b 773 Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_egid);
a52cb5f7 774#endif
79072805 775 add_groups:
79072805 776#ifdef HAS_GETGROUPS
79072805 777 {
a0d0e21e 778 Groups_t gary[NGROUPS];
79072805 779 i = getgroups(NGROUPS,gary);
46fc3d4c 780 while (--i >= 0)
785fb66b 781 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, gary[i]);
79072805
LW
782 }
783#endif
155aba94 784 (void)SvIOK_on(sv); /* what a wonderful hack! */
79072805
LW
785 break;
786 case '*':
787 break;
cd39f2b6 788#ifndef MACOS_TRADITIONAL
79072805
LW
789 case '0':
790 break;
cd39f2b6 791#endif
a863c7d1
MB
792#ifdef USE_THREADS
793 case '@':
38a03e6e 794 sv_setsv(sv, thr->errsv);
a863c7d1
MB
795 break;
796#endif /* USE_THREADS */
79072805 797 }
a0d0e21e 798 return 0;
79072805
LW
799}
800
801int
864dbfa3 802Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
79072805
LW
803{
804 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
805
806 if (uf && uf->uf_val)
807 (*uf->uf_val)(uf->uf_index, sv);
808 return 0;
809}
810
811int
864dbfa3 812Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
79072805
LW
813{
814 register char *s;
88e89b8a 815 char *ptr;
5aabfad6 816 STRLEN len, klen;
a0d0e21e 817 I32 i;
1e422769 818
a0d0e21e 819 s = SvPV(sv,len);
5aabfad6 820 ptr = MgPV(mg,klen);
88e89b8a 821 my_setenv(ptr, s);
1e422769 822
a0d0e21e
LW
823#ifdef DYNAMIC_ENV_FETCH
824 /* We just undefd an environment var. Is a replacement */
825 /* waiting in the wings? */
826 if (!len) {
5aabfad6 827 SV **valp;
6b88bc9c 828 if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
5aabfad6 829 s = SvPV(*valp, len);
a0d0e21e
LW
830 }
831#endif
1e422769 832
39e571d4 833#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
79072805
LW
834 /* And you'll never guess what the dog had */
835 /* in its mouth... */
3280af22 836 if (PL_tainting) {
1e422769 837 MgTAINTEDDIR_off(mg);
838#ifdef VMS
5aabfad6 839 if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
1e422769 840 char pathbuf[256], eltbuf[256], *cp, *elt = s;
841 struct stat sbuf;
842 int i = 0, j = 0;
843
844 do { /* DCL$PATH may be a search list */
845 while (1) { /* as may dev portion of any element */
846 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
847 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
848 cando_by_name(S_IWUSR,0,elt) ) {
849 MgTAINTEDDIR_on(mg);
850 return 0;
851 }
852 }
853 if ((cp = strchr(elt, ':')) != Nullch)
854 *cp = '\0';
855 if (my_trnlnm(elt, eltbuf, j++))
856 elt = eltbuf;
857 else
858 break;
859 }
860 j = 0;
861 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
862 }
863#endif /* VMS */
5aabfad6 864 if (s && klen == 4 && strEQ(ptr,"PATH")) {
a0d0e21e 865 char *strend = s + len;
463ee0b2
LW
866
867 while (s < strend) {
96827780 868 char tmpbuf[256];
1e422769 869 struct stat st;
96827780 870 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
fc36a67e 871 s, strend, ':', &i);
463ee0b2 872 s++;
96827780
MB
873 if (i >= sizeof tmpbuf /* too long -- assume the worst */
874 || *tmpbuf != '/'
c6ed36e1 875 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
8990e307 876 MgTAINTEDDIR_on(mg);
1e422769 877 return 0;
878 }
463ee0b2 879 }
79072805
LW
880 }
881 }
39e571d4 882#endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
1e422769 883
79072805
LW
884 return 0;
885}
886
887int
864dbfa3 888Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
85e6fe83 889{
2d8e6c8d
GS
890 STRLEN n_a;
891 my_setenv(MgPV(mg,n_a),Nullch);
85e6fe83
LW
892 return 0;
893}
894
88e89b8a 895int
864dbfa3 896Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
fb73857a 897{
898#if defined(VMS)
cea2e8a9 899 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
fb73857a 900#else
d58bf5aa 901 dTHR;
3280af22 902 if (PL_localizing) {
fb73857a 903 HE* entry;
2d8e6c8d 904 STRLEN n_a;
fb73857a 905 magic_clear_all_env(sv,mg);
906 hv_iterinit((HV*)sv);
155aba94 907 while ((entry = hv_iternext((HV*)sv))) {
fb73857a 908 I32 keylen;
909 my_setenv(hv_iterkey(entry, &keylen),
2d8e6c8d 910 SvPV(hv_iterval((HV*)sv, entry), n_a));
fb73857a 911 }
912 }
913#endif
914 return 0;
915}
916
917int
864dbfa3 918Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
66b1d557 919{
ed79a026 920#if defined(VMS) || defined(EPOC)
cea2e8a9 921 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
3e3baf6d 922#else
7766f137
GS
923# ifdef PERL_IMPLICIT_SYS
924 PerlEnv_clearenv();
925# else
926# ifdef WIN32
3e3baf6d
TB
927 char *envv = GetEnvironmentStrings();
928 char *cur = envv;
929 STRLEN len;
930 while (*cur) {
931 char *end = strchr(cur,'=');
932 if (end && end != cur) {
933 *end = '\0';
934 my_setenv(cur,Nullch);
935 *end = '=';
ac5c734f 936 cur = end + strlen(end+1)+2;
3e3baf6d
TB
937 }
938 else if ((len = strlen(cur)))
939 cur += len+1;
940 }
941 FreeEnvironmentStrings(envv);
7766f137
GS
942# else
943# ifndef PERL_USE_SAFE_PUTENV
66b1d557
HM
944 I32 i;
945
3280af22 946 if (environ == PL_origenviron)
f2517201 947 environ = (char**)safesysmalloc(sizeof(char*));
66b1d557
HM
948 else
949 for (i = 0; environ[i]; i++)
f2517201 950 safesysfree(environ[i]);
7766f137 951# endif /* PERL_USE_SAFE_PUTENV */
f2517201 952
66b1d557
HM
953 environ[0] = Nullch;
954
7766f137
GS
955# endif /* WIN32 */
956# endif /* PERL_IMPLICIT_SYS */
f2517201 957#endif /* VMS */
3e3baf6d 958 return 0;
66b1d557
HM
959}
960
64ca3a65 961#ifndef PERL_MICRO
66b1d557 962int
864dbfa3 963Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 964{
965 I32 i;
2d8e6c8d 966 STRLEN n_a;
88e89b8a 967 /* Are we fetching a signal entry? */
2d8e6c8d 968 i = whichsig(MgPV(mg,n_a));
88e89b8a 969 if (i) {
22c35a8c
GS
970 if(PL_psig_ptr[i])
971 sv_setsv(sv,PL_psig_ptr[i]);
88e89b8a 972 else {
ff68c719 973 Sighandler_t sigstate = rsignal_state(i);
974
88e89b8a 975 /* cache state so we don't fetch it again */
ff68c719 976 if(sigstate == SIG_IGN)
88e89b8a 977 sv_setpv(sv,"IGNORE");
978 else
3280af22 979 sv_setsv(sv,&PL_sv_undef);
22c35a8c 980 PL_psig_ptr[i] = SvREFCNT_inc(sv);
88e89b8a 981 SvTEMP_off(sv);
982 }
983 }
984 return 0;
985}
986int
864dbfa3 987Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
88e89b8a 988{
989 I32 i;
2d8e6c8d 990 STRLEN n_a;
88e89b8a 991 /* Are we clearing a signal entry? */
2d8e6c8d 992 i = whichsig(MgPV(mg,n_a));
88e89b8a 993 if (i) {
22c35a8c
GS
994 if(PL_psig_ptr[i]) {
995 SvREFCNT_dec(PL_psig_ptr[i]);
996 PL_psig_ptr[i]=0;
88e89b8a 997 }
22c35a8c
GS
998 if(PL_psig_name[i]) {
999 SvREFCNT_dec(PL_psig_name[i]);
1000 PL_psig_name[i]=0;
88e89b8a 1001 }
1002 }
1003 return 0;
1004}
3d37d572 1005
85e6fe83 1006int
864dbfa3 1007Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
79072805 1008{
11343788 1009 dTHR;
79072805
LW
1010 register char *s;
1011 I32 i;
748a9306 1012 SV** svp;
e72dc28c 1013 STRLEN len;
a0d0e21e 1014
e72dc28c 1015 s = MgPV(mg,len);
748a9306
LW
1016 if (*s == '_') {
1017 if (strEQ(s,"__DIE__"))
3280af22 1018 svp = &PL_diehook;
748a9306 1019 else if (strEQ(s,"__WARN__"))
3280af22 1020 svp = &PL_warnhook;
748a9306 1021 else
cea2e8a9 1022 Perl_croak(aTHX_ "No such hook: %s", s);
748a9306 1023 i = 0;
4633a7c4
LW
1024 if (*svp) {
1025 SvREFCNT_dec(*svp);
1026 *svp = 0;
1027 }
748a9306
LW
1028 }
1029 else {
1030 i = whichsig(s); /* ...no, a brick */
1031 if (!i) {
e476b1b5 1032 if (ckWARN(WARN_SIGNAL))
cea2e8a9 1033 Perl_warner(aTHX_ WARN_SIGNAL, "No such signal: SIG%s", s);
748a9306
LW
1034 return 0;
1035 }
22c35a8c
GS
1036 SvREFCNT_dec(PL_psig_name[i]);
1037 SvREFCNT_dec(PL_psig_ptr[i]);
1038 PL_psig_ptr[i] = SvREFCNT_inc(sv);
88e89b8a 1039 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
e72dc28c 1040 PL_psig_name[i] = newSVpvn(s, len);
22c35a8c 1041 SvREADONLY_on(PL_psig_name[i]);
748a9306 1042 }
a0d0e21e 1043 if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
748a9306 1044 if (i)
3280af22 1045 (void)rsignal(i, PL_sighandlerp);
748a9306
LW
1046 else
1047 *svp = SvREFCNT_inc(sv);
a0d0e21e
LW
1048 return 0;
1049 }
e72dc28c 1050 s = SvPV_force(sv,len);
748a9306
LW
1051 if (strEQ(s,"IGNORE")) {
1052 if (i)
ff68c719 1053 (void)rsignal(i, SIG_IGN);
748a9306
LW
1054 else
1055 *svp = 0;
1056 }
1057 else if (strEQ(s,"DEFAULT") || !*s) {
1058 if (i)
ff68c719 1059 (void)rsignal(i, SIG_DFL);
748a9306
LW
1060 else
1061 *svp = 0;
1062 }
79072805 1063 else {
5aabfad6 1064 /*
1065 * We should warn if HINT_STRICT_REFS, but without
1066 * access to a known hint bit in a known OP, we can't
1067 * tell whether HINT_STRICT_REFS is in force or not.
1068 */
46fc3d4c 1069 if (!strchr(s,':') && !strchr(s,'\''))
e72dc28c 1070 sv_insert(sv, 0, 0, "main::", 6);
748a9306 1071 if (i)
3280af22 1072 (void)rsignal(i, PL_sighandlerp);
748a9306
LW
1073 else
1074 *svp = SvREFCNT_inc(sv);
79072805
LW
1075 }
1076 return 0;
1077}
64ca3a65 1078#endif /* !PERL_MICRO */
79072805
LW
1079
1080int
864dbfa3 1081Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
79072805 1082{
3280af22 1083 PL_sub_generation++;
463ee0b2
LW
1084 return 0;
1085}
1086
1087int
864dbfa3 1088Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1089{
a0d0e21e 1090 /* HV_badAMAGIC_on(Sv_STASH(sv)); */
3280af22 1091 PL_amagic_generation++;
463ee0b2 1092
a0d0e21e
LW
1093 return 0;
1094}
463ee0b2 1095
946ec16e 1096int
864dbfa3 1097Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
6ff81951
GS
1098{
1099 HV *hv = (HV*)LvTARG(sv);
1100 HE *entry;
1101 I32 i = 0;
1102
1103 if (hv) {
1104 (void) hv_iterinit(hv);
33c27489 1105 if (! SvTIED_mg((SV*)hv, 'P'))
6ff81951
GS
1106 i = HvKEYS(hv);
1107 else {
1108 /*SUPPRESS 560*/
155aba94 1109 while ((entry = hv_iternext(hv))) {
6ff81951
GS
1110 i++;
1111 }
1112 }
1113 }
1114
1115 sv_setiv(sv, (IV)i);
1116 return 0;
1117}
1118
1119int
864dbfa3 1120Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
946ec16e 1121{
1122 if (LvTARG(sv)) {
1123 hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
946ec16e 1124 }
1125 return 0;
ac27b0f5 1126}
946ec16e 1127
e336de0d 1128/* caller is responsible for stack switching/cleanup */
565764a8 1129STATIC int
cea2e8a9 1130S_magic_methcall(pTHX_ SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
a0d0e21e
LW
1131{
1132 dSP;
463ee0b2 1133
924508f0
GS
1134 PUSHMARK(SP);
1135 EXTEND(SP, n);
33c27489 1136 PUSHs(SvTIED_obj(sv, mg));
ac27b0f5 1137 if (n > 1) {
93965878 1138 if (mg->mg_ptr) {
565764a8 1139 if (mg->mg_len >= 0)
79cb57f6 1140 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
565764a8 1141 else if (mg->mg_len == HEf_SVKEY)
93965878
NIS
1142 PUSHs((SV*)mg->mg_ptr);
1143 }
1144 else if (mg->mg_type == 'p') {
565764a8 1145 PUSHs(sv_2mortal(newSViv(mg->mg_len)));
93965878
NIS
1146 }
1147 }
1148 if (n > 2) {
1149 PUSHs(val);
88e89b8a 1150 }
463ee0b2
LW
1151 PUTBACK;
1152
864dbfa3 1153 return call_method(meth, flags);
946ec16e 1154}
1155
76e3520e 1156STATIC int
cea2e8a9 1157S_magic_methpack(pTHX_ SV *sv, MAGIC *mg, char *meth)
a0d0e21e
LW
1158{
1159 dSP;
463ee0b2 1160
a0d0e21e
LW
1161 ENTER;
1162 SAVETMPS;
e788e7d3 1163 PUSHSTACKi(PERLSI_MAGIC);
463ee0b2 1164
33c27489 1165 if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
3280af22 1166 sv_setsv(sv, *PL_stack_sp--);
93965878 1167 }
463ee0b2 1168
d3acc0f7 1169 POPSTACK;
a0d0e21e
LW
1170 FREETMPS;
1171 LEAVE;
1172 return 0;
1173}
463ee0b2 1174
a0d0e21e 1175int
864dbfa3 1176Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e
LW
1177{
1178 magic_methpack(sv,mg,"FETCH");
1179 if (mg->mg_ptr)
1180 mg->mg_flags |= MGf_GSKIP;
463ee0b2
LW
1181 return 0;
1182}
1183
1184int
864dbfa3 1185Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
e336de0d
GS
1186{
1187 dSP;
a60c0954 1188 ENTER;
e788e7d3 1189 PUSHSTACKi(PERLSI_MAGIC);
33c27489 1190 magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
d3acc0f7 1191 POPSTACK;
a60c0954 1192 LEAVE;
463ee0b2
LW
1193 return 0;
1194}
1195
1196int
864dbfa3 1197Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1198{
a0d0e21e
LW
1199 return magic_methpack(sv,mg,"DELETE");
1200}
463ee0b2 1201
93965878
NIS
1202
1203U32
864dbfa3 1204Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
ac27b0f5 1205{
e336de0d 1206 dSP;
93965878
NIS
1207 U32 retval = 0;
1208
1209 ENTER;
1210 SAVETMPS;
e788e7d3 1211 PUSHSTACKi(PERLSI_MAGIC);
33c27489 1212 if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
3280af22 1213 sv = *PL_stack_sp--;
a60c0954 1214 retval = (U32) SvIV(sv)-1;
93965878 1215 }
d3acc0f7 1216 POPSTACK;
93965878
NIS
1217 FREETMPS;
1218 LEAVE;
1219 return retval;
1220}
1221
cea2e8a9
GS
1222int
1223Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e
LW
1224{
1225 dSP;
463ee0b2 1226
e336de0d 1227 ENTER;
e788e7d3 1228 PUSHSTACKi(PERLSI_MAGIC);
924508f0 1229 PUSHMARK(SP);
33c27489 1230 XPUSHs(SvTIED_obj(sv, mg));
463ee0b2 1231 PUTBACK;
864dbfa3 1232 call_method("CLEAR", G_SCALAR|G_DISCARD);
d3acc0f7 1233 POPSTACK;
a60c0954 1234 LEAVE;
463ee0b2
LW
1235 return 0;
1236}
1237
1238int
864dbfa3 1239Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
463ee0b2 1240{
463ee0b2 1241 dSP;
dff6d3cd 1242 const char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
463ee0b2
LW
1243
1244 ENTER;
a0d0e21e 1245 SAVETMPS;
e788e7d3 1246 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
1247 PUSHMARK(SP);
1248 EXTEND(SP, 2);
33c27489 1249 PUSHs(SvTIED_obj(sv, mg));
463ee0b2
LW
1250 if (SvOK(key))
1251 PUSHs(key);
1252 PUTBACK;
1253
864dbfa3 1254 if (call_method(meth, G_SCALAR))
3280af22 1255 sv_setsv(key, *PL_stack_sp--);
463ee0b2 1256
d3acc0f7 1257 POPSTACK;
a0d0e21e
LW
1258 FREETMPS;
1259 LEAVE;
79072805
LW
1260 return 0;
1261}
1262
1263int
864dbfa3 1264Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e
LW
1265{
1266 return magic_methpack(sv,mg,"EXISTS");
ac27b0f5 1267}
a0d0e21e
LW
1268
1269int
864dbfa3 1270Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
79072805 1271{
11343788 1272 dTHR;
79072805
LW
1273 OP *o;
1274 I32 i;
1275 GV* gv;
1276 SV** svp;
2d8e6c8d 1277 STRLEN n_a;
79072805 1278
3280af22 1279 gv = PL_DBline;
79072805 1280 i = SvTRUE(sv);
188ea221 1281 svp = av_fetch(GvAV(gv),
2d8e6c8d 1282 atoi(MgPV(mg,n_a)), FALSE);
57b2e452 1283 if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp))))
93a17b20 1284 o->op_private = i;
79072805
LW
1285 return 0;
1286}
1287
1288int
864dbfa3 1289Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
79072805 1290{
0f15f207 1291 dTHR;
3280af22 1292 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
79072805
LW
1293 return 0;
1294}
1295
1296int
864dbfa3 1297Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
79072805 1298{
0f15f207 1299 dTHR;
3280af22 1300 av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
a0d0e21e
LW
1301 return 0;
1302}
1303
1304int
864dbfa3 1305Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e
LW
1306{
1307 SV* lsv = LvTARG(sv);
ac27b0f5 1308
a0d0e21e
LW
1309 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1310 mg = mg_find(lsv, 'g');
565764a8 1311 if (mg && mg->mg_len >= 0) {
0f15f207 1312 dTHR;
a0ed51b3 1313 I32 i = mg->mg_len;
7e2040f0 1314 if (DO_UTF8(lsv))
a0ed51b3
LW
1315 sv_pos_b2u(lsv, &i);
1316 sv_setiv(sv, i + PL_curcop->cop_arybase);
a0d0e21e
LW
1317 return 0;
1318 }
1319 }
1320 (void)SvOK_off(sv);
1321 return 0;
1322}
1323
1324int
864dbfa3 1325Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
a0d0e21e
LW
1326{
1327 SV* lsv = LvTARG(sv);
1328 SSize_t pos;
1329 STRLEN len;
c00206c8 1330 STRLEN ulen = 0;
c485e607 1331 dTHR;
a0d0e21e
LW
1332
1333 mg = 0;
ac27b0f5 1334
a0d0e21e
LW
1335 if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1336 mg = mg_find(lsv, 'g');
1337 if (!mg) {
1338 if (!SvOK(sv))
1339 return 0;
1340 sv_magic(lsv, (SV*)0, 'g', Nullch, 0);
1341 mg = mg_find(lsv, 'g');
1342 }
1343 else if (!SvOK(sv)) {
565764a8 1344 mg->mg_len = -1;
a0d0e21e
LW
1345 return 0;
1346 }
1347 len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1348
c485e607 1349 pos = SvIV(sv) - PL_curcop->cop_arybase;
a0ed51b3 1350
7e2040f0 1351 if (DO_UTF8(lsv)) {
a0ed51b3
LW
1352 ulen = sv_len_utf8(lsv);
1353 if (ulen)
1354 len = ulen;
a0ed51b3
LW
1355 }
1356
a0d0e21e
LW
1357 if (pos < 0) {
1358 pos += len;
1359 if (pos < 0)
1360 pos = 0;
1361 }
1362 else if (pos > len)
1363 pos = len;
a0ed51b3
LW
1364
1365 if (ulen) {
1366 I32 p = pos;
1367 sv_pos_u2b(lsv, &p, 0);
1368 pos = p;
1369 }
1370
565764a8 1371 mg->mg_len = pos;
71be2cbc 1372 mg->mg_flags &= ~MGf_MINMATCH;
a0d0e21e 1373
79072805
LW
1374 return 0;
1375}
1376
1377int
864dbfa3 1378Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
79072805 1379{
8646b087 1380 if (SvFAKE(sv)) { /* FAKE globs can get coerced */
1381 SvFAKE_off(sv);
946ec16e 1382 gv_efullname3(sv,((GV*)sv), "*");
8646b087 1383 SvFAKE_on(sv);
1384 }
1385 else
946ec16e 1386 gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */
79072805
LW
1387 return 0;
1388}
1389
1390int
864dbfa3 1391Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
79072805
LW
1392{
1393 register char *s;
1394 GV* gv;
2d8e6c8d 1395 STRLEN n_a;
79072805
LW
1396
1397 if (!SvOK(sv))
1398 return 0;
2d8e6c8d 1399 s = SvPV(sv, n_a);
79072805
LW
1400 if (*s == '*' && s[1])
1401 s++;
85e6fe83 1402 gv = gv_fetchpv(s,TRUE, SVt_PVGV);
79072805
LW
1403 if (sv == (SV*)gv)
1404 return 0;
1405 if (GvGP(sv))
88e89b8a 1406 gp_free((GV*)sv);
79072805 1407 GvGP(sv) = gp_ref(GvGP(gv));
79072805
LW
1408 return 0;
1409}
1410
1411int
864dbfa3 1412Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
6ff81951
GS
1413{
1414 STRLEN len;
1415 SV *lsv = LvTARG(sv);
1416 char *tmps = SvPV(lsv,len);
1417 I32 offs = LvTARGOFF(sv);
1418 I32 rem = LvTARGLEN(sv);
1419
1420 if (offs > len)
1421 offs = len;
1422 if (rem + offs > len)
1423 rem = len - offs;
1424 sv_setpvn(sv, tmps + offs, (STRLEN)rem);
2ef4b674
GS
1425 if (DO_UTF8(lsv))
1426 SvUTF8_on(sv);
6ff81951
GS
1427 return 0;
1428}
1429
1430int
864dbfa3 1431Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
79072805 1432{
8990e307
LW
1433 STRLEN len;
1434 char *tmps = SvPV(sv,len);
1435 sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
79072805
LW
1436 return 0;
1437}
1438
1439int
864dbfa3 1440Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1441{
a863c7d1 1442 dTHR;
565764a8 1443 TAINT_IF((mg->mg_len & 1) ||
155aba94 1444 ((mg->mg_len & 2) && mg->mg_obj == sv)); /* kludge */
463ee0b2
LW
1445 return 0;
1446}
1447
1448int
864dbfa3 1449Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
463ee0b2 1450{
11343788 1451 dTHR;
3280af22
NIS
1452 if (PL_localizing) {
1453 if (PL_localizing == 1)
565764a8 1454 mg->mg_len <<= 1;
748a9306 1455 else
565764a8 1456 mg->mg_len >>= 1;
a0d0e21e 1457 }
3280af22 1458 else if (PL_tainted)
565764a8 1459 mg->mg_len |= 1;
748a9306 1460 else
565764a8 1461 mg->mg_len &= ~1;
463ee0b2
LW
1462 return 0;
1463}
1464
1465int
864dbfa3 1466Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
6ff81951
GS
1467{
1468 SV *lsv = LvTARG(sv);
6ff81951
GS
1469
1470 if (!lsv) {
155aba94 1471 (void)SvOK_off(sv);
6ff81951
GS
1472 return 0;
1473 }
6ff81951 1474
81e118e0 1475 sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
6ff81951
GS
1476 return 0;
1477}
1478
1479int
864dbfa3 1480Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
79072805
LW
1481{
1482 do_vecset(sv); /* XXX slurp this routine */
1483 return 0;
1484}
1485
1486int
864dbfa3 1487Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
5f05dabc 1488{
71be2cbc 1489 SV *targ = Nullsv;
5f05dabc 1490 if (LvTARGLEN(sv)) {
68dc0745 1491 if (mg->mg_obj) {
74e13ce4
GS
1492 SV *ahv = LvTARG(sv);
1493 if (SvTYPE(ahv) == SVt_PVHV) {
1494 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1495 if (he)
1496 targ = HeVAL(he);
1497 }
1498 else {
1499 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, FALSE, 0);
1500 if (svp)
1501 targ = *svp;
1502 }
68dc0745 1503 }
1504 else {
3c78fafa 1505 AV* av = (AV*)LvTARG(sv);
68dc0745 1506 if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1507 targ = AvARRAY(av)[LvTARGOFF(sv)];
1508 }
3280af22 1509 if (targ && targ != &PL_sv_undef) {
e858de61 1510 dTHR; /* just for SvREFCNT_dec */
68dc0745 1511 /* somebody else defined it for us */
1512 SvREFCNT_dec(LvTARG(sv));
1513 LvTARG(sv) = SvREFCNT_inc(targ);
1514 LvTARGLEN(sv) = 0;
1515 SvREFCNT_dec(mg->mg_obj);
1516 mg->mg_obj = Nullsv;
1517 mg->mg_flags &= ~MGf_REFCOUNTED;
1518 }
5f05dabc 1519 }
71be2cbc 1520 else
1521 targ = LvTARG(sv);
3280af22 1522 sv_setsv(sv, targ ? targ : &PL_sv_undef);
71be2cbc 1523 return 0;
1524}
1525
1526int
864dbfa3 1527Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
71be2cbc 1528{
1529 if (LvTARGLEN(sv))
68dc0745 1530 vivify_defelem(sv);
1531 if (LvTARG(sv)) {
5f05dabc 1532 sv_setsv(LvTARG(sv), sv);
68dc0745 1533 SvSETMAGIC(LvTARG(sv));
1534 }
5f05dabc 1535 return 0;
1536}
1537
71be2cbc 1538void
864dbfa3 1539Perl_vivify_defelem(pTHX_ SV *sv)
71be2cbc 1540{
e858de61 1541 dTHR; /* just for SvREFCNT_inc and SvREFCNT_dec*/
74e13ce4
GS
1542 MAGIC *mg;
1543 SV *value = Nullsv;
71be2cbc 1544
68dc0745 1545 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, 'y')))
71be2cbc 1546 return;
68dc0745 1547 if (mg->mg_obj) {
74e13ce4 1548 SV *ahv = LvTARG(sv);
2d8e6c8d 1549 STRLEN n_a;
74e13ce4 1550 if (SvTYPE(ahv) == SVt_PVHV) {
af7f9c15 1551 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
74e13ce4
GS
1552 if (he)
1553 value = HeVAL(he);
1554 }
1555 else {
af7f9c15 1556 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, TRUE, 0);
74e13ce4
GS
1557 if (svp)
1558 value = *svp;
1559 }
3280af22 1560 if (!value || value == &PL_sv_undef)
cea2e8a9 1561 Perl_croak(aTHX_ PL_no_helem, SvPV(mg->mg_obj, n_a));
71be2cbc 1562 }
68dc0745 1563 else {
1564 AV* av = (AV*)LvTARG(sv);
5aabfad6 1565 if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
68dc0745 1566 LvTARG(sv) = Nullsv; /* array can't be extended */
1567 else {
1568 SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
3280af22 1569 if (!svp || (value = *svp) == &PL_sv_undef)
cea2e8a9 1570 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
68dc0745 1571 }
1572 }
3e3baf6d 1573 (void)SvREFCNT_inc(value);
68dc0745 1574 SvREFCNT_dec(LvTARG(sv));
1575 LvTARG(sv) = value;
71be2cbc 1576 LvTARGLEN(sv) = 0;
68dc0745 1577 SvREFCNT_dec(mg->mg_obj);
1578 mg->mg_obj = Nullsv;
1579 mg->mg_flags &= ~MGf_REFCOUNTED;
5f05dabc 1580}
1581
1582int
864dbfa3 1583Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
810b8aa5
GS
1584{
1585 AV *av = (AV*)mg->mg_obj;
1586 SV **svp = AvARRAY(av);
1587 I32 i = AvFILLp(av);
1588 while (i >= 0) {
1589 if (svp[i] && svp[i] != &PL_sv_undef) {
1590 if (!SvWEAKREF(svp[i]))
cea2e8a9 1591 Perl_croak(aTHX_ "panic: magic_killbackrefs");
810b8aa5
GS
1592 /* XXX Should we check that it hasn't changed? */
1593 SvRV(svp[i]) = 0;
155aba94 1594 (void)SvOK_off(svp[i]);
810b8aa5
GS
1595 SvWEAKREF_off(svp[i]);
1596 svp[i] = &PL_sv_undef;
1597 }
1598 i--;
1599 }
1600 return 0;
1601}
1602
1603int
864dbfa3 1604Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
93a17b20 1605{
565764a8 1606 mg->mg_len = -1;
c6496cc7 1607 SvSCREAM_off(sv);
93a17b20
LW
1608 return 0;
1609}
1610
1611int
864dbfa3 1612Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
79072805 1613{
463ee0b2 1614 sv_unmagic(sv, 'B');
79072805
LW
1615 SvVALID_off(sv);
1616 return 0;
1617}
1618
1619int
864dbfa3 1620Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
55497cff 1621{
1622 sv_unmagic(sv, 'f');
1623 SvCOMPILED_off(sv);
1624 return 0;
1625}
1626
1627int
864dbfa3 1628Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
79072805
LW
1629{
1630 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1631
1632 if (uf && uf->uf_set)
1633 (*uf->uf_set)(uf->uf_index, sv);
1634 return 0;
1635}
1636
c277df42 1637int
864dbfa3 1638Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
c277df42
IZ
1639{
1640 regexp *re = (regexp *)mg->mg_obj;
1641 ReREFCNT_dec(re);
1642 return 0;
1643}
1644
7a4c00b4 1645#ifdef USE_LOCALE_COLLATE
79072805 1646int
864dbfa3 1647Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
bbce6d69 1648{
1649 /*
838b5b74 1650 * RenE<eacute> Descartes said "I think not."
bbce6d69 1651 * and vanished with a faint plop.
1652 */
7a4c00b4 1653 if (mg->mg_ptr) {
1654 Safefree(mg->mg_ptr);
1655 mg->mg_ptr = NULL;
565764a8 1656 mg->mg_len = -1;
7a4c00b4 1657 }
bbce6d69 1658 return 0;
1659}
7a4c00b4 1660#endif /* USE_LOCALE_COLLATE */
bbce6d69 1661
1662int
864dbfa3 1663Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
79072805 1664{
11343788 1665 dTHR;
79072805
LW
1666 register char *s;
1667 I32 i;
8990e307 1668 STRLEN len;
79072805 1669 switch (*mg->mg_ptr) {
748a9306 1670 case '\001': /* ^A */
3280af22 1671 sv_setsv(PL_bodytarget, sv);
748a9306 1672 break;
49460fe6
NIS
1673 case '\003': /* ^C */
1674 PL_minus_c = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1675 break;
1676
79072805 1677 case '\004': /* ^D */
3280af22 1678 PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
79072805
LW
1679 DEBUG_x(dump_all());
1680 break;
28f23441 1681 case '\005': /* ^E */
cd39f2b6 1682#ifdef MACOS_TRADITIONAL
bf4acbe4 1683 gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
28f23441 1684#else
cd39f2b6
JH
1685# ifdef VMS
1686 set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
048c1ddf 1687# else
cd39f2b6
JH
1688# ifdef WIN32
1689 SetLastError( SvIV(sv) );
1690# else
1691# ifndef OS2
f86702cc 1692 /* will anyone ever use this? */
1693 SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
cd39f2b6 1694# endif
048c1ddf
IZ
1695# endif
1696# endif
22fae026 1697#endif
28f23441 1698 break;
79072805 1699 case '\006': /* ^F */
3280af22 1700 PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805 1701 break;
a0d0e21e 1702 case '\010': /* ^H */
3280af22 1703 PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
a0d0e21e 1704 break;
9d116dd7 1705 case '\011': /* ^I */ /* NOT \t in EBCDIC */
3280af22
NIS
1706 if (PL_inplace)
1707 Safefree(PL_inplace);
79072805 1708 if (SvOK(sv))
2d8e6c8d 1709 PL_inplace = savepv(SvPV(sv,len));
79072805 1710 else
3280af22 1711 PL_inplace = Nullch;
79072805 1712 break;
28f23441 1713 case '\017': /* ^O */
ac27b0f5
NIS
1714 if (*(mg->mg_ptr+1) == '\0') {
1715 if (PL_osname)
1716 Safefree(PL_osname);
1717 if (SvOK(sv))
1718 PL_osname = savepv(SvPV(sv,len));
1719 else
1720 PL_osname = Nullch;
1721 }
1722 else if (strEQ(mg->mg_ptr, "\017PEN")) {
1723 if (!PL_compiling.cop_io)
1724 PL_compiling.cop_io = newSVsv(sv);
1725 else
1726 sv_setsv(PL_compiling.cop_io,sv);
1727 }
28f23441 1728 break;
79072805 1729 case '\020': /* ^P */
3280af22 1730 PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1ee4443e
IZ
1731 if (PL_perldb && !PL_DBsingle)
1732 init_debugger();
79072805
LW
1733 break;
1734 case '\024': /* ^T */
88e89b8a 1735#ifdef BIG_TIME
6b88bc9c 1736 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
88e89b8a 1737#else
3280af22 1738 PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
88e89b8a 1739#endif
79072805 1740 break;
46487f74 1741 case '\027': /* ^W & $^WARNING_BITS & ^WIDE_SYSTEM_CALLS */
4438c4b7
JH
1742 if (*(mg->mg_ptr+1) == '\0') {
1743 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
1744 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
ac27b0f5 1745 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
0453d815 1746 | (i ? G_WARN_ON : G_WARN_OFF) ;
4438c4b7 1747 }
599cee73 1748 }
6a818117 1749 else if (strEQ(mg->mg_ptr, "\027ARNING_BITS")) {
4438c4b7 1750 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
d775746e
GS
1751 if (!SvPOK(sv) && PL_localizing) {
1752 sv_setpvn(sv, WARN_NONEstring, WARNsize);
d3a7d8c7 1753 PL_compiling.cop_warnings = pWARN_NONE;
d775746e
GS
1754 break;
1755 }
f4fc7782 1756 {
b5477537 1757 STRLEN len, i;
d3a7d8c7 1758 int accumulate = 0 ;
f4fc7782 1759 int any_fatals = 0 ;
d3a7d8c7 1760 char * ptr = (char*)SvPV(sv, len) ;
f4fc7782
JH
1761 for (i = 0 ; i < len ; ++i) {
1762 accumulate |= ptr[i] ;
1763 any_fatals |= (ptr[i] & 0xAA) ;
1764 }
d3a7d8c7
GS
1765 if (!accumulate)
1766 PL_compiling.cop_warnings = pWARN_NONE;
f4fc7782
JH
1767 else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
1768 PL_compiling.cop_warnings = pWARN_ALL;
1769 PL_dowarn |= G_WARN_ONCE ;
1770 }
d3a7d8c7
GS
1771 else {
1772 if (specialWARN(PL_compiling.cop_warnings))
1773 PL_compiling.cop_warnings = newSVsv(sv) ;
1774 else
1775 sv_setsv(PL_compiling.cop_warnings, sv);
1776 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
1777 PL_dowarn |= G_WARN_ONCE ;
1778 }
f4fc7782 1779
d3a7d8c7 1780 }
4438c4b7 1781 }
971a9dd3 1782 }
46487f74
GS
1783 else if (strEQ(mg->mg_ptr, "\027IDE_SYSTEM_CALLS"))
1784 PL_widesyscalls = SvTRUE(sv);
79072805
LW
1785 break;
1786 case '.':
3280af22
NIS
1787 if (PL_localizing) {
1788 if (PL_localizing == 1)
7766f137 1789 SAVESPTR(PL_last_in_gv);
748a9306 1790 }
3280af22
NIS
1791 else if (SvOK(sv) && GvIO(PL_last_in_gv))
1792 IoLINES(GvIOp(PL_last_in_gv)) = (long)SvIV(sv);
79072805
LW
1793 break;
1794 case '^':
3280af22 1795 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2d8e6c8d 1796 IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
3280af22 1797 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
79072805
LW
1798 break;
1799 case '~':
3280af22 1800 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2d8e6c8d 1801 IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
3280af22 1802 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
79072805
LW
1803 break;
1804 case '=':
3280af22 1805 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805
LW
1806 break;
1807 case '-':
3280af22
NIS
1808 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1809 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
1810 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
79072805
LW
1811 break;
1812 case '%':
3280af22 1813 IoPAGE(GvIOp(PL_defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805
LW
1814 break;
1815 case '|':
4b65379b 1816 {
3280af22 1817 IO *io = GvIOp(PL_defoutgv);
4b65379b
CS
1818 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
1819 IoFLAGS(io) &= ~IOf_FLUSH;
1820 else {
1821 if (!(IoFLAGS(io) & IOf_FLUSH)) {
1822 PerlIO *ofp = IoOFP(io);
1823 if (ofp)
1824 (void)PerlIO_flush(ofp);
1825 IoFLAGS(io) |= IOf_FLUSH;
1826 }
1827 }
79072805
LW
1828 }
1829 break;
1830 case '*':
463ee0b2 1831 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
3280af22 1832 PL_multiline = (i != 0);
79072805
LW
1833 break;
1834 case '/':
3280af22
NIS
1835 SvREFCNT_dec(PL_nrs);
1836 PL_nrs = newSVsv(sv);
1837 SvREFCNT_dec(PL_rs);
1838 PL_rs = SvREFCNT_inc(PL_nrs);
79072805
LW
1839 break;
1840 case '\\':
3280af22
NIS
1841 if (PL_ors)
1842 Safefree(PL_ors);
009c130f
GS
1843 if (SvOK(sv) || SvGMAGICAL(sv)) {
1844 s = SvPV(sv,PL_orslen);
1845 PL_ors = savepvn(s,PL_orslen);
1846 }
e3c19b7b 1847 else {
3280af22
NIS
1848 PL_ors = Nullch;
1849 PL_orslen = 0;
e3c19b7b 1850 }
79072805
LW
1851 break;
1852 case ',':
3280af22
NIS
1853 if (PL_ofs)
1854 Safefree(PL_ofs);
1855 PL_ofs = savepv(SvPV(sv, PL_ofslen));
79072805
LW
1856 break;
1857 case '#':
3280af22
NIS
1858 if (PL_ofmt)
1859 Safefree(PL_ofmt);
2d8e6c8d 1860 PL_ofmt = savepv(SvPV(sv,len));
79072805
LW
1861 break;
1862 case '[':
3280af22 1863 PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
79072805
LW
1864 break;
1865 case '?':
ff0cee69 1866#ifdef COMPLEX_STATUS
6b88bc9c
GS
1867 if (PL_localizing == 2) {
1868 PL_statusvalue = LvTARGOFF(sv);
1869 PL_statusvalue_vms = LvTARGLEN(sv);
ff0cee69 1870 }
1871 else
1872#endif
1873#ifdef VMSISH_STATUS
1874 if (VMSISH_STATUS)
1875 STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
1876 else
1877#endif
1878 STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
79072805
LW
1879 break;
1880 case '!':
78987ded 1881 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
f86702cc 1882 (SvIV(sv) == EVMSERR) ? 4 : vaxc$errno);
79072805
LW
1883 break;
1884 case '<':
3280af22
NIS
1885 PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1886 if (PL_delaymagic) {
1887 PL_delaymagic |= DM_RUID;
79072805
LW
1888 break; /* don't do magic till later */
1889 }
1890#ifdef HAS_SETRUID
b28d0864 1891 (void)setruid((Uid_t)PL_uid);
79072805
LW
1892#else
1893#ifdef HAS_SETREUID
3280af22 1894 (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
748a9306 1895#else
85e6fe83 1896#ifdef HAS_SETRESUID
b28d0864 1897 (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
79072805 1898#else
b28d0864
NIS
1899 if (PL_uid == PL_euid) /* special case $< = $> */
1900 (void)PerlProc_setuid(PL_uid);
a0d0e21e 1901 else {
d8eceb89 1902 PL_uid = PerlProc_getuid();
cea2e8a9 1903 Perl_croak(aTHX_ "setruid() not implemented");
a0d0e21e 1904 }
79072805
LW
1905#endif
1906#endif
85e6fe83 1907#endif
d8eceb89 1908 PL_uid = PerlProc_getuid();
3280af22 1909 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805
LW
1910 break;
1911 case '>':
3280af22
NIS
1912 PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1913 if (PL_delaymagic) {
1914 PL_delaymagic |= DM_EUID;
79072805
LW
1915 break; /* don't do magic till later */
1916 }
1917#ifdef HAS_SETEUID
3280af22 1918 (void)seteuid((Uid_t)PL_euid);
79072805
LW
1919#else
1920#ifdef HAS_SETREUID
b28d0864 1921 (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
85e6fe83
LW
1922#else
1923#ifdef HAS_SETRESUID
6b88bc9c 1924 (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
79072805 1925#else
b28d0864
NIS
1926 if (PL_euid == PL_uid) /* special case $> = $< */
1927 PerlProc_setuid(PL_euid);
a0d0e21e 1928 else {
e8ee3774 1929 PL_euid = PerlProc_geteuid();
cea2e8a9 1930 Perl_croak(aTHX_ "seteuid() not implemented");
a0d0e21e 1931 }
79072805
LW
1932#endif
1933#endif
85e6fe83 1934#endif
d8eceb89 1935 PL_euid = PerlProc_geteuid();
3280af22 1936 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805
LW
1937 break;
1938 case '(':
3280af22
NIS
1939 PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1940 if (PL_delaymagic) {
1941 PL_delaymagic |= DM_RGID;
79072805
LW
1942 break; /* don't do magic till later */
1943 }
1944#ifdef HAS_SETRGID
b28d0864 1945 (void)setrgid((Gid_t)PL_gid);
79072805
LW
1946#else
1947#ifdef HAS_SETREGID
3280af22 1948 (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
85e6fe83
LW
1949#else
1950#ifdef HAS_SETRESGID
b28d0864 1951 (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
79072805 1952#else
b28d0864
NIS
1953 if (PL_gid == PL_egid) /* special case $( = $) */
1954 (void)PerlProc_setgid(PL_gid);
748a9306 1955 else {
d8eceb89 1956 PL_gid = PerlProc_getgid();
cea2e8a9 1957 Perl_croak(aTHX_ "setrgid() not implemented");
748a9306 1958 }
79072805
LW
1959#endif
1960#endif
85e6fe83 1961#endif
d8eceb89 1962 PL_gid = PerlProc_getgid();
3280af22 1963 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805
LW
1964 break;
1965 case ')':
5cd24f17 1966#ifdef HAS_SETGROUPS
1967 {
2d8e6c8d 1968 char *p = SvPV(sv, len);
5cd24f17 1969 Groups_t gary[NGROUPS];
1970
5cd24f17 1971 while (isSPACE(*p))
1972 ++p;
2d4389e4 1973 PL_egid = Atol(p);
5cd24f17 1974 for (i = 0; i < NGROUPS; ++i) {
1975 while (*p && !isSPACE(*p))
1976 ++p;
1977 while (isSPACE(*p))
1978 ++p;
1979 if (!*p)
1980 break;
2d4389e4 1981 gary[i] = Atol(p);
5cd24f17 1982 }
8cc95fdb 1983 if (i)
1984 (void)setgroups(i, gary);
5cd24f17 1985 }
1986#else /* HAS_SETGROUPS */
b28d0864 1987 PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
5cd24f17 1988#endif /* HAS_SETGROUPS */
3280af22
NIS
1989 if (PL_delaymagic) {
1990 PL_delaymagic |= DM_EGID;
79072805
LW
1991 break; /* don't do magic till later */
1992 }
1993#ifdef HAS_SETEGID
3280af22 1994 (void)setegid((Gid_t)PL_egid);
79072805
LW
1995#else
1996#ifdef HAS_SETREGID
b28d0864 1997 (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
85e6fe83
LW
1998#else
1999#ifdef HAS_SETRESGID
b28d0864 2000 (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
79072805 2001#else
b28d0864
NIS
2002 if (PL_egid == PL_gid) /* special case $) = $( */
2003 (void)PerlProc_setgid(PL_egid);
748a9306 2004 else {
d8eceb89 2005 PL_egid = PerlProc_getegid();
cea2e8a9 2006 Perl_croak(aTHX_ "setegid() not implemented");
748a9306 2007 }
79072805
LW
2008#endif
2009#endif
85e6fe83 2010#endif
d8eceb89 2011 PL_egid = PerlProc_getegid();
3280af22 2012 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
79072805
LW
2013 break;
2014 case ':':
2d8e6c8d 2015 PL_chopset = SvPV_force(sv,len);
79072805 2016 break;
cd39f2b6 2017#ifndef MACOS_TRADITIONAL
79072805 2018 case '0':
4bc88a62
PS
2019#ifdef HAS_SETPROCTITLE
2020 /* The BSDs don't show the argv[] in ps(1) output, they
2021 * show a string from the process struct and provide
2022 * the setproctitle() routine to manipulate that. */
2023 {
2024 s = SvPV(sv, len);
9aad2c0e
JH
2025# if __FreeBSD_version >= 410001
2026 /* The leading "-" removes the "perl: " prefix,
4bc88a62
PS
2027 * but not the "(perl) suffix from the ps(1)
2028 * output, because that's what ps(1) shows if the
2029 * argv[] is modified. */
2030 setproctitle("-%s", s, len + 1);
9aad2c0e 2031# else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
4bc88a62
PS
2032 /* This doesn't really work if you assume that
2033 * $0 = 'foobar'; will wipe out 'perl' from the $0
2034 * because in ps(1) output the result will be like
2035 * sprintf("perl: %s (perl)", s)
2036 * I guess this is a security feature:
2037 * one (a user process) cannot get rid of the original name.
2038 * --jhi */
2039 setproctitle("%s", s);
2040# endif
2041 }
2042#endif
3280af22
NIS
2043 if (!PL_origalen) {
2044 s = PL_origargv[0];
79072805
LW
2045 s += strlen(s);
2046 /* See if all the arguments are contiguous in memory */
3280af22
NIS
2047 for (i = 1; i < PL_origargc; i++) {
2048 if (PL_origargv[i] == s + 1
fb73857a 2049#ifdef OS2
6b88bc9c 2050 || PL_origargv[i] == s + 2
ac27b0f5 2051#endif
fb73857a 2052 )
379c4362
GS
2053 {
2054 ++s;
2055 s += strlen(s); /* this one is ok too */
2056 }
fb73857a 2057 else
2058 break;
79072805 2059 }
bbce6d69 2060 /* can grab env area too? */
3280af22 2061 if (PL_origenviron && (PL_origenviron[0] == s + 1
fb73857a 2062#ifdef OS2
6b88bc9c 2063 || (PL_origenviron[0] == s + 9 && (s += 8))
ac27b0f5 2064#endif
fb73857a 2065 )) {
66b1d557 2066 my_setenv("NoNe SuCh", Nullch);
79072805 2067 /* force copy of environment */
3280af22 2068 for (i = 0; PL_origenviron[i]; i++)
379c4362
GS
2069 if (PL_origenviron[i] == s + 1) {
2070 ++s;
2071 s += strlen(s);
2072 }
fb73857a 2073 else
2074 break;
79072805 2075 }
3280af22 2076 PL_origalen = s - PL_origargv[0];
79072805 2077 }
a0d0e21e 2078 s = SvPV_force(sv,len);
8990e307 2079 i = len;
3280af22
NIS
2080 if (i >= PL_origalen) {
2081 i = PL_origalen;
fb73857a 2082 /* don't allow system to limit $0 seen by script */
2083 /* SvCUR_set(sv, i); *SvEND(sv) = '\0'; */
3280af22
NIS
2084 Copy(s, PL_origargv[0], i, char);
2085 s = PL_origargv[0]+i;
fb73857a 2086 *s = '\0';
79072805
LW
2087 }
2088 else {
3280af22
NIS
2089 Copy(s, PL_origargv[0], i, char);
2090 s = PL_origargv[0]+i;
79072805 2091 *s++ = '\0';
3280af22 2092 while (++i < PL_origalen)
8990e307 2093 *s++ = ' ';
3280af22
NIS
2094 s = PL_origargv[0]+i;
2095 for (i = 1; i < PL_origargc; i++)
2096 PL_origargv[i] = Nullch;
79072805
LW
2097 }
2098 break;
cd39f2b6 2099#endif
a863c7d1
MB
2100#ifdef USE_THREADS
2101 case '@':
38a03e6e 2102 sv_setsv(thr->errsv, sv);
a863c7d1
MB
2103 break;
2104#endif /* USE_THREADS */
79072805
LW
2105 }
2106 return 0;
2107}
2108
f93b4edd
MB
2109#ifdef USE_THREADS
2110int
864dbfa3 2111Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg)
f93b4edd
MB
2112{
2113 dTHR;
b900a521
JH
2114 DEBUG_S(PerlIO_printf(Perl_debug_log,
2115 "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n",
2116 PTR2UV(thr), PTR2UV(sv));)
f93b4edd 2117 if (MgOWNER(mg))
cea2e8a9 2118 Perl_croak(aTHX_ "panic: magic_mutexfree");
f93b4edd
MB
2119 MUTEX_DESTROY(MgMUTEXP(mg));
2120 COND_DESTROY(MgCONDP(mg));
2121 return 0;
2122}
2123#endif /* USE_THREADS */
2124
79072805 2125I32
864dbfa3 2126Perl_whichsig(pTHX_ char *sig)
79072805
LW
2127{
2128 register char **sigv;
2129
22c35a8c 2130 for (sigv = PL_sig_name+1; *sigv; sigv++)
79072805 2131 if (strEQ(sig,*sigv))
22c35a8c 2132 return PL_sig_num[sigv - PL_sig_name];
79072805
LW
2133#ifdef SIGCLD
2134 if (strEQ(sig,"CHLD"))
2135 return SIGCLD;
2136#endif
2137#ifdef SIGCHLD
2138 if (strEQ(sig,"CLD"))
2139 return SIGCHLD;
2140#endif
2141 return 0;
2142}
2143
84902520
TB
2144static SV* sig_sv;
2145
ecfc5424 2146Signal_t
cea2e8a9 2147Perl_sighandler(int sig)
79072805 2148{
71d280e3
GS
2149#if defined(WIN32) && defined(PERL_IMPLICIT_CONTEXT)
2150 dTHXoa(PL_curinterp); /* fake TLS, because signals don't do TLS */
2151#else
cea2e8a9 2152 dTHX;
71d280e3 2153#endif
79072805 2154 dSP;
00d579c5 2155 GV *gv = Nullgv;
a0d0e21e 2156 HV *st;
3280af22 2157 SV *sv, *tSv = PL_Sv;
00d579c5 2158 CV *cv = Nullcv;
533c011a 2159 OP *myop = PL_op;
84902520 2160 U32 flags = 0;
155aba94 2161 I32 o_save_i = PL_savestack_ix;
3280af22 2162 XPV *tXpv = PL_Xpv;
71d280e3
GS
2163
2164#if defined(WIN32) && defined(PERL_IMPLICIT_CONTEXT)
2165 PERL_SET_THX(aTHXo); /* fake TLS, see above */
2166#endif
ac27b0f5 2167
3280af22 2168 if (PL_savestack_ix + 15 <= PL_savestack_max)
84902520 2169 flags |= 1;
3280af22 2170 if (PL_markstack_ptr < PL_markstack_max - 2)
84902520 2171 flags |= 4;
3280af22 2172 if (PL_retstack_ix < PL_retstack_max - 2)
84902520 2173 flags |= 8;
3280af22 2174 if (PL_scopestack_ix < PL_scopestack_max - 3)
84902520
TB
2175 flags |= 16;
2176
22c35a8c 2177 if (!PL_psig_ptr[sig])
cea2e8a9 2178 Perl_die(aTHX_ "Signal SIG%s received, but no signal handler set.\n",
22c35a8c 2179 PL_sig_name[sig]);
ff0cee69 2180
84902520
TB
2181 /* Max number of items pushed there is 3*n or 4. We cannot fix
2182 infinity, so we fix 4 (in fact 5): */
2183 if (flags & 1) {
3280af22
NIS
2184 PL_savestack_ix += 5; /* Protect save in progress. */
2185 o_save_i = PL_savestack_ix;
c76ac1ee 2186 SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
84902520 2187 }
ac27b0f5 2188 if (flags & 4)
3280af22 2189 PL_markstack_ptr++; /* Protect mark. */
84902520 2190 if (flags & 8) {
3280af22
NIS
2191 PL_retstack_ix++;
2192 PL_retstack[PL_retstack_ix] = NULL;
84902520
TB
2193 }
2194 if (flags & 16)
3280af22 2195 PL_scopestack_ix += 1;
84902520 2196 /* sv_2cv is too complicated, try a simpler variant first: */
ac27b0f5 2197 if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
84902520 2198 || SvTYPE(cv) != SVt_PVCV)
22c35a8c 2199 cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
84902520 2200
a0d0e21e 2201 if (!cv || !CvROOT(cv)) {
599cee73 2202 if (ckWARN(WARN_SIGNAL))
cea2e8a9 2203 Perl_warner(aTHX_ WARN_SIGNAL, "SIG%s handler \"%s\" not defined.\n",
22c35a8c 2204 PL_sig_name[sig], (gv ? GvENAME(gv)
00d579c5
GS
2205 : ((cv && CvGV(cv))
2206 ? GvENAME(CvGV(cv))
2207 : "__ANON__")));
2208 goto cleanup;
79072805
LW
2209 }
2210
22c35a8c
GS
2211 if(PL_psig_name[sig]) {
2212 sv = SvREFCNT_inc(PL_psig_name[sig]);
84902520
TB
2213 flags |= 64;
2214 sig_sv = sv;
2215 } else {
ff0cee69 2216 sv = sv_newmortal();
22c35a8c 2217 sv_setpv(sv,PL_sig_name[sig]);
88e89b8a 2218 }
e336de0d 2219
e788e7d3 2220 PUSHSTACKi(PERLSI_SIGNAL);
924508f0 2221 PUSHMARK(SP);
79072805 2222 PUSHs(sv);
79072805 2223 PUTBACK;
a0d0e21e 2224
864dbfa3 2225 call_sv((SV*)cv, G_DISCARD);
79072805 2226
d3acc0f7 2227 POPSTACK;
00d579c5 2228cleanup:
84902520 2229 if (flags & 1)
3280af22 2230 PL_savestack_ix -= 8; /* Unprotect save in progress. */
ac27b0f5 2231 if (flags & 4)
3280af22 2232 PL_markstack_ptr--;
ac27b0f5 2233 if (flags & 8)
3280af22 2234 PL_retstack_ix--;
84902520 2235 if (flags & 16)
3280af22 2236 PL_scopestack_ix -= 1;
84902520
TB
2237 if (flags & 64)
2238 SvREFCNT_dec(sv);
533c011a 2239 PL_op = myop; /* Apparently not needed... */
ac27b0f5 2240
3280af22
NIS
2241 PL_Sv = tSv; /* Restore global temporaries. */
2242 PL_Xpv = tXpv;
79072805
LW
2243 return;
2244}
4e35701f
NIS
2245
2246
51371543 2247#ifdef PERL_OBJECT
51371543
GS
2248#include "XSUB.h"
2249#endif
2250
2251static void
2252restore_magic(pTHXo_ void *p)
2253{
2254 dTHR;
48944bdf 2255 MGS* mgs = SSPTR(PTR2IV(p), MGS*);
51371543
GS
2256 SV* sv = mgs->mgs_sv;
2257
2258 if (!sv)
2259 return;
2260
2261 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2262 {
2263 if (mgs->mgs_flags)
2264 SvFLAGS(sv) |= mgs->mgs_flags;
2265 else
2266 mg_magical(sv);
2267 if (SvGMAGICAL(sv))
2268 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2269 }
2270
2271 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
2272
2273 /* If we're still on top of the stack, pop us off. (That condition
2274 * will be satisfied if restore_magic was called explicitly, but *not*
2275 * if it's being called via leave_scope.)
2276 * The reason for doing this is that otherwise, things like sv_2cv()
2277 * may leave alloc gunk on the savestack, and some code
2278 * (e.g. sighandler) doesn't expect that...
2279 */
2280 if (PL_savestack_ix == mgs->mgs_ss_ix)
2281 {
2282 I32 popval = SSPOPINT;
c76ac1ee 2283 assert(popval == SAVEt_DESTRUCTOR_X);
51371543
GS
2284 PL_savestack_ix -= 2;
2285 popval = SSPOPINT;
2286 assert(popval == SAVEt_ALLOC);
2287 popval = SSPOPINT;
2288 PL_savestack_ix -= popval;
2289 }
2290
2291}
2292
2293static void
2294unwind_handler_stack(pTHXo_ void *p)
2295{
2296 dTHR;
2297 U32 flags = *(U32*)p;
2298
2299 if (flags & 1)
2300 PL_savestack_ix -= 5; /* Unprotect save in progress. */
2301 /* cxstack_ix-- Not needed, die already unwound it. */
2302 if (flags & 64)
2303 SvREFCNT_dec(sig_sv);
2304}