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