Introduce pp_lock.
[p5sagit/p5-mst-13.2.git] / gv.c
1 /*    gv.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  *   'Mercy!' cried Gandalf.  'If the giving of information is to be the cure
12  * of your inquisitiveness, I shall spend all the rest of my days answering
13  * you.  What more do you want to know?'
14  *   'The names of all the stars, and of all living things, and the whole
15  * history of Middle-earth and Over-heaven and of the Sundering Seas,'
16  * laughed Pippin.
17  */
18
19 #include "EXTERN.h"
20 #include "perl.h"
21
22 EXT char rcsid[];
23
24 GV *
25 gv_AVadd(gv)
26 register GV *gv;
27 {
28     if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
29         croak("Bad symbol for array");
30     if (!GvAV(gv))
31         GvAV(gv) = newAV();
32     return gv;
33 }
34
35 GV *
36 gv_HVadd(gv)
37 register GV *gv;
38 {
39     if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
40         croak("Bad symbol for hash");
41     if (!GvHV(gv))
42         GvHV(gv) = newHV();
43     return gv;
44 }
45
46 GV *
47 gv_IOadd(gv)
48 register GV *gv;
49 {
50     if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
51         croak("Bad symbol for filehandle");
52     if (!GvIOp(gv))
53         GvIOp(gv) = newIO();
54     return gv;
55 }
56
57 GV *
58 gv_fetchfile(name)
59 char *name;
60 {
61     dTHR;
62     char smallbuf[256];
63     char *tmpbuf;
64     STRLEN tmplen;
65     GV *gv;
66
67     tmplen = strlen(name) + 2;
68     if (tmplen < sizeof smallbuf)
69         tmpbuf = smallbuf;
70     else
71         New(603, tmpbuf, tmplen + 1, char);
72     tmpbuf[0] = '_';
73     tmpbuf[1] = '<';
74     strcpy(tmpbuf + 2, name);
75     gv = *(GV**)hv_fetch(defstash, tmpbuf, tmplen, TRUE);
76     if (!isGV(gv))
77         gv_init(gv, defstash, tmpbuf, tmplen, FALSE);
78     if (tmpbuf != smallbuf)
79         Safefree(tmpbuf);
80     sv_setpv(GvSV(gv), name);
81     if (*name == '/' && (instr(name, "/lib/") || instr(name, ".pm")))
82         GvMULTI_on(gv);
83     if (perldb)
84         hv_magic(GvHVn(gv_AVadd(gv)), gv, 'L');
85     return gv;
86 }
87
88 void
89 gv_init(gv, stash, name, len, multi)
90 GV *gv;
91 HV *stash;
92 char *name;
93 STRLEN len;
94 int multi;
95 {
96     register GP *gp;
97
98     sv_upgrade((SV*)gv, SVt_PVGV);
99     if (SvLEN(gv))
100         Safefree(SvPVX(gv));
101     Newz(602, gp, 1, GP);
102     GvGP(gv) = gp_ref(gp);
103     GvSV(gv) = NEWSV(72,0);
104     GvLINE(gv) = curcop->cop_line;
105     GvFILEGV(gv) = curcop->cop_filegv;
106     GvEGV(gv) = gv;
107     sv_magic((SV*)gv, (SV*)gv, '*', name, len);
108     GvSTASH(gv) = stash;
109     GvNAME(gv) = savepvn(name, len);
110     GvNAMELEN(gv) = len;
111     if (multi)
112         GvMULTI_on(gv);
113 }
114
115 static void
116 gv_init_sv(gv, sv_type)
117 GV* gv;
118 I32 sv_type;
119 {
120     switch (sv_type) {
121     case SVt_PVIO:
122         (void)GvIOn(gv);
123         break;
124     case SVt_PVAV:
125         (void)GvAVn(gv);
126         break;
127     case SVt_PVHV:
128         (void)GvHVn(gv);
129         break;
130     }
131 }
132
133 GV *
134 gv_fetchmeth(stash, name, len, level)
135 HV* stash;
136 char* name;
137 STRLEN len;
138 I32 level;
139 {
140     AV* av;
141     GV* topgv;
142     GV* gv;
143     GV** gvp;
144     CV* cv;
145
146     if (!stash)
147         return 0;
148     if ((level > 100) || (level < -100))
149         croak("Recursive inheritance detected");
150
151     DEBUG_o( deb("Looking for method %s in package %s\n",name,HvNAME(stash)) );
152
153     gvp = (GV**)hv_fetch(stash, name, len, (level >= 0));
154     if (!gvp)
155         topgv = Nullgv;
156     else {
157         topgv = *gvp;
158         if (SvTYPE(topgv) != SVt_PVGV)
159             gv_init(topgv, stash, name, len, TRUE);
160         if (cv = GvCV(topgv)) {
161             /* If genuine method or valid cache entry, use it */
162             if (!GvCVGEN(topgv) || GvCVGEN(topgv) >= sub_generation)
163                 return topgv;
164             /* Stale cached entry: junk it */
165             SvREFCNT_dec(cv);
166             GvCV(topgv) = cv = Nullcv;
167             GvCVGEN(topgv) = 0;
168         }
169     }
170
171     gvp = (GV**)hv_fetch(stash, "ISA", 3, FALSE);
172     av = (gvp && (gv = *gvp) && gv != (GV*)&sv_undef) ? GvAV(gv) : Nullav;
173
174     /* create @.*::SUPER::ISA on demand */
175     if (!av) {
176         char* packname = HvNAME(stash);
177         STRLEN packlen = strlen(packname);
178
179         if (packlen >= 7 && strEQ(packname + packlen - 7, "::SUPER")) {
180             HV* basestash;
181
182             packlen -= 7;
183             basestash = gv_stashpvn(packname, packlen, TRUE);
184             gvp = (GV**)hv_fetch(basestash, "ISA", 3, FALSE);
185             if (gvp && (gv = *gvp) != (GV*)&sv_undef && (av = GvAV(gv))) {
186                 dTHR;           /* just for SvREFCNT_dec */
187                 gvp = (GV**)hv_fetch(stash, "ISA", 3, TRUE);
188                 if (!gvp || !(gv = *gvp))
189                     croak("Cannot create %s::ISA", HvNAME(stash));
190                 if (SvTYPE(gv) != SVt_PVGV)
191                     gv_init(gv, stash, "ISA", 3, TRUE);
192                 SvREFCNT_dec(GvAV(gv));
193                 GvAV(gv) = (AV*)SvREFCNT_inc(av);
194             }
195         }
196     }
197
198     if (av) {
199         SV** svp = AvARRAY(av);
200         I32 items = AvFILL(av) + 1;
201         while (items--) {
202             SV* sv = *svp++;
203             HV* basestash = gv_stashsv(sv, FALSE);
204             if (!basestash) {
205                 if (dowarn)
206                     warn("Can't locate package %s for @%s::ISA",
207                         SvPVX(sv), HvNAME(stash));
208                 continue;
209             }
210             gv = gv_fetchmeth(basestash, name, len,
211                               (level >= 0) ? level + 1 : level - 1);
212             if (gv)
213                 goto gotcha;
214         }
215     }
216
217     /* if at top level, try UNIVERSAL */
218
219     if (level == 0 || level == -1) {
220         HV* lastchance;
221
222         if (lastchance = gv_stashpvn("UNIVERSAL", 9, FALSE)) {
223             if (gv = gv_fetchmeth(lastchance, name, len,
224                                   (level >= 0) ? level + 1 : level - 1)) {
225           gotcha:
226                 /*
227                  * Cache method in topgv if:
228                  *  1. topgv has no synonyms (else inheritance crosses wires)
229                  *  2. method isn't a stub (else AUTOLOAD fails spectacularly)
230                  */
231                 if (topgv &&
232                     GvREFCNT(topgv) == 1 &&
233                     (cv = GvCV(gv)) &&
234                     (CvROOT(cv) || CvXSUB(cv)))
235                 {
236                     dTHR;       /* just for SvREFCNT_inc */
237                     if (cv = GvCV(topgv))
238                         SvREFCNT_dec(cv);
239                     GvCV(topgv) = (CV*)SvREFCNT_inc(GvCV(gv));
240                     GvCVGEN(topgv) = sub_generation;
241                 }
242                 return gv;
243             }
244         }
245     }
246
247     return 0;
248 }
249
250 GV *
251 gv_fetchmethod(stash, name)
252 HV* stash;
253 char* name;
254 {
255     return gv_fetchmethod_autoload(stash, name, TRUE);
256 }
257
258 GV *
259 gv_fetchmethod_autoload(stash, name, autoload)
260 HV* stash;
261 char* name;
262 I32 autoload;
263 {
264     register char *nend;
265     char *nsplit = 0;
266     GV* gv;
267     
268     for (nend = name; *nend; nend++) {
269         if (*nend == '\'')
270             nsplit = nend;
271         else if (*nend == ':' && *(nend + 1) == ':')
272             nsplit = ++nend;
273     }
274     if (nsplit) {
275         char *origname = name;
276         name = nsplit + 1;
277         if (*nsplit == ':')
278             --nsplit;
279         if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) {
280             /* ->SUPER::method should really be looked up in original stash */
281             SV *tmpstr = sv_2mortal(newSVpvf("%s::SUPER",
282                                              HvNAME(curcop->cop_stash)));
283             stash = gv_stashpvn(SvPVX(tmpstr), SvCUR(tmpstr), TRUE);
284             DEBUG_o( deb("Treating %s as %s::%s\n",
285                          origname, HvNAME(stash), name) );
286         }
287         else
288             stash = gv_stashpvn(origname, nsplit - origname, TRUE);
289     }
290
291     gv = gv_fetchmeth(stash, name, nend - name, 0);
292     if (!gv) {
293         if (strEQ(name,"import"))
294             gv = (GV*)&sv_yes;
295         else if (autoload)
296             gv = gv_autoload4(stash, name, nend - name, TRUE);
297     }
298     else if (autoload) {
299         CV* cv = GvCV(gv);
300         if (!CvROOT(cv) && !CvXSUB(cv)) {
301             GV* stubgv;
302             GV* autogv;
303
304             if (CvANON(cv))
305                 stubgv = gv;
306             else {
307                 stubgv = CvGV(cv);
308                 if (GvCV(stubgv) != cv)         /* orphaned import */
309                     stubgv = gv;
310             }
311             autogv = gv_autoload4(GvSTASH(stubgv),
312                                   GvNAME(stubgv), GvNAMELEN(stubgv), TRUE);
313             if (autogv)
314                 gv = autogv;
315         }
316     }
317
318     return gv;
319 }
320
321 GV*
322 gv_autoload4(stash, name, len, method)
323 HV* stash;
324 char* name;
325 STRLEN len;
326 I32 method;
327 {
328     static char autoload[] = "AUTOLOAD";
329     static STRLEN autolen = 8;
330     GV* gv;
331     CV* cv;
332     HV* varstash;
333     GV* vargv;
334     SV* varsv;
335
336     if (len == autolen && strnEQ(name, autoload, autolen))
337         return Nullgv;
338     if (!(gv = gv_fetchmeth(stash, autoload, autolen, FALSE)))
339         return Nullgv;
340     cv = GvCV(gv);
341
342     /*
343      * Inheriting AUTOLOAD for non-methods works ... for now.
344      */
345     if (dowarn && !method && (GvCVGEN(gv) || GvSTASH(gv) != stash))
346         warn(
347           "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
348              HvNAME(stash), (int)len, name);
349
350     /*
351      * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name.
352      * The subroutine's original name may not be "AUTOLOAD", so we don't
353      * use that, but for lack of anything better we will use the sub's
354      * original package to look up $AUTOLOAD.
355      */
356     varstash = GvSTASH(CvGV(cv));
357     vargv = *(GV**)hv_fetch(varstash, autoload, autolen, TRUE);
358     if (!isGV(vargv))
359         gv_init(vargv, varstash, autoload, autolen, FALSE);
360     varsv = GvSV(vargv);
361     sv_setpv(varsv, HvNAME(stash));
362     sv_catpvn(varsv, "::", 2);
363     sv_catpvn(varsv, name, len);
364     SvTAINTED_off(varsv);
365     return gv;
366 }
367
368 HV*
369 gv_stashpv(name,create)
370 char *name;
371 I32 create;
372 {
373     return gv_stashpvn(name, strlen(name), create);
374 }
375
376 HV*
377 gv_stashpvn(name,namelen,create)
378 char *name;
379 U32 namelen;
380 I32 create;
381 {
382     char smallbuf[256];
383     char *tmpbuf;
384     HV *stash;
385     GV *tmpgv;
386
387     if (namelen + 3 < sizeof smallbuf)
388         tmpbuf = smallbuf;
389     else
390         New(606, tmpbuf, namelen + 3, char);
391     Copy(name,tmpbuf,namelen,char);
392     tmpbuf[namelen++] = ':';
393     tmpbuf[namelen++] = ':';
394     tmpbuf[namelen] = '\0';
395     tmpgv = gv_fetchpv(tmpbuf, create, SVt_PVHV);
396     if (tmpbuf != smallbuf)
397         Safefree(tmpbuf);
398     if (!tmpgv)
399         return 0;
400     if (!GvHV(tmpgv))
401         GvHV(tmpgv) = newHV();
402     stash = GvHV(tmpgv);
403     if (!HvNAME(stash))
404         HvNAME(stash) = savepv(name);
405     return stash;
406 }
407
408 HV*
409 gv_stashsv(sv,create)
410 SV *sv;
411 I32 create;
412 {
413     register char *ptr;
414     STRLEN len;
415     ptr = SvPV(sv,len);
416     return gv_stashpvn(ptr, len, create);
417 }
418
419
420 GV *
421 gv_fetchpv(nambeg,add,sv_type)
422 char *nambeg;
423 I32 add;
424 I32 sv_type;
425 {
426     dTHR;
427     register char *name = nambeg;
428     register GV *gv = 0;
429     GV**gvp;
430     I32 len;
431     register char *namend;
432     HV *stash = 0;
433     U32 add_gvflags = 0;
434     char *tmpbuf;
435
436     if (*name == '*' && isALPHA(name[1])) /* accidental stringify on a GV? */
437         name++;
438
439     for (namend = name; *namend; namend++) {
440         if ((*namend == '\'' && namend[1]) ||
441             (*namend == ':' && namend[1] == ':'))
442         {
443             if (!stash)
444                 stash = defstash;
445             if (!stash || !SvREFCNT(stash)) /* symbol table under destruction */
446                 return Nullgv;
447
448             len = namend - name;
449             if (len > 0) {
450                 New(601, tmpbuf, len+3, char);
451                 Copy(name, tmpbuf, len, char);
452                 tmpbuf[len++] = ':';
453                 tmpbuf[len++] = ':';
454                 tmpbuf[len] = '\0';
455                 gvp = (GV**)hv_fetch(stash,tmpbuf,len,add);
456                 Safefree(tmpbuf);
457                 if (!gvp || *gvp == (GV*)&sv_undef)
458                     return Nullgv;
459                 gv = *gvp;
460
461                 if (SvTYPE(gv) == SVt_PVGV)
462                     GvMULTI_on(gv);
463                 else if (!add)
464                     return Nullgv;
465                 else
466                     gv_init(gv, stash, nambeg, namend - nambeg, (add & 2));
467
468                 if (!(stash = GvHV(gv)))
469                     stash = GvHV(gv) = newHV();
470
471                 if (!HvNAME(stash))
472                     HvNAME(stash) = savepvn(nambeg, namend - nambeg);
473             }
474
475             if (*namend == ':')
476                 namend++;
477             namend++;
478             name = namend;
479             if (!*name)
480                 return gv ? gv : (GV*)*hv_fetch(defstash, "main::", 6, TRUE);
481         }
482     }
483     len = namend - name;
484     if (!len)
485         len = 1;
486
487     /* No stash in name, so see how we can default */
488
489     if (!stash) {
490         if (isIDFIRST(*name)) {
491             bool global = FALSE;
492
493             if (isUPPER(*name)) {
494                 if (*name > 'I') {
495                     if (*name == 'S' && (
496                       strEQ(name, "SIG") ||
497                       strEQ(name, "STDIN") ||
498                       strEQ(name, "STDOUT") ||
499                       strEQ(name, "STDERR") ))
500                         global = TRUE;
501                 }
502                 else if (*name > 'E') {
503                     if (*name == 'I' && strEQ(name, "INC"))
504                         global = TRUE;
505                 }
506                 else if (*name > 'A') {
507                     if (*name == 'E' && strEQ(name, "ENV"))
508                         global = TRUE;
509                 }
510                 else if (*name == 'A' && (
511                   strEQ(name, "ARGV") ||
512                   strEQ(name, "ARGVOUT") ))
513                     global = TRUE;
514             }
515             else if (*name == '_' && !name[1])
516                 global = TRUE;
517
518             if (global)
519                 stash = defstash;
520             else if ((COP*)curcop == &compiling) {
521                 stash = curstash;
522                 if (add && (hints & HINT_STRICT_VARS) &&
523                     sv_type != SVt_PVCV &&
524                     sv_type != SVt_PVGV &&
525                     sv_type != SVt_PVFM &&
526                     sv_type != SVt_PVIO &&
527                     !(len == 1 && sv_type == SVt_PV && strchr("ab",*name)) )
528                 {
529                     gvp = (GV**)hv_fetch(stash,name,len,0);
530                     if (!gvp ||
531                         *gvp == (GV*)&sv_undef ||
532                         SvTYPE(*gvp) != SVt_PVGV)
533                     {
534                         stash = 0;
535                     }
536                     else if (sv_type == SVt_PV   && !GvIMPORTED_SV(*gvp) ||
537                              sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp) ||
538                              sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp) )
539                     {
540                         warn("Variable \"%c%s\" is not imported",
541                             sv_type == SVt_PVAV ? '@' :
542                             sv_type == SVt_PVHV ? '%' : '$',
543                             name);
544                         if (GvCVu(*gvp))
545                             warn("(Did you mean &%s instead?)\n", name);
546                         stash = 0;
547                     }
548                 }
549             }
550             else
551                 stash = curcop->cop_stash;
552         }
553         else
554             stash = defstash;
555     }
556
557     /* By this point we should have a stash and a name */
558
559     if (!stash) {
560         if (add) {
561             warn("Global symbol \"%s\" requires explicit package name", name);
562             ++error_count;
563             stash = curstash ? curstash : defstash;     /* avoid core dumps */
564             add_gvflags = ((sv_type == SVt_PV) ? GVf_IMPORTED_SV
565                            : (sv_type == SVt_PVAV) ? GVf_IMPORTED_AV
566                            : (sv_type == SVt_PVHV) ? GVf_IMPORTED_HV
567                            : 0);
568         }
569         else
570             return Nullgv;
571     }
572
573     if (!SvREFCNT(stash))       /* symbol table under destruction */
574         return Nullgv;
575
576     gvp = (GV**)hv_fetch(stash,name,len,add);
577     if (!gvp || *gvp == (GV*)&sv_undef)
578         return Nullgv;
579     gv = *gvp;
580     if (SvTYPE(gv) == SVt_PVGV) {
581         if (add) {
582             GvMULTI_on(gv);
583             gv_init_sv(gv, sv_type);
584         }
585         return gv;
586     }
587
588     /* Adding a new symbol */
589
590     if (add & 4)
591         warn("Had to create %s unexpectedly", nambeg);
592     gv_init(gv, stash, name, len, add & 2);
593     gv_init_sv(gv, sv_type);
594     GvFLAGS(gv) |= add_gvflags;
595
596     /* set up magic where warranted */
597     switch (*name) {
598     case 'A':
599         if (strEQ(name, "ARGV")) {
600             IoFLAGS(GvIOn(gv)) |= IOf_ARGV|IOf_START;
601         }
602         break;
603
604     case 'a':
605     case 'b':
606         if (len == 1)
607             GvMULTI_on(gv);
608         break;
609     case 'E':
610         if (strnEQ(name, "EXPORT", 6))
611             GvMULTI_on(gv);
612         break;
613     case 'I':
614         if (strEQ(name, "ISA")) {
615             AV* av = GvAVn(gv);
616             GvMULTI_on(gv);
617             sv_magic((SV*)av, (SV*)gv, 'I', Nullch, 0);
618             if (add & 2 && strEQ(nambeg,"AnyDBM_File::ISA") && AvFILL(av) == -1)
619             {
620                 char *pname;
621                 av_push(av, newSVpv(pname = "NDBM_File",0));
622                 gv_stashpvn(pname, 9, TRUE);
623                 av_push(av, newSVpv(pname = "DB_File",0));
624                 gv_stashpvn(pname, 7, TRUE);
625                 av_push(av, newSVpv(pname = "GDBM_File",0));
626                 gv_stashpvn(pname, 9, TRUE);
627                 av_push(av, newSVpv(pname = "SDBM_File",0));
628                 gv_stashpvn(pname, 9, TRUE);
629                 av_push(av, newSVpv(pname = "ODBM_File",0));
630                 gv_stashpvn(pname, 9, TRUE);
631             }
632         }
633         break;
634 #ifdef OVERLOAD
635     case 'O':
636         if (strEQ(name, "OVERLOAD")) {
637             HV* hv = GvHVn(gv);
638             GvMULTI_on(gv);
639             sv_magic((SV*)hv, (SV*)gv, 'A', 0, 0);
640         }
641         break;
642 #endif /* OVERLOAD */
643     case 'S':
644         if (strEQ(name, "SIG")) {
645             HV *hv;
646             I32 i;
647             siggv = gv;
648             GvMULTI_on(siggv);
649             hv = GvHVn(siggv);
650             hv_magic(hv, siggv, 'S');
651             for(i=1;sig_name[i];i++) {
652                 SV ** init;
653                 init=hv_fetch(hv,sig_name[i],strlen(sig_name[i]),1);
654                 if(init)
655                         sv_setsv(*init,&sv_undef);
656                 psig_ptr[i] = 0;
657                 psig_name[i] = 0;
658             }
659             /* initialize signal stack */
660             signalstack = newAV();
661             AvREAL_off(signalstack);
662             av_extend(signalstack, 30);
663             av_fill(signalstack, 0);
664         }
665         break;
666
667     case '&':
668         if (len > 1)
669             break;
670         ampergv = gv;
671         sawampersand = TRUE;
672         goto ro_magicalize;
673
674     case '`':
675         if (len > 1)
676             break;
677         leftgv = gv;
678         sawampersand = TRUE;
679         goto ro_magicalize;
680
681     case '\'':
682         if (len > 1)
683             break;
684         rightgv = gv;
685         sawampersand = TRUE;
686         goto ro_magicalize;
687
688     case ':':
689         if (len > 1)
690             break;
691         sv_setpv(GvSV(gv),chopset);
692         goto magicalize;
693
694     case '?':
695         if (len > 1)
696             break;
697 #ifdef COMPLEX_STATUS
698         sv_upgrade(GvSV(gv), SVt_PVLV);
699 #endif
700         goto magicalize;
701
702     case '#':
703     case '*':
704         if (dowarn && len == 1 && sv_type == SVt_PV)
705             warn("Use of $%s is deprecated", name);
706         /* FALL THROUGH */
707     case '[':
708     case '!':
709     case '^':
710     case '~':
711     case '=':
712     case '-':
713     case '%':
714     case '.':
715     case '(':
716     case ')':
717     case '<':
718     case '>':
719     case ',':
720     case '\\':
721     case '/':
722     case '|':
723     case '\001':
724     case '\004':
725     case '\005':
726     case '\006':
727     case '\010':
728     case '\017':
729     case '\t':
730     case '\020':
731     case '\024':
732     case '\027':
733         if (len > 1)
734             break;
735         goto magicalize;
736
737     case '+':
738     case '1':
739     case '2':
740     case '3':
741     case '4':
742     case '5':
743     case '6':
744     case '7':
745     case '8':
746     case '9':
747       ro_magicalize:
748         SvREADONLY_on(GvSV(gv));
749       magicalize:
750         sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
751         break;
752
753     case '\014':
754         if (len > 1)
755             break;
756         sv_setpv(GvSV(gv),"\f");
757         formfeed = GvSV(gv);
758         break;
759     case ';':
760         if (len > 1)
761             break;
762         sv_setpv(GvSV(gv),"\034");
763         break;
764     case ']':
765         if (len == 1) {
766             SV *sv = GvSV(gv);
767             sv_upgrade(sv, SVt_PVNV);
768             sv_setpv(sv, patchlevel);
769             (void)sv_2nv(sv);
770             SvREADONLY_on(sv);
771         }
772         break;
773     }
774     return gv;
775 }
776
777 void
778 gv_fullname3(sv, gv, prefix)
779 SV *sv;
780 GV *gv;
781 char *prefix;
782 {
783     HV *hv = GvSTASH(gv);
784     if (!hv) {
785         SvOK_off(sv);
786         return;
787     }
788     sv_setpv(sv, prefix ? prefix : "");
789     sv_catpv(sv,HvNAME(hv));
790     sv_catpvn(sv,"::", 2);
791     sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
792 }
793
794 void
795 gv_efullname3(sv, gv, prefix)
796 SV *sv;
797 GV *gv;
798 char *prefix;
799 {
800     GV *egv = GvEGV(gv);
801     if (!egv)
802         egv = gv;
803     gv_fullname3(sv, egv, prefix);
804 }
805
806 /* XXX compatibility with versions <= 5.003. */
807 void
808 gv_fullname(sv,gv)
809 SV *sv;
810 GV *gv;
811 {
812     gv_fullname3(sv, gv, sv == (SV*)gv ? "*" : "");
813 }
814
815 /* XXX compatibility with versions <= 5.003. */
816 void
817 gv_efullname(sv,gv)
818 SV *sv;
819 GV *gv;
820 {
821     gv_efullname3(sv, gv, sv == (SV*)gv ? "*" : "");
822 }
823
824 IO *
825 newIO()
826 {
827     dTHR;
828     IO *io;
829     GV *iogv;
830
831     io = (IO*)NEWSV(0,0);
832     sv_upgrade((SV *)io,SVt_PVIO);
833     SvREFCNT(io) = 1;
834     SvOBJECT_on(io);
835     iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV);
836     SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv));
837     return io;
838 }
839
840 void
841 gv_check(stash)
842 HV* stash;
843 {
844     dTHR;
845     register HE *entry;
846     register I32 i;
847     register GV *gv;
848     HV *hv;
849     GV *filegv;
850
851     if (!HvARRAY(stash))
852         return;
853     for (i = 0; i <= (I32) HvMAX(stash); i++) {
854         for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
855             if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
856                 (gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)) && HvNAME(hv))
857             {
858                 if (hv != defstash)
859                      gv_check(hv);              /* nested package */
860             }
861             else if (isALPHA(*HeKEY(entry))) {
862                 gv = (GV*)HeVAL(entry);
863                 if (GvMULTI(gv))
864                     continue;
865                 curcop->cop_line = GvLINE(gv);
866                 filegv = GvFILEGV(gv);
867                 curcop->cop_filegv = filegv;
868                 if (filegv && GvMULTI(filegv))  /* Filename began with slash */
869                     continue;
870                 warn("Name \"%s::%s\" used only once: possible typo",
871                         HvNAME(stash), GvNAME(gv));
872             }
873         }
874     }
875 }
876
877 GV *
878 newGVgen(pack)
879 char *pack;
880 {
881     return gv_fetchpv(form("%s::_GEN_%ld", pack, (long)gensym++),
882                       TRUE, SVt_PVGV);
883 }
884
885 /* hopefully this is only called on local symbol table entries */
886
887 GP*
888 gp_ref(gp)
889 GP* gp;
890 {
891     gp->gp_refcnt++;
892     if (gp->gp_cv) {
893         if (gp->gp_cvgen) {
894             /* multi-named GPs cannot be used for method cache */
895             SvREFCNT_dec(gp->gp_cv);
896             gp->gp_cv = Nullcv;
897             gp->gp_cvgen = 0;
898         }
899         else {
900             /* Adding a new name to a subroutine invalidates method cache */
901             sub_generation++;
902         }
903     }
904     return gp;
905 }
906
907 void
908 gp_free(gv)
909 GV* gv;
910 {
911     GP* gp;
912     CV* cv;
913
914     if (!gv || !(gp = GvGP(gv)))
915         return;
916     if (gp->gp_refcnt == 0) {
917         warn("Attempt to free unreferenced glob pointers");
918         return;
919     }
920     if (gp->gp_cv) {
921         /* Deleting the name of a subroutine invalidates method cache */
922         sub_generation++;
923     }
924     if (--gp->gp_refcnt > 0) {
925         if (gp->gp_egv == gv)
926             gp->gp_egv = 0;
927         return;
928     }
929
930     SvREFCNT_dec(gp->gp_sv);
931     SvREFCNT_dec(gp->gp_av);
932     SvREFCNT_dec(gp->gp_hv);
933     SvREFCNT_dec(gp->gp_io);
934     SvREFCNT_dec(gp->gp_cv);
935     SvREFCNT_dec(gp->gp_form);
936
937     Safefree(gp);
938     GvGP(gv) = 0;
939 }
940
941 #if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
942 #define MICROPORT
943 #endif
944
945 #ifdef  MICROPORT       /* Microport 2.4 hack */
946 AV *GvAVn(gv)
947 register GV *gv;
948 {
949     if (GvGP(gv)->gp_av) 
950         return GvGP(gv)->gp_av;
951     else
952         return GvGP(gv_AVadd(gv))->gp_av;
953 }
954
955 HV *GvHVn(gv)
956 register GV *gv;
957 {
958     if (GvGP(gv)->gp_hv)
959         return GvGP(gv)->gp_hv;
960     else
961         return GvGP(gv_HVadd(gv))->gp_hv;
962 }
963 #endif                  /* Microport 2.4 hack */
964
965 #ifdef OVERLOAD
966 /* Updates and caches the CV's */
967
968 bool
969 Gv_AMupdate(stash)
970 HV* stash;
971 {
972   dTHR;  
973   GV** gvp;
974   HV* hv;
975   GV* gv;
976   CV* cv;
977   MAGIC* mg=mg_find((SV*)stash,'c');
978   AMT *amtp=mg ? (AMT*)mg->mg_ptr: NULL;
979   AMT amt;
980
981   if (mg && amtp->was_ok_am == amagic_generation
982       && amtp->was_ok_sub == sub_generation)
983       return AMT_AMAGIC(amtp);
984   if (amtp && AMT_AMAGIC(amtp)) {       /* Have table. */
985     int i;
986     for (i=1; i<NofAMmeth; i++) {
987       if (amtp->table[i]) {
988         SvREFCNT_dec(amtp->table[i]);
989       }
990     }
991   }
992   sv_unmagic((SV*)stash, 'c');
993
994   DEBUG_o( deb("Recalcing overload magic in package %s\n",HvNAME(stash)) );
995
996   amt.was_ok_am = amagic_generation;
997   amt.was_ok_sub = sub_generation;
998   amt.fallback = AMGfallNO;
999   amt.flags = 0;
1000
1001 #ifdef OVERLOAD_VIA_HASH
1002   gvp=(GV**)hv_fetch(stash,"OVERLOAD",8,FALSE); /* A shortcut */
1003   if (gvp && ((gv = *gvp) != (GV*)&sv_undef && (hv = GvHV(gv)))) {
1004     int filled=0;
1005     int i;
1006     char *cp;
1007     SV* sv;
1008     SV** svp;
1009
1010     /* Work with "fallback" key, which we assume to be first in AMG_names */
1011
1012     if (( cp = (char *)AMG_names[0] ) &&
1013         (svp = (SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
1014       if (SvTRUE(sv)) amt.fallback=AMGfallYES;
1015       else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
1016     }
1017     for (i = 1; i < NofAMmeth; i++) {
1018       cv = 0;
1019       cp = (char *)AMG_names[i];
1020       
1021         svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
1022         if (svp && ((sv = *svp) != &sv_undef)) {
1023           switch (SvTYPE(sv)) {
1024             default:
1025               if (!SvROK(sv)) {
1026                 if (!SvOK(sv)) break;
1027                 gv = gv_fetchmethod(stash, SvPV(sv, na));
1028                 if (gv) cv = GvCV(gv);
1029                 break;
1030               }
1031               cv = (CV*)SvRV(sv);
1032               if (SvTYPE(cv) == SVt_PVCV)
1033                   break;
1034                 /* FALL THROUGH */
1035             case SVt_PVHV:
1036             case SVt_PVAV:
1037               croak("Not a subroutine reference in overload table");
1038               return FALSE;
1039             case SVt_PVCV:
1040               cv = (CV*)sv;
1041               break;
1042             case SVt_PVGV:
1043               if (!(cv = GvCVu((GV*)sv)))
1044                 cv = sv_2cv(sv, &stash, &gv, TRUE);
1045               break;
1046           }
1047           if (cv) filled=1;
1048           else {
1049             croak("Method for operation %s not found in package %.256s during blessing\n",
1050                 cp,HvNAME(stash));
1051             return FALSE;
1052           }
1053         }
1054 #else
1055   {
1056     int filled = 0;
1057     int i;
1058     const char *cp;
1059     SV* sv = NULL;
1060     SV** svp;
1061
1062     /* Work with "fallback" key, which we assume to be first in AMG_names */
1063
1064     if ( cp = AMG_names[0] ) {
1065         /* Try to find via inheritance. */
1066         gv = gv_fetchmeth(stash, "()", 2, -1); /* A cookie: "()". */
1067         if (gv) sv = GvSV(gv);
1068
1069         if (!gv) goto no_table;
1070         else if (SvTRUE(sv)) amt.fallback=AMGfallYES;
1071         else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
1072     }
1073
1074     for (i = 1; i < NofAMmeth; i++) {
1075         SV *cookie = sv_2mortal(newSVpvf("(%s", cp = AMG_names[i]));
1076         DEBUG_o( deb("Checking overloading of `%s' in package `%.256s'\n",
1077                      cp, HvNAME(stash)) );
1078         /* don't fill the cache while looking up! */
1079         gv = gv_fetchmeth(stash, SvPVX(cookie), SvCUR(cookie), -1);
1080         cv = 0;
1081         if(gv && (cv = GvCV(gv))) {
1082             if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
1083                 && strEQ(HvNAME(GvSTASH(CvGV(cv))), "overload")) {
1084                 /* GvSV contains the name of the method. */
1085                 GV *ngv;
1086                 
1087                 DEBUG_o( deb("Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n", 
1088                              SvPV(GvSV(gv), na), cp, HvNAME(stash)) );
1089                 if (!SvPOK(GvSV(gv)) 
1090                     || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
1091                                                        FALSE)))
1092                 {
1093                     /* Can be an import stub (created by `can'). */
1094                     if (GvCVGEN(gv)) {
1095                         croak("Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'", 
1096                               (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
1097                               cp, HvNAME(stash));
1098                     } else
1099                         croak("Cannot resolve method `%.256s' overloading `%s' in package `%.256s'", 
1100                               (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
1101                               cp, HvNAME(stash));
1102                 }
1103                 cv = GvCV(gv = ngv);
1104             }
1105             DEBUG_o( deb("Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
1106                          cp, HvNAME(stash), HvNAME(GvSTASH(CvGV(cv))),
1107                          GvNAME(CvGV(cv))) );
1108             filled = 1;
1109         }
1110 #endif 
1111         amt.table[i]=(CV*)SvREFCNT_inc(cv);
1112     }
1113     if (filled) {
1114       AMT_AMAGIC_on(&amt);
1115       sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMT));
1116       return TRUE;
1117     }
1118   }
1119   /* Here we have no table: */
1120  no_table:
1121   AMT_AMAGIC_off(&amt);
1122   sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMTS));
1123   return FALSE;
1124 }
1125
1126 /* During call to this subroutine stack can be reallocated. It is
1127  * advised to call SPAGAIN macro in your code after call */
1128
1129 SV*
1130 amagic_call(left,right,method,flags)
1131 SV* left;
1132 SV* right;
1133 int method;
1134 int flags; 
1135 {
1136   dTHR;
1137   MAGIC *mg; 
1138   CV *cv; 
1139   CV **cvp=NULL, **ocvp=NULL;
1140   AMT *amtp, *oamtp;
1141   int fl=0, off, off1, lr=0, assign=AMGf_assign & flags, notfound=0;
1142   int postpr=0, inc_dec_ass=0, assignshift=assign?1:0;
1143   HV* stash;
1144   if (!(AMGf_noleft & flags) && SvAMAGIC(left)
1145       && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c'))
1146       && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr) 
1147                         ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
1148                         : NULL))
1149       && ((cv = cvp[off=method+assignshift]) 
1150           || (assign && amtp->fallback > AMGfallNEVER && /* fallback to
1151                                                           * usual method */
1152                   (fl = 1, cv = cvp[off=method])))) {
1153     lr = -1;                    /* Call method for left argument */
1154   } else {
1155     if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
1156       int logic;
1157
1158       /* look for substituted methods */
1159          switch (method) {
1160          case inc_amg:
1161            if (((cv = cvp[off=add_ass_amg]) && (inc_dec_ass=1))
1162                || ((cv = cvp[off=add_amg]) && (postpr=1))) {
1163              right = &sv_yes; lr = -1; assign = 1;
1164            }
1165            break;
1166          case dec_amg:
1167            if (((cv = cvp[off=subtr_ass_amg])  && (inc_dec_ass=1))
1168                || ((cv = cvp[off=subtr_amg]) && (postpr=1))) {
1169              right = &sv_yes; lr = -1; assign = 1;
1170            }
1171            break;
1172          case bool__amg:
1173            (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]));
1174            break;
1175          case numer_amg:
1176            (void)((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]));
1177            break;
1178          case string_amg:
1179            (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
1180            break;
1181  case not_amg:
1182    (void)((cv = cvp[off=bool__amg]) 
1183           || (cv = cvp[off=numer_amg])
1184           || (cv = cvp[off=string_amg]));
1185    postpr = 1;
1186    break;
1187          case copy_amg:
1188            {
1189              SV* ref=SvRV(left);
1190              if (!SvROK(ref) && SvTYPE(ref) <= SVt_PVMG) {
1191                 /*
1192                  * Just to be extra cautious.  Maybe in some
1193                  * additional cases sv_setsv is safe, too.
1194                  */
1195                 SV* newref = newSVsv(ref);
1196                 SvOBJECT_on(newref);
1197                 SvSTASH(newref) = (HV*)SvREFCNT_inc(SvSTASH(ref));
1198                 return newref;
1199              }
1200            }
1201            break;
1202          case abs_amg:
1203            if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg]) 
1204                && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
1205              SV* nullsv=sv_2mortal(newSViv(0));
1206              if (off1==lt_amg) {
1207                SV* lessp = amagic_call(left,nullsv,
1208                                        lt_amg,AMGf_noright);
1209                logic = SvTRUE(lessp);
1210              } else {
1211                SV* lessp = amagic_call(left,nullsv,
1212                                        ncmp_amg,AMGf_noright);
1213                logic = (SvNV(lessp) < 0);
1214              }
1215              if (logic) {
1216                if (off==subtr_amg) {
1217                  right = left;
1218                  left = nullsv;
1219                  lr = 1;
1220                }
1221              } else {
1222                return left;
1223              }
1224            }
1225            break;
1226          case neg_amg:
1227            if (cv = cvp[off=subtr_amg]) {
1228              right = left;
1229              left = sv_2mortal(newSViv(0));
1230              lr = 1;
1231            }
1232            break;
1233          default:
1234            goto not_found;
1235          }
1236          if (!cv) goto not_found;
1237     } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
1238                && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(right))),'c'))
1239                && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr) 
1240                           ? (amtp = (AMT*)mg->mg_ptr)->table
1241                           : NULL))
1242                && (cv = cvp[off=method])) { /* Method for right
1243                                              * argument found */
1244       lr=1;
1245     } else if (((ocvp && oamtp->fallback > AMGfallNEVER 
1246                  && (cvp=ocvp) && (lr = -1)) 
1247                 || (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
1248                && !(flags & AMGf_unary)) {
1249                                 /* We look for substitution for
1250                                  * comparison operations and
1251                                  * concatenation */
1252       if (method==concat_amg || method==concat_ass_amg
1253           || method==repeat_amg || method==repeat_ass_amg) {
1254         return NULL;            /* Delegate operation to string conversion */
1255       }
1256       off = -1;
1257       switch (method) {
1258          case lt_amg:
1259          case le_amg:
1260          case gt_amg:
1261          case ge_amg:
1262          case eq_amg:
1263          case ne_amg:
1264            postpr = 1; off=ncmp_amg; break;
1265          case slt_amg:
1266          case sle_amg:
1267          case sgt_amg:
1268          case sge_amg:
1269          case seq_amg:
1270          case sne_amg:
1271            postpr = 1; off=scmp_amg; break;
1272          }
1273       if (off != -1) cv = cvp[off];
1274       if (!cv) {
1275         goto not_found;
1276       }
1277     } else {
1278     not_found:                  /* No method found, either report or croak */
1279       if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
1280         notfound = 1; lr = -1;
1281       } else if (cvp && (cv=cvp[nomethod_amg])) {
1282         notfound = 1; lr = 1;
1283       } else {
1284         SV *msg;
1285         if (off==-1) off=method;
1286         msg = sv_2mortal(newSVpvf(
1287                       "Operation `%s': no method found,%sargument %s%s%s%s",
1288                       AMG_names[method + assignshift],
1289                       (flags & AMGf_unary ? " " : "\n\tleft "),
1290                       SvAMAGIC(left)? 
1291                         "in overloaded package ":
1292                         "has no overloaded magic",
1293                       SvAMAGIC(left)? 
1294                         HvNAME(SvSTASH(SvRV(left))):
1295                         "",
1296                       SvAMAGIC(right)? 
1297                         ",\n\tright argument in overloaded package ":
1298                         (flags & AMGf_unary 
1299                          ? ""
1300                          : ",\n\tright argument has no overloaded magic"),
1301                       SvAMAGIC(right)? 
1302                         HvNAME(SvSTASH(SvRV(right))):
1303                         ""));
1304         if (amtp && amtp->fallback >= AMGfallYES) {
1305           DEBUG_o( deb("%s", SvPVX(msg)) );
1306         } else {
1307           croak("%_", msg);
1308         }
1309         return NULL;
1310       }
1311     }
1312   }
1313   if (!notfound) {
1314     DEBUG_o( deb(
1315   "Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
1316                  AMG_names[off],
1317                  method+assignshift==off? "" :
1318                              " (initially `",
1319                  method+assignshift==off? "" :
1320                              AMG_names[method+assignshift],
1321                  method+assignshift==off? "" : "')",
1322                  flags & AMGf_unary? "" :
1323                    lr==1 ? " for right argument": " for left argument",
1324                  flags & AMGf_unary? " for argument" : "",
1325                  HvNAME(stash), 
1326                  fl? ",\n\tassignment variant used": "") );
1327     /* Since we use shallow copy during assignment, we need
1328      * to dublicate the contents, probably calling user-supplied
1329      * version of copy operator
1330      */
1331     if ((method + assignshift==off 
1332          && (assign || method==inc_amg || method==dec_amg))
1333         || inc_dec_ass) RvDEEPCP(left);
1334   }
1335   {
1336     dTHR;
1337     dSP;
1338     BINOP myop;
1339     SV* res;
1340     bool oldcatch = CATCH_GET;
1341
1342     CATCH_SET(TRUE);
1343     Zero(&myop, 1, BINOP);
1344     myop.op_last = (OP *) &myop;
1345     myop.op_next = Nullop;
1346     myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
1347
1348     ENTER;
1349     SAVEOP();
1350     op = (OP *) &myop;
1351     if (perldb && curstash != debstash)
1352         op->op_private |= OPpENTERSUB_DB;
1353     PUTBACK;
1354     pp_pushmark(ARGS);
1355
1356     EXTEND(sp, notfound + 5);
1357     PUSHs(lr>0? right: left);
1358     PUSHs(lr>0? left: right);
1359     PUSHs( lr > 0 ? &sv_yes : ( assign ? &sv_undef : &sv_no ));
1360     if (notfound) {
1361       PUSHs( sv_2mortal(newSVpv((char *)AMG_names[method + assignshift],0)) );
1362     }
1363     PUSHs((SV*)cv);
1364     PUTBACK;
1365
1366     if (op = pp_entersub(ARGS))
1367       runops();
1368     LEAVE;
1369     SPAGAIN;
1370
1371     res=POPs;
1372     PUTBACK;
1373     CATCH_SET(oldcatch);
1374
1375     if (postpr) {
1376       int ans;
1377       switch (method) {
1378       case le_amg:
1379       case sle_amg:
1380         ans=SvIV(res)<=0; break;
1381       case lt_amg:
1382       case slt_amg:
1383         ans=SvIV(res)<0; break;
1384       case ge_amg:
1385       case sge_amg:
1386         ans=SvIV(res)>=0; break;
1387       case gt_amg:
1388       case sgt_amg:
1389         ans=SvIV(res)>0; break;
1390       case eq_amg:
1391       case seq_amg:
1392         ans=SvIV(res)==0; break;
1393       case ne_amg:
1394       case sne_amg:
1395         ans=SvIV(res)!=0; break;
1396       case inc_amg:
1397       case dec_amg:
1398         SvSetSV(left,res); return left;
1399       case not_amg:
1400         ans=!SvOK(res); break;
1401       }
1402       return boolSV(ans);
1403     } else if (method==copy_amg) {
1404       if (!SvROK(res)) {
1405         croak("Copy method did not return a reference");
1406       }
1407       return SvREFCNT_inc(SvRV(res));
1408     } else {
1409       return res;
1410     }
1411   }
1412 }
1413 #endif /* OVERLOAD */