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