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