use SETERRNO() to reset errno (suggested by Charles Bailey)
[p5sagit/p5-mst-13.2.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 (curcop->cop_warnings == WARN_NONE)
468             /* printf("WARN_NONE\n"), */
469             sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
470         else if (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(curcop->cop_warnings)), */
475             sv_setsv(sv, 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                 Perl_rc = _syserrno();
501             sv_setnv(sv, (double)Perl_rc);
502             sv_setpv(sv, os2error(Perl_rc));
503         }
504 #else
505 #ifdef WIN32
506         {
507             DWORD dwErr = GetLastError();
508             sv_setnv(sv, (double)dwErr);
509             if (dwErr)
510             {
511 #ifdef PERL_OBJECT
512                 char *sMsg;
513                 DWORD dwLen;
514                 PerlProc_GetSysMsg(sMsg, dwLen, dwErr);
515                 sv_setpvn(sv, sMsg, dwLen);
516                 PerlProc_FreeBuf(sMsg);
517 #else
518                 win32_str_os_error(sv, dwErr);
519 #endif
520             }
521             else
522                 sv_setpv(sv, "");
523             SetLastError(dwErr);
524         }
525 #else
526         sv_setnv(sv, (double)errno);
527         sv_setpv(sv, errno ? Strerror(errno) : "");
528 #endif
529 #endif
530 #endif
531         SvNOK_on(sv);   /* what a wonderful hack! */
532         break;
533     case '\006':                /* ^F */
534         sv_setiv(sv, (IV)PL_maxsysfd);
535         break;
536     case '\010':                /* ^H */
537         sv_setiv(sv, (IV)PL_hints);
538         break;
539     case '\011':                /* ^I */ /* NOT \t in EBCDIC */
540         if (PL_inplace)
541             sv_setpv(sv, PL_inplace);
542         else
543             sv_setsv(sv, &PL_sv_undef);
544         break;
545     case '\017':                /* ^O */
546         sv_setpv(sv, PL_osname);
547         break;
548     case '\020':                /* ^P */
549         sv_setiv(sv, (IV)PL_perldb);
550         break;
551     case '\023':                /* ^S */
552         {
553             dTHR;
554             if (PL_lex_state != LEX_NOTPARSING)
555                 SvOK_off(sv);
556             else if (PL_in_eval)
557                 sv_setiv(sv, 1);
558             else
559                 sv_setiv(sv, 0);
560         }
561         break;
562     case '\024':                /* ^T */
563 #ifdef BIG_TIME
564         sv_setnv(sv, PL_basetime);
565 #else
566         sv_setiv(sv, (IV)PL_basetime);
567 #endif
568         break;
569     case '\027':                /* ^W */
570         sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) == G_WARN_ON));
571         break;
572     case '1': case '2': case '3': case '4':
573     case '5': case '6': case '7': case '8': case '9': case '&':
574         if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
575             /*
576              * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
577              * XXX Does the new way break anything?
578              */
579             paren = atoi(mg->mg_ptr);
580           getparen:
581             if (paren <= rx->nparens &&
582                 (s = rx->startp[paren]) &&
583                 (t = rx->endp[paren]))
584             {
585                 i = t - s;
586               getrx:
587                 if (i >= 0) {
588                     bool was_tainted;
589                     if (PL_tainting) {
590                         was_tainted = PL_tainted;
591                         PL_tainted = FALSE;
592                     }
593                     sv_setpvn(sv,s,i);
594                     if (PL_tainting)
595                         PL_tainted = (was_tainted || RX_MATCH_TAINTED(rx));
596                     break;
597                 }
598             }
599         }
600         sv_setsv(sv,&PL_sv_undef);
601         break;
602     case '+':
603         if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
604             paren = rx->lastparen;
605             if (paren)
606                 goto getparen;
607         }
608         sv_setsv(sv,&PL_sv_undef);
609         break;
610     case '`':
611         if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
612             if ((s = rx->subbeg) && rx->startp[0]) {
613                 i = rx->startp[0] - s;
614                 goto getrx;
615             }
616         }
617         sv_setsv(sv,&PL_sv_undef);
618         break;
619     case '\'':
620         if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
621             if (rx->subend && (s = rx->endp[0])) {
622                 i = rx->subend - s;
623                 goto getrx;
624             }
625         }
626         sv_setsv(sv,&PL_sv_undef);
627         break;
628     case '.':
629 #ifndef lint
630         if (GvIO(PL_last_in_gv)) {
631             sv_setiv(sv, (IV)IoLINES(GvIO(PL_last_in_gv)));
632         }
633 #endif
634         break;
635     case '?':
636         {
637             sv_setiv(sv, (IV)STATUS_CURRENT);
638 #ifdef COMPLEX_STATUS
639             LvTARGOFF(sv) = PL_statusvalue;
640             LvTARGLEN(sv) = PL_statusvalue_vms;
641 #endif
642         }
643         break;
644     case '^':
645         s = IoTOP_NAME(GvIOp(PL_defoutgv));
646         if (s)
647             sv_setpv(sv,s);
648         else {
649             sv_setpv(sv,GvENAME(PL_defoutgv));
650             sv_catpv(sv,"_TOP");
651         }
652         break;
653     case '~':
654         s = IoFMT_NAME(GvIOp(PL_defoutgv));
655         if (!s)
656             s = GvENAME(PL_defoutgv);
657         sv_setpv(sv,s);
658         break;
659 #ifndef lint
660     case '=':
661         sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
662         break;
663     case '-':
664         sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
665         break;
666     case '%':
667         sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
668         break;
669 #endif
670     case ':':
671         break;
672     case '/':
673         break;
674     case '[':
675         WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
676         break;
677     case '|':
678         sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
679         break;
680     case ',':
681         sv_setpvn(sv,PL_ofs,PL_ofslen);
682         break;
683     case '\\':
684         sv_setpvn(sv,PL_ors,PL_orslen);
685         break;
686     case '#':
687         sv_setpv(sv,PL_ofmt);
688         break;
689     case '!':
690 #ifdef VMS
691         sv_setnv(sv, (double)((errno == EVMSERR) ? vaxc$errno : errno));
692         sv_setpv(sv, errno ? Strerror(errno) : "");
693 #else
694         {
695         int saveerrno = errno;
696         sv_setnv(sv, (double)errno);
697 #ifdef OS2
698         if (errno == errno_isOS2) sv_setpv(sv, os2error(Perl_rc));
699         else
700 #endif
701         sv_setpv(sv, errno ? Strerror(errno) : "");
702         errno = saveerrno;
703         }
704 #endif
705         SvNOK_on(sv);   /* what a wonderful hack! */
706         break;
707     case '<':
708         sv_setiv(sv, (IV)PL_uid);
709         break;
710     case '>':
711         sv_setiv(sv, (IV)PL_euid);
712         break;
713     case '(':
714         sv_setiv(sv, (IV)PL_gid);
715         sv_setpvf(sv, "%Vd", (IV)PL_gid);
716         goto add_groups;
717     case ')':
718         sv_setiv(sv, (IV)PL_egid);
719         sv_setpvf(sv, "%Vd", (IV)PL_egid);
720       add_groups:
721 #ifdef HAS_GETGROUPS
722         {
723             Groups_t gary[NGROUPS];
724             i = getgroups(NGROUPS,gary);
725             while (--i >= 0)
726                 sv_catpvf(sv, " %Vd", (IV)gary[i]);
727         }
728 #endif
729         SvIOK_on(sv);   /* what a wonderful hack! */
730         break;
731     case '*':
732         break;
733     case '0':
734         break;
735 #ifdef USE_THREADS
736     case '@':
737         sv_setsv(sv, thr->errsv);
738         break;
739 #endif /* USE_THREADS */
740     }
741     return 0;
742 }
743
744 int
745 magic_getuvar(SV *sv, MAGIC *mg)
746 {
747     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
748
749     if (uf && uf->uf_val)
750         (*uf->uf_val)(uf->uf_index, sv);
751     return 0;
752 }
753
754 int
755 magic_setenv(SV *sv, MAGIC *mg)
756 {
757     register char *s;
758     char *ptr;
759     STRLEN len, klen;
760     I32 i;
761
762     s = SvPV(sv,len);
763     ptr = MgPV(mg,klen);
764     my_setenv(ptr, s);
765
766 #ifdef DYNAMIC_ENV_FETCH
767      /* We just undefd an environment var.  Is a replacement */
768      /* waiting in the wings? */
769     if (!len) {
770         SV **valp;
771         if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
772             s = SvPV(*valp, len);
773     }
774 #endif
775
776 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
777                             /* And you'll never guess what the dog had */
778                             /*   in its mouth... */
779     if (PL_tainting) {
780         MgTAINTEDDIR_off(mg);
781 #ifdef VMS
782         if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
783             char pathbuf[256], eltbuf[256], *cp, *elt = s;
784             struct stat sbuf;
785             int i = 0, j = 0;
786
787             do {          /* DCL$PATH may be a search list */
788                 while (1) {   /* as may dev portion of any element */
789                     if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
790                         if ( *(cp+1) == '.' || *(cp+1) == '-' ||
791                              cando_by_name(S_IWUSR,0,elt) ) {
792                             MgTAINTEDDIR_on(mg);
793                             return 0;
794                         }
795                     }
796                     if ((cp = strchr(elt, ':')) != Nullch)
797                         *cp = '\0';
798                     if (my_trnlnm(elt, eltbuf, j++))
799                         elt = eltbuf;
800                     else
801                         break;
802                 }
803                 j = 0;
804             } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
805         }
806 #endif /* VMS */
807         if (s && klen == 4 && strEQ(ptr,"PATH")) {
808             char *strend = s + len;
809
810             while (s < strend) {
811                 char tmpbuf[256];
812                 struct stat st;
813                 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
814                              s, strend, ':', &i);
815                 s++;
816                 if (i >= sizeof tmpbuf   /* too long -- assume the worst */
817                       || *tmpbuf != '/'
818                       || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
819                     MgTAINTEDDIR_on(mg);
820                     return 0;
821                 }
822             }
823         }
824     }
825 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
826
827     return 0;
828 }
829
830 int
831 magic_clearenv(SV *sv, MAGIC *mg)
832 {
833     my_setenv(MgPV(mg,PL_na),Nullch);
834     return 0;
835 }
836
837 int
838 magic_set_all_env(SV *sv, MAGIC *mg)
839 {
840 #if defined(VMS)
841     die("Can't make list assignment to %%ENV on this system");
842 #else
843     dTHR;
844     if (PL_localizing) {
845         HE* entry;
846         magic_clear_all_env(sv,mg);
847         hv_iterinit((HV*)sv);
848         while (entry = hv_iternext((HV*)sv)) {
849             I32 keylen;
850             my_setenv(hv_iterkey(entry, &keylen),
851                       SvPV(hv_iterval((HV*)sv, entry), PL_na));
852         }
853     }
854 #endif
855     return 0;
856 }
857
858 int
859 magic_clear_all_env(SV *sv, MAGIC *mg)
860 {
861 #if defined(VMS)
862     die("Can't make list assignment to %%ENV on this system");
863 #else
864 #ifdef WIN32
865     char *envv = GetEnvironmentStrings();
866     char *cur = envv;
867     STRLEN len;
868     while (*cur) {
869         char *end = strchr(cur,'=');
870         if (end && end != cur) {
871             *end = '\0';
872             my_setenv(cur,Nullch);
873             *end = '=';
874             cur += strlen(end+1)+1;
875         }
876         else if ((len = strlen(cur)))
877             cur += len+1;
878     }
879     FreeEnvironmentStrings(envv);
880 #else
881     I32 i;
882
883     if (environ == PL_origenviron)
884         New(901, environ, 1, char*);
885     else
886         for (i = 0; environ[i]; i++)
887             Safefree(environ[i]);
888     environ[0] = Nullch;
889
890 #endif
891 #endif
892     return 0;
893 }
894
895 int
896 magic_getsig(SV *sv, MAGIC *mg)
897 {
898     I32 i;
899     /* Are we fetching a signal entry? */
900     i = whichsig(MgPV(mg,PL_na));
901     if (i) {
902         if(psig_ptr[i])
903             sv_setsv(sv,psig_ptr[i]);
904         else {
905             Sighandler_t sigstate = rsignal_state(i);
906
907             /* cache state so we don't fetch it again */
908             if(sigstate == SIG_IGN)
909                 sv_setpv(sv,"IGNORE");
910             else
911                 sv_setsv(sv,&PL_sv_undef);
912             psig_ptr[i] = SvREFCNT_inc(sv);
913             SvTEMP_off(sv);
914         }
915     }
916     return 0;
917 }
918 int
919 magic_clearsig(SV *sv, MAGIC *mg)
920 {
921     I32 i;
922     /* Are we clearing a signal entry? */
923     i = whichsig(MgPV(mg,PL_na));
924     if (i) {
925         if(psig_ptr[i]) {
926             SvREFCNT_dec(psig_ptr[i]);
927             psig_ptr[i]=0;
928         }
929         if(psig_name[i]) {
930             SvREFCNT_dec(psig_name[i]);
931             psig_name[i]=0;
932         }
933     }
934     return 0;
935 }
936
937 int
938 magic_setsig(SV *sv, MAGIC *mg)
939 {
940     dTHR;
941     register char *s;
942     I32 i;
943     SV** svp;
944
945     s = MgPV(mg,PL_na);
946     if (*s == '_') {
947         if (strEQ(s,"__DIE__"))
948             svp = &PL_diehook;
949         else if (strEQ(s,"__WARN__"))
950             svp = &PL_warnhook;
951         else if (strEQ(s,"__PARSE__"))
952             svp = &PL_parsehook;
953         else
954             croak("No such hook: %s", s);
955         i = 0;
956         if (*svp) {
957             SvREFCNT_dec(*svp);
958             *svp = 0;
959         }
960     }
961     else {
962         i = whichsig(s);        /* ...no, a brick */
963         if (!i) {
964             if (ckWARN(WARN_SIGNAL) || strEQ(s,"ALARM"))
965                 warner(WARN_SIGNAL, "No such signal: SIG%s", s);
966             return 0;
967         }
968         SvREFCNT_dec(psig_name[i]);
969         SvREFCNT_dec(psig_ptr[i]);
970         psig_ptr[i] = SvREFCNT_inc(sv);
971         SvTEMP_off(sv); /* Make sure it doesn't go away on us */
972         psig_name[i] = newSVpv(s, strlen(s));
973         SvREADONLY_on(psig_name[i]);
974     }
975     if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
976         if (i)
977             (void)rsignal(i, PL_sighandlerp);
978         else
979             *svp = SvREFCNT_inc(sv);
980         return 0;
981     }
982     s = SvPV_force(sv,PL_na);
983     if (strEQ(s,"IGNORE")) {
984         if (i)
985             (void)rsignal(i, SIG_IGN);
986         else
987             *svp = 0;
988     }
989     else if (strEQ(s,"DEFAULT") || !*s) {
990         if (i)
991             (void)rsignal(i, SIG_DFL);
992         else
993             *svp = 0;
994     }
995     else {
996         /*
997          * We should warn if HINT_STRICT_REFS, but without
998          * access to a known hint bit in a known OP, we can't
999          * tell whether HINT_STRICT_REFS is in force or not.
1000          */
1001         if (!strchr(s,':') && !strchr(s,'\''))
1002             sv_setpv(sv, form("main::%s", s));
1003         if (i)
1004             (void)rsignal(i, PL_sighandlerp);
1005         else
1006             *svp = SvREFCNT_inc(sv);
1007     }
1008     return 0;
1009 }
1010
1011 int
1012 magic_setisa(SV *sv, MAGIC *mg)
1013 {
1014     PL_sub_generation++;
1015     return 0;
1016 }
1017
1018 #ifdef OVERLOAD
1019
1020 int
1021 magic_setamagic(SV *sv, MAGIC *mg)
1022 {
1023     /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1024     PL_amagic_generation++;
1025
1026     return 0;
1027 }
1028 #endif /* OVERLOAD */
1029
1030 int
1031 magic_getnkeys(SV *sv, MAGIC *mg)
1032 {
1033     HV *hv = (HV*)LvTARG(sv);
1034     HE *entry;
1035     I32 i = 0;
1036
1037     if (hv) {
1038         (void) hv_iterinit(hv);
1039         if (!SvRMAGICAL(hv) || !mg_find((SV*)hv,'P'))
1040             i = HvKEYS(hv);
1041         else {
1042             /*SUPPRESS 560*/
1043             while (entry = hv_iternext(hv)) {
1044                 i++;
1045             }
1046         }
1047     }
1048
1049     sv_setiv(sv, (IV)i);
1050     return 0;
1051 }
1052
1053 int
1054 magic_setnkeys(SV *sv, MAGIC *mg)
1055 {
1056     if (LvTARG(sv)) {
1057         hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1058     }
1059     return 0;
1060 }          
1061
1062 /* caller is responsible for stack switching/cleanup */
1063 STATIC int
1064 magic_methcall(MAGIC *mg, char *meth, I32 flags, int n, SV *val)
1065 {
1066     dSP;
1067
1068     PUSHMARK(SP);
1069     EXTEND(SP, n);
1070     PUSHs(mg->mg_obj);
1071     if (n > 1) { 
1072         if (mg->mg_ptr) {
1073             if (mg->mg_len >= 0)
1074                 PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
1075             else if (mg->mg_len == HEf_SVKEY)
1076                 PUSHs((SV*)mg->mg_ptr);
1077         }
1078         else if (mg->mg_type == 'p') {
1079             PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1080         }
1081     }
1082     if (n > 2) {
1083         PUSHs(val);
1084     }
1085     PUTBACK;
1086
1087     return perl_call_method(meth, flags);
1088 }
1089
1090 STATIC int
1091 magic_methpack(SV *sv, MAGIC *mg, char *meth)
1092 {
1093     dSP;
1094
1095     ENTER;
1096     SAVETMPS;
1097     PUSHSTACKi(PERLSI_MAGIC);
1098
1099     if (magic_methcall(mg, meth, G_SCALAR, 2, NULL)) {
1100         sv_setsv(sv, *PL_stack_sp--);
1101     }
1102
1103     POPSTACK;
1104     FREETMPS;
1105     LEAVE;
1106     return 0;
1107 }
1108
1109 int
1110 magic_getpack(SV *sv, MAGIC *mg)
1111 {
1112     magic_methpack(sv,mg,"FETCH");
1113     if (mg->mg_ptr)
1114         mg->mg_flags |= MGf_GSKIP;
1115     return 0;
1116 }
1117
1118 int
1119 magic_setpack(SV *sv, MAGIC *mg)
1120 {
1121     dSP;
1122     ENTER;
1123     PUSHSTACKi(PERLSI_MAGIC);
1124     magic_methcall(mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1125     POPSTACK;
1126     LEAVE;
1127     return 0;
1128 }
1129
1130 int
1131 magic_clearpack(SV *sv, MAGIC *mg)
1132 {
1133     return magic_methpack(sv,mg,"DELETE");
1134 }
1135
1136
1137 U32
1138 magic_sizepack(SV *sv, MAGIC *mg)
1139 {         
1140     dSP;
1141     U32 retval = 0;
1142
1143     ENTER;
1144     SAVETMPS;
1145     PUSHSTACKi(PERLSI_MAGIC);
1146     if (magic_methcall(mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1147         sv = *PL_stack_sp--;
1148         retval = (U32) SvIV(sv)-1;
1149     }
1150     POPSTACK;
1151     FREETMPS;
1152     LEAVE;
1153     return retval;
1154 }
1155
1156 int magic_wipepack(SV *sv, MAGIC *mg)
1157 {
1158     dSP;
1159
1160     ENTER;
1161     PUSHSTACKi(PERLSI_MAGIC);
1162     PUSHMARK(SP);
1163     XPUSHs(mg->mg_obj);
1164     PUTBACK;
1165     perl_call_method("CLEAR", G_SCALAR|G_DISCARD);
1166     POPSTACK;
1167     LEAVE;
1168     return 0;
1169 }
1170
1171 int
1172 magic_nextpack(SV *sv, MAGIC *mg, SV *key)
1173 {
1174     dSP;
1175     char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1176
1177     ENTER;
1178     SAVETMPS;
1179     PUSHSTACKi(PERLSI_MAGIC);
1180     PUSHMARK(SP);
1181     EXTEND(SP, 2);
1182     PUSHs(mg->mg_obj);
1183     if (SvOK(key))
1184         PUSHs(key);
1185     PUTBACK;
1186
1187     if (perl_call_method(meth, G_SCALAR))
1188         sv_setsv(key, *PL_stack_sp--);
1189
1190     POPSTACK;
1191     FREETMPS;
1192     LEAVE;
1193     return 0;
1194 }
1195
1196 int
1197 magic_existspack(SV *sv, MAGIC *mg)
1198 {
1199     return magic_methpack(sv,mg,"EXISTS");
1200
1201
1202 int
1203 magic_setdbline(SV *sv, MAGIC *mg)
1204 {
1205     dTHR;
1206     OP *o;
1207     I32 i;
1208     GV* gv;
1209     SV** svp;
1210
1211     gv = PL_DBline;
1212     i = SvTRUE(sv);
1213     svp = av_fetch(GvAV(gv),
1214                      atoi(MgPV(mg,PL_na)), FALSE);
1215     if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
1216         o->op_private = i;
1217     else
1218         warn("Can't break at that line\n");
1219     return 0;
1220 }
1221
1222 int
1223 magic_getarylen(SV *sv, MAGIC *mg)
1224 {
1225     dTHR;
1226     sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
1227     return 0;
1228 }
1229
1230 int
1231 magic_setarylen(SV *sv, MAGIC *mg)
1232 {
1233     dTHR;
1234     av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
1235     return 0;
1236 }
1237
1238 int
1239 magic_getpos(SV *sv, MAGIC *mg)
1240 {
1241     SV* lsv = LvTARG(sv);
1242     
1243     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1244         mg = mg_find(lsv, 'g');
1245         if (mg && mg->mg_len >= 0) {
1246             dTHR;
1247             I32 i = mg->mg_len;
1248             if (IN_UTF8)
1249                 sv_pos_b2u(lsv, &i);
1250             sv_setiv(sv, i + PL_curcop->cop_arybase);
1251             return 0;
1252         }
1253     }
1254     (void)SvOK_off(sv);
1255     return 0;
1256 }
1257
1258 int
1259 magic_setpos(SV *sv, MAGIC *mg)
1260 {
1261     SV* lsv = LvTARG(sv);
1262     SSize_t pos;
1263     STRLEN len;
1264     STRLEN ulen;
1265     dTHR;
1266
1267     mg = 0;
1268     
1269     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1270         mg = mg_find(lsv, 'g');
1271     if (!mg) {
1272         if (!SvOK(sv))
1273             return 0;
1274         sv_magic(lsv, (SV*)0, 'g', Nullch, 0);
1275         mg = mg_find(lsv, 'g');
1276     }
1277     else if (!SvOK(sv)) {
1278         mg->mg_len = -1;
1279         return 0;
1280     }
1281     len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1282
1283     pos = SvIV(sv) - PL_curcop->cop_arybase;
1284
1285     if (IN_UTF8) {
1286         ulen = sv_len_utf8(lsv);
1287         if (ulen)
1288             len = ulen;
1289         else
1290             ulen = 0;
1291     }
1292
1293     if (pos < 0) {
1294         pos += len;
1295         if (pos < 0)
1296             pos = 0;
1297     }
1298     else if (pos > len)
1299         pos = len;
1300
1301     if (ulen) {
1302         I32 p = pos;
1303         sv_pos_u2b(lsv, &p, 0);
1304         pos = p;
1305     }
1306         
1307     mg->mg_len = pos;
1308     mg->mg_flags &= ~MGf_MINMATCH;
1309
1310     return 0;
1311 }
1312
1313 int
1314 magic_getglob(SV *sv, MAGIC *mg)
1315 {
1316     if (SvFAKE(sv)) {                   /* FAKE globs can get coerced */
1317         SvFAKE_off(sv);
1318         gv_efullname3(sv,((GV*)sv), "*");
1319         SvFAKE_on(sv);
1320     }
1321     else
1322         gv_efullname3(sv,((GV*)sv), "*");       /* a gv value, be nice */
1323     return 0;
1324 }
1325
1326 int
1327 magic_setglob(SV *sv, MAGIC *mg)
1328 {
1329     register char *s;
1330     GV* gv;
1331
1332     if (!SvOK(sv))
1333         return 0;
1334     s = SvPV(sv, PL_na);
1335     if (*s == '*' && s[1])
1336         s++;
1337     gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1338     if (sv == (SV*)gv)
1339         return 0;
1340     if (GvGP(sv))
1341         gp_free((GV*)sv);
1342     GvGP(sv) = gp_ref(GvGP(gv));
1343     return 0;
1344 }
1345
1346 int
1347 magic_getsubstr(SV *sv, MAGIC *mg)
1348 {
1349     STRLEN len;
1350     SV *lsv = LvTARG(sv);
1351     char *tmps = SvPV(lsv,len);
1352     I32 offs = LvTARGOFF(sv);
1353     I32 rem = LvTARGLEN(sv);
1354
1355     if (offs > len)
1356         offs = len;
1357     if (rem + offs > len)
1358         rem = len - offs;
1359     sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1360     return 0;
1361 }
1362
1363 int
1364 magic_setsubstr(SV *sv, MAGIC *mg)
1365 {
1366     STRLEN len;
1367     char *tmps = SvPV(sv,len);
1368     sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
1369     return 0;
1370 }
1371
1372 int
1373 magic_gettaint(SV *sv, MAGIC *mg)
1374 {
1375     dTHR;
1376     TAINT_IF((mg->mg_len & 1) ||
1377              (mg->mg_len & 2) && mg->mg_obj == sv);     /* kludge */
1378     return 0;
1379 }
1380
1381 int
1382 magic_settaint(SV *sv, MAGIC *mg)
1383 {
1384     dTHR;
1385     if (PL_localizing) {
1386         if (PL_localizing == 1)
1387             mg->mg_len <<= 1;
1388         else
1389             mg->mg_len >>= 1;
1390     }
1391     else if (PL_tainted)
1392         mg->mg_len |= 1;
1393     else
1394         mg->mg_len &= ~1;
1395     return 0;
1396 }
1397
1398 int
1399 magic_getvec(SV *sv, MAGIC *mg)
1400 {
1401     SV *lsv = LvTARG(sv);
1402     unsigned char *s;
1403     unsigned long retnum;
1404     STRLEN lsvlen;
1405     I32 len;
1406     I32 offset;
1407     I32 size;
1408
1409     if (!lsv) {
1410         SvOK_off(sv);
1411         return 0;
1412     }
1413     s = (unsigned char *) SvPV(lsv, lsvlen);
1414     offset = LvTARGOFF(sv);
1415     size = LvTARGLEN(sv);
1416     len = (offset + size + 7) / 8;
1417
1418     /* Copied from pp_vec() */
1419
1420     if (len > lsvlen) {
1421         if (size <= 8)
1422             retnum = 0;
1423         else {
1424             offset >>= 3;
1425             if (size == 16) {
1426                 if (offset >= lsvlen)
1427                     retnum = 0;
1428                 else
1429                     retnum = (unsigned long) s[offset] << 8;
1430             }
1431             else if (size == 32) {
1432                 if (offset >= lsvlen)
1433                     retnum = 0;
1434                 else if (offset + 1 >= lsvlen)
1435                     retnum = (unsigned long) s[offset] << 24;
1436                 else if (offset + 2 >= lsvlen)
1437                     retnum = ((unsigned long) s[offset] << 24) +
1438                         ((unsigned long) s[offset + 1] << 16);
1439                 else
1440                     retnum = ((unsigned long) s[offset] << 24) +
1441                         ((unsigned long) s[offset + 1] << 16) +
1442                         (s[offset + 2] << 8);
1443             }
1444         }
1445     }
1446     else if (size < 8)
1447         retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
1448     else {
1449         offset >>= 3;
1450         if (size == 8)
1451             retnum = s[offset];
1452         else if (size == 16)
1453             retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
1454         else if (size == 32)
1455             retnum = ((unsigned long) s[offset] << 24) +
1456                 ((unsigned long) s[offset + 1] << 16) +
1457                 (s[offset + 2] << 8) + s[offset+3];
1458     }
1459
1460     sv_setuv(sv, (UV)retnum);
1461     return 0;
1462 }
1463
1464 int
1465 magic_setvec(SV *sv, MAGIC *mg)
1466 {
1467     do_vecset(sv);      /* XXX slurp this routine */
1468     return 0;
1469 }
1470
1471 int
1472 magic_getdefelem(SV *sv, MAGIC *mg)
1473 {
1474     SV *targ = Nullsv;
1475     if (LvTARGLEN(sv)) {
1476         if (mg->mg_obj) {
1477             SV *ahv = LvTARG(sv);
1478             if (SvTYPE(ahv) == SVt_PVHV) {
1479                 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1480                 if (he)
1481                     targ = HeVAL(he);
1482             }
1483             else {
1484                 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, FALSE, 0);
1485                 if (svp)
1486                     targ = *svp;
1487             }
1488         }
1489         else {
1490             AV* av = (AV*)LvTARG(sv);
1491             if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1492                 targ = AvARRAY(av)[LvTARGOFF(sv)];
1493         }
1494         if (targ && targ != &PL_sv_undef) {
1495             dTHR;               /* just for SvREFCNT_dec */
1496             /* somebody else defined it for us */
1497             SvREFCNT_dec(LvTARG(sv));
1498             LvTARG(sv) = SvREFCNT_inc(targ);
1499             LvTARGLEN(sv) = 0;
1500             SvREFCNT_dec(mg->mg_obj);
1501             mg->mg_obj = Nullsv;
1502             mg->mg_flags &= ~MGf_REFCOUNTED;
1503         }
1504     }
1505     else
1506         targ = LvTARG(sv);
1507     sv_setsv(sv, targ ? targ : &PL_sv_undef);
1508     return 0;
1509 }
1510
1511 int
1512 magic_setdefelem(SV *sv, MAGIC *mg)
1513 {
1514     if (LvTARGLEN(sv))
1515         vivify_defelem(sv);
1516     if (LvTARG(sv)) {
1517         sv_setsv(LvTARG(sv), sv);
1518         SvSETMAGIC(LvTARG(sv));
1519     }
1520     return 0;
1521 }
1522
1523 void
1524 vivify_defelem(SV *sv)
1525 {
1526     dTHR;                       /* just for SvREFCNT_inc and SvREFCNT_dec*/
1527     MAGIC *mg;
1528     SV *value = Nullsv;
1529
1530     if (!LvTARGLEN(sv) || !(mg = mg_find(sv, 'y')))
1531         return;
1532     if (mg->mg_obj) {
1533         SV *ahv = LvTARG(sv);
1534         if (SvTYPE(ahv) == SVt_PVHV) {
1535             HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1536             if (he)
1537                 value = HeVAL(he);
1538         }
1539         else {
1540             SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, TRUE, 0);
1541             if (svp)
1542                 value = *svp;
1543         }
1544         if (!value || value == &PL_sv_undef)
1545             croak(no_helem, SvPV(mg->mg_obj, PL_na));
1546     }
1547     else {
1548         AV* av = (AV*)LvTARG(sv);
1549         if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1550             LvTARG(sv) = Nullsv;        /* array can't be extended */
1551         else {
1552             SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1553             if (!svp || (value = *svp) == &PL_sv_undef)
1554                 croak(no_aelem, (I32)LvTARGOFF(sv));
1555         }
1556     }
1557     (void)SvREFCNT_inc(value);
1558     SvREFCNT_dec(LvTARG(sv));
1559     LvTARG(sv) = value;
1560     LvTARGLEN(sv) = 0;
1561     SvREFCNT_dec(mg->mg_obj);
1562     mg->mg_obj = Nullsv;
1563     mg->mg_flags &= ~MGf_REFCOUNTED;
1564 }
1565
1566 int
1567 magic_setmglob(SV *sv, MAGIC *mg)
1568 {
1569     mg->mg_len = -1;
1570     SvSCREAM_off(sv);
1571     return 0;
1572 }
1573
1574 int
1575 magic_setbm(SV *sv, MAGIC *mg)
1576 {
1577     sv_unmagic(sv, 'B');
1578     SvVALID_off(sv);
1579     return 0;
1580 }
1581
1582 int
1583 magic_setfm(SV *sv, MAGIC *mg)
1584 {
1585     sv_unmagic(sv, 'f');
1586     SvCOMPILED_off(sv);
1587     return 0;
1588 }
1589
1590 int
1591 magic_setuvar(SV *sv, MAGIC *mg)
1592 {
1593     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1594
1595     if (uf && uf->uf_set)
1596         (*uf->uf_set)(uf->uf_index, sv);
1597     return 0;
1598 }
1599
1600 int
1601 magic_freeregexp(SV *sv, MAGIC *mg)
1602 {
1603     regexp *re = (regexp *)mg->mg_obj;
1604     ReREFCNT_dec(re);
1605     return 0;
1606 }
1607
1608 #ifdef USE_LOCALE_COLLATE
1609 int
1610 magic_setcollxfrm(SV *sv, MAGIC *mg)
1611 {
1612     /*
1613      * René Descartes said "I think not."
1614      * and vanished with a faint plop.
1615      */
1616     if (mg->mg_ptr) {
1617         Safefree(mg->mg_ptr);
1618         mg->mg_ptr = NULL;
1619         mg->mg_len = -1;
1620     }
1621     return 0;
1622 }
1623 #endif /* USE_LOCALE_COLLATE */
1624
1625 int
1626 magic_set(SV *sv, MAGIC *mg)
1627 {
1628     dTHR;
1629     register char *s;
1630     I32 i;
1631     STRLEN len;
1632     switch (*mg->mg_ptr) {
1633     case '\001':        /* ^A */
1634         sv_setsv(PL_bodytarget, sv);
1635         break;
1636     case '\002':        /* ^B */
1637         if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
1638             if (memEQ(SvPVX(sv), WARN_ALLstring, WARNsize))
1639                 compiling.cop_warnings = WARN_ALL;
1640             else if (memEQ(SvPVX(sv), WARN_NONEstring, WARNsize))
1641                 compiling.cop_warnings = WARN_NONE;
1642             else {
1643                 if (compiling.cop_warnings != WARN_NONE && 
1644                     compiling.cop_warnings != WARN_ALL)
1645                     sv_setsv(compiling.cop_warnings, sv);
1646                 else
1647                     compiling.cop_warnings = newSVsv(sv) ;
1648             }
1649         }
1650         break;
1651     case '\004':        /* ^D */
1652         PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
1653         DEBUG_x(dump_all());
1654         break;
1655     case '\005':  /* ^E */
1656 #ifdef VMS
1657         set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1658 #else
1659 #ifdef WIN32
1660         SetLastError( SvIV(sv) );
1661 #else
1662         /* will anyone ever use this? */
1663         SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
1664 #endif
1665 #endif
1666         break;
1667     case '\006':        /* ^F */
1668         PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1669         break;
1670     case '\010':        /* ^H */
1671         PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1672         break;
1673     case '\011':        /* ^I */ /* NOT \t in EBCDIC */
1674         if (PL_inplace)
1675             Safefree(PL_inplace);
1676         if (SvOK(sv))
1677             PL_inplace = savepv(SvPV(sv,PL_na));
1678         else
1679             PL_inplace = Nullch;
1680         break;
1681     case '\017':        /* ^O */
1682         if (PL_osname)
1683             Safefree(PL_osname);
1684         if (SvOK(sv))
1685             PL_osname = savepv(SvPV(sv,PL_na));
1686         else
1687             PL_osname = Nullch;
1688         break;
1689     case '\020':        /* ^P */
1690         PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1691         break;
1692     case '\024':        /* ^T */
1693 #ifdef BIG_TIME
1694         PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
1695 #else
1696         PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1697 #endif
1698         break;
1699     case '\027':        /* ^W */
1700         if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
1701             i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1702             PL_dowarn = (i ? G_WARN_ON : G_WARN_OFF) ;
1703         }
1704         break;
1705     case '.':
1706         if (PL_localizing) {
1707             if (PL_localizing == 1)
1708                 save_sptr((SV**)&PL_last_in_gv);
1709         }
1710         else if (SvOK(sv) && GvIO(PL_last_in_gv))
1711             IoLINES(GvIOp(PL_last_in_gv)) = (long)SvIV(sv);
1712         break;
1713     case '^':
1714         Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
1715         IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,PL_na));
1716         IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1717         break;
1718     case '~':
1719         Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
1720         IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,PL_na));
1721         IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1722         break;
1723     case '=':
1724         IoPAGE_LEN(GvIOp(PL_defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1725         break;
1726     case '-':
1727         IoLINES_LEFT(GvIOp(PL_defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1728         if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
1729             IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
1730         break;
1731     case '%':
1732         IoPAGE(GvIOp(PL_defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1733         break;
1734     case '|':
1735         {
1736             IO *io = GvIOp(PL_defoutgv);
1737             if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
1738                 IoFLAGS(io) &= ~IOf_FLUSH;
1739             else {
1740                 if (!(IoFLAGS(io) & IOf_FLUSH)) {
1741                     PerlIO *ofp = IoOFP(io);
1742                     if (ofp)
1743                         (void)PerlIO_flush(ofp);
1744                     IoFLAGS(io) |= IOf_FLUSH;
1745                 }
1746             }
1747         }
1748         break;
1749     case '*':
1750         i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1751         PL_multiline = (i != 0);
1752         break;
1753     case '/':
1754         SvREFCNT_dec(PL_nrs);
1755         PL_nrs = newSVsv(sv);
1756         SvREFCNT_dec(PL_rs);
1757         PL_rs = SvREFCNT_inc(PL_nrs);
1758         break;
1759     case '\\':
1760         if (PL_ors)
1761             Safefree(PL_ors);
1762         if (SvOK(sv) || SvGMAGICAL(sv))
1763             PL_ors = savepv(SvPV(sv,PL_orslen));
1764         else {
1765             PL_ors = Nullch;
1766             PL_orslen = 0;
1767         }
1768         break;
1769     case ',':
1770         if (PL_ofs)
1771             Safefree(PL_ofs);
1772         PL_ofs = savepv(SvPV(sv, PL_ofslen));
1773         break;
1774     case '#':
1775         if (PL_ofmt)
1776             Safefree(PL_ofmt);
1777         PL_ofmt = savepv(SvPV(sv,PL_na));
1778         break;
1779     case '[':
1780         PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1781         break;
1782     case '?':
1783 #ifdef COMPLEX_STATUS
1784         if (PL_localizing == 2) {
1785             PL_statusvalue = LvTARGOFF(sv);
1786             PL_statusvalue_vms = LvTARGLEN(sv);
1787         }
1788         else
1789 #endif
1790 #ifdef VMSISH_STATUS
1791         if (VMSISH_STATUS)
1792             STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
1793         else
1794 #endif
1795             STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1796         break;
1797     case '!':
1798         SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
1799                  (SvIV(sv) == EVMSERR) ? 4 : vaxc$errno);
1800         break;
1801     case '<':
1802         PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1803         if (PL_delaymagic) {
1804             PL_delaymagic |= DM_RUID;
1805             break;                              /* don't do magic till later */
1806         }
1807 #ifdef HAS_SETRUID
1808         (void)setruid((Uid_t)PL_uid);
1809 #else
1810 #ifdef HAS_SETREUID
1811         (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
1812 #else
1813 #ifdef HAS_SETRESUID
1814       (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
1815 #else
1816         if (PL_uid == PL_euid)          /* special case $< = $> */
1817             (void)PerlProc_setuid(PL_uid);
1818         else {
1819             PL_uid = (I32)PerlProc_getuid();
1820             croak("setruid() not implemented");
1821         }
1822 #endif
1823 #endif
1824 #endif
1825         PL_uid = (I32)PerlProc_getuid();
1826         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
1827         break;
1828     case '>':
1829         PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1830         if (PL_delaymagic) {
1831             PL_delaymagic |= DM_EUID;
1832             break;                              /* don't do magic till later */
1833         }
1834 #ifdef HAS_SETEUID
1835         (void)seteuid((Uid_t)PL_euid);
1836 #else
1837 #ifdef HAS_SETREUID
1838         (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
1839 #else
1840 #ifdef HAS_SETRESUID
1841         (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
1842 #else
1843         if (PL_euid == PL_uid)          /* special case $> = $< */
1844             PerlProc_setuid(PL_euid);
1845         else {
1846             PL_euid = (I32)PerlProc_geteuid();
1847             croak("seteuid() not implemented");
1848         }
1849 #endif
1850 #endif
1851 #endif
1852         PL_euid = (I32)PerlProc_geteuid();
1853         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
1854         break;
1855     case '(':
1856         PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1857         if (PL_delaymagic) {
1858             PL_delaymagic |= DM_RGID;
1859             break;                              /* don't do magic till later */
1860         }
1861 #ifdef HAS_SETRGID
1862         (void)setrgid((Gid_t)PL_gid);
1863 #else
1864 #ifdef HAS_SETREGID
1865         (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
1866 #else
1867 #ifdef HAS_SETRESGID
1868       (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
1869 #else
1870         if (PL_gid == PL_egid)                  /* special case $( = $) */
1871             (void)PerlProc_setgid(PL_gid);
1872         else {
1873             PL_gid = (I32)PerlProc_getgid();
1874             croak("setrgid() not implemented");
1875         }
1876 #endif
1877 #endif
1878 #endif
1879         PL_gid = (I32)PerlProc_getgid();
1880         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
1881         break;
1882     case ')':
1883 #ifdef HAS_SETGROUPS
1884         {
1885             char *p = SvPV(sv, PL_na);
1886             Groups_t gary[NGROUPS];
1887
1888             SET_NUMERIC_STANDARD();
1889             while (isSPACE(*p))
1890                 ++p;
1891             PL_egid = I_V(atof(p));
1892             for (i = 0; i < NGROUPS; ++i) {
1893                 while (*p && !isSPACE(*p))
1894                     ++p;
1895                 while (isSPACE(*p))
1896                     ++p;
1897                 if (!*p)
1898                     break;
1899                 gary[i] = I_V(atof(p));
1900             }
1901             if (i)
1902                 (void)setgroups(i, gary);
1903         }
1904 #else  /* HAS_SETGROUPS */
1905         PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1906 #endif /* HAS_SETGROUPS */
1907         if (PL_delaymagic) {
1908             PL_delaymagic |= DM_EGID;
1909             break;                              /* don't do magic till later */
1910         }
1911 #ifdef HAS_SETEGID
1912         (void)setegid((Gid_t)PL_egid);
1913 #else
1914 #ifdef HAS_SETREGID
1915         (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
1916 #else
1917 #ifdef HAS_SETRESGID
1918         (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
1919 #else
1920         if (PL_egid == PL_gid)                  /* special case $) = $( */
1921             (void)PerlProc_setgid(PL_egid);
1922         else {
1923             PL_egid = (I32)PerlProc_getegid();
1924             croak("setegid() not implemented");
1925         }
1926 #endif
1927 #endif
1928 #endif
1929         PL_egid = (I32)PerlProc_getegid();
1930         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
1931         break;
1932     case ':':
1933         PL_chopset = SvPV_force(sv,PL_na);
1934         break;
1935     case '0':
1936         if (!PL_origalen) {
1937             s = PL_origargv[0];
1938             s += strlen(s);
1939             /* See if all the arguments are contiguous in memory */
1940             for (i = 1; i < PL_origargc; i++) {
1941                 if (PL_origargv[i] == s + 1
1942 #ifdef OS2
1943                     || PL_origargv[i] == s + 2
1944 #endif 
1945                    )
1946                     s += strlen(++s);   /* this one is ok too */
1947                 else
1948                     break;
1949             }
1950             /* can grab env area too? */
1951             if (PL_origenviron && (PL_origenviron[0] == s + 1
1952 #ifdef OS2
1953                                 || (PL_origenviron[0] == s + 9 && (s += 8))
1954 #endif 
1955                )) {
1956                 my_setenv("NoNe  SuCh", Nullch);
1957                                             /* force copy of environment */
1958                 for (i = 0; PL_origenviron[i]; i++)
1959                     if (PL_origenviron[i] == s + 1)
1960                         s += strlen(++s);
1961                     else
1962                         break;
1963             }
1964             PL_origalen = s - PL_origargv[0];
1965         }
1966         s = SvPV_force(sv,len);
1967         i = len;
1968         if (i >= PL_origalen) {
1969             i = PL_origalen;
1970             /* don't allow system to limit $0 seen by script */
1971             /* SvCUR_set(sv, i); *SvEND(sv) = '\0'; */
1972             Copy(s, PL_origargv[0], i, char);
1973             s = PL_origargv[0]+i;
1974             *s = '\0';
1975         }
1976         else {
1977             Copy(s, PL_origargv[0], i, char);
1978             s = PL_origargv[0]+i;
1979             *s++ = '\0';
1980             while (++i < PL_origalen)
1981                 *s++ = ' ';
1982             s = PL_origargv[0]+i;
1983             for (i = 1; i < PL_origargc; i++)
1984                 PL_origargv[i] = Nullch;
1985         }
1986         break;
1987 #ifdef USE_THREADS
1988     case '@':
1989         sv_setsv(thr->errsv, sv);
1990         break;
1991 #endif /* USE_THREADS */
1992     }
1993     return 0;
1994 }
1995
1996 #ifdef USE_THREADS
1997 int
1998 magic_mutexfree(SV *sv, MAGIC *mg)
1999 {
2000     dTHR;
2001     DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: magic_mutexfree 0x%lx\n",
2002                           (unsigned long)thr, (unsigned long)sv);)
2003     if (MgOWNER(mg))
2004         croak("panic: magic_mutexfree");
2005     MUTEX_DESTROY(MgMUTEXP(mg));
2006     COND_DESTROY(MgCONDP(mg));
2007     SvREFCNT_dec(sv);
2008     return 0;
2009 }
2010 #endif /* USE_THREADS */
2011
2012 I32
2013 whichsig(char *sig)
2014 {
2015     register char **sigv;
2016
2017     for (sigv = sig_name+1; *sigv; sigv++)
2018         if (strEQ(sig,*sigv))
2019             return sig_num[sigv - sig_name];
2020 #ifdef SIGCLD
2021     if (strEQ(sig,"CHLD"))
2022         return SIGCLD;
2023 #endif
2024 #ifdef SIGCHLD
2025     if (strEQ(sig,"CLD"))
2026         return SIGCHLD;
2027 #endif
2028     return 0;
2029 }
2030
2031 static SV* sig_sv;
2032
2033 STATIC void
2034 unwind_handler_stack(void *p)
2035 {
2036     dTHR;
2037     U32 flags = *(U32*)p;
2038
2039     if (flags & 1)
2040         PL_savestack_ix -= 5; /* Unprotect save in progress. */
2041     /* cxstack_ix-- Not needed, die already unwound it. */
2042     if (flags & 64)
2043         SvREFCNT_dec(sig_sv);
2044 }
2045
2046 Signal_t
2047 sighandler(int sig)
2048 {
2049     dSP;
2050     GV *gv = Nullgv;
2051     HV *st;
2052     SV *sv, *tSv = PL_Sv;
2053     CV *cv = Nullcv;
2054     OP *myop = PL_op;
2055     U32 flags = 0;
2056     I32 o_save_i = PL_savestack_ix, type;
2057     XPV *tXpv = PL_Xpv;
2058     
2059     if (PL_savestack_ix + 15 <= PL_savestack_max)
2060         flags |= 1;
2061     if (PL_markstack_ptr < PL_markstack_max - 2)
2062         flags |= 4;
2063     if (PL_retstack_ix < PL_retstack_max - 2)
2064         flags |= 8;
2065     if (PL_scopestack_ix < PL_scopestack_max - 3)
2066         flags |= 16;
2067
2068     if (!psig_ptr[sig])
2069         die("Signal SIG%s received, but no signal handler set.\n",
2070             sig_name[sig]);
2071
2072     /* Max number of items pushed there is 3*n or 4. We cannot fix
2073        infinity, so we fix 4 (in fact 5): */
2074     if (flags & 1) {
2075         PL_savestack_ix += 5;           /* Protect save in progress. */
2076         o_save_i = PL_savestack_ix;
2077         SAVEDESTRUCTOR(unwind_handler_stack, (void*)&flags);
2078     }
2079     if (flags & 4) 
2080         PL_markstack_ptr++;             /* Protect mark. */
2081     if (flags & 8) {
2082         PL_retstack_ix++;
2083         PL_retstack[PL_retstack_ix] = NULL;
2084     }
2085     if (flags & 16)
2086         PL_scopestack_ix += 1;
2087     /* sv_2cv is too complicated, try a simpler variant first: */
2088     if (!SvROK(psig_ptr[sig]) || !(cv = (CV*)SvRV(psig_ptr[sig])) 
2089         || SvTYPE(cv) != SVt_PVCV)
2090         cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
2091
2092     if (!cv || !CvROOT(cv)) {
2093         if (ckWARN(WARN_SIGNAL))
2094             warner(WARN_SIGNAL, "SIG%s handler \"%s\" not defined.\n",
2095                 sig_name[sig], (gv ? GvENAME(gv)
2096                                 : ((cv && CvGV(cv))
2097                                    ? GvENAME(CvGV(cv))
2098                                    : "__ANON__")));
2099         goto cleanup;
2100     }
2101
2102     if(psig_name[sig]) {
2103         sv = SvREFCNT_inc(psig_name[sig]);
2104         flags |= 64;
2105         sig_sv = sv;
2106     } else {
2107         sv = sv_newmortal();
2108         sv_setpv(sv,sig_name[sig]);
2109     }
2110
2111     PUSHSTACKi(PERLSI_SIGNAL);
2112     PUSHMARK(SP);
2113     PUSHs(sv);
2114     PUTBACK;
2115
2116     perl_call_sv((SV*)cv, G_DISCARD);
2117
2118     POPSTACK;
2119 cleanup:
2120     if (flags & 1)
2121         PL_savestack_ix -= 8; /* Unprotect save in progress. */
2122     if (flags & 4) 
2123         PL_markstack_ptr--;
2124     if (flags & 8) 
2125         PL_retstack_ix--;
2126     if (flags & 16)
2127         PL_scopestack_ix -= 1;
2128     if (flags & 64)
2129         SvREFCNT_dec(sv);
2130     PL_op = myop;                       /* Apparently not needed... */
2131     
2132     PL_Sv = tSv;                        /* Restore global temporaries. */
2133     PL_Xpv = tXpv;
2134     return;
2135 }
2136
2137