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