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