Mi splgn s gnin.g
[perl.git] / gv.c
1 /*    gv.c
2  *
3  *    Copyright (c) 1991-2000, 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 #define PERL_IN_GV_C
21 #include "perl.h"
22
23 GV *
24 Perl_gv_AVadd(pTHX_ register GV *gv)
25 {
26     if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
27         Perl_croak(aTHX_ "Bad symbol for array");
28     if (!GvAV(gv))
29         GvAV(gv) = newAV();
30     return gv;
31 }
32
33 GV *
34 Perl_gv_HVadd(pTHX_ register GV *gv)
35 {
36     if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
37         Perl_croak(aTHX_ "Bad symbol for hash");
38     if (!GvHV(gv))
39         GvHV(gv) = newHV();
40     return gv;
41 }
42
43 GV *
44 Perl_gv_IOadd(pTHX_ register GV *gv)
45 {
46     if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
47         Perl_croak(aTHX_ "Bad symbol for filehandle");
48     if (!GvIOp(gv))
49         GvIOp(gv) = newIO();
50     return gv;
51 }
52
53 GV *
54 Perl_gv_fetchfile(pTHX_ const char *name)
55 {
56     dTHR;
57     char smallbuf[256];
58     char *tmpbuf;
59     STRLEN tmplen;
60     GV *gv;
61
62     if (!PL_defstash)
63         return Nullgv;
64
65     tmplen = strlen(name) + 2;
66     if (tmplen < sizeof smallbuf)
67         tmpbuf = smallbuf;
68     else
69         New(603, tmpbuf, tmplen + 1, char);
70     tmpbuf[0] = '_';
71     tmpbuf[1] = '<';
72     strcpy(tmpbuf + 2, name);
73     gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE);
74     if (!isGV(gv)) {
75         gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE);
76         sv_setpv(GvSV(gv), name);
77         if (PERLDB_LINE)
78             hv_magic(GvHVn(gv_AVadd(gv)), Nullgv, 'L');
79     }
80     if (tmpbuf != smallbuf)
81         Safefree(tmpbuf);
82     return gv;
83 }
84
85 void
86 Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
87 {
88     dTHR;
89     register GP *gp;
90     bool doproto = SvTYPE(gv) > SVt_NULL;
91     char *proto = (doproto && SvPOK(gv)) ? SvPVX(gv) : NULL;
92
93     sv_upgrade((SV*)gv, SVt_PVGV);
94     if (SvLEN(gv)) {
95         if (proto) {
96             SvPVX(gv) = NULL;
97             SvLEN(gv) = 0;
98             SvPOK_off(gv);
99         } else
100             Safefree(SvPVX(gv));
101     }
102     Newz(602, gp, 1, GP);
103     GvGP(gv) = gp_ref(gp);
104     GvSV(gv) = NEWSV(72,0);
105     GvLINE(gv) = CopLINE(PL_curcop);
106     GvFILE(gv) = CopFILE(PL_curcop) ? CopFILE(PL_curcop) : "";
107     GvCVGEN(gv) = 0;
108     GvEGV(gv) = gv;
109     sv_magic((SV*)gv, (SV*)gv, '*', Nullch, 0);
110     GvSTASH(gv) = (HV*)SvREFCNT_inc(stash);
111     GvNAME(gv) = savepvn(name, len);
112     GvNAMELEN(gv) = len;
113     if (multi || doproto)              /* doproto means it _was_ mentioned */
114         GvMULTI_on(gv);
115     if (doproto) {                      /* Replicate part of newSUB here. */
116         SvIOK_off(gv);
117         ENTER;
118         /* XXX unsafe for threads if eval_owner isn't held */
119         start_subparse(0,0);            /* Create CV in compcv. */
120         GvCV(gv) = PL_compcv;
121         LEAVE;
122
123         PL_sub_generation++;
124         CvGV(GvCV(gv)) = (GV*)SvREFCNT_inc(gv);
125         CvFILE(GvCV(gv)) = CopFILE(PL_curcop);
126         CvSTASH(GvCV(gv)) = PL_curstash;
127 #ifdef USE_THREADS
128         CvOWNER(GvCV(gv)) = 0;
129         if (!CvMUTEXP(GvCV(gv))) {
130             New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex);
131             MUTEX_INIT(CvMUTEXP(GvCV(gv)));
132         }
133 #endif /* USE_THREADS */
134         if (proto) {
135             sv_setpv((SV*)GvCV(gv), proto);
136             Safefree(proto);
137         }
138     }
139 }
140
141 STATIC void
142 S_gv_init_sv(pTHX_ GV *gv, I32 sv_type)
143 {
144     switch (sv_type) {
145     case SVt_PVIO:
146         (void)GvIOn(gv);
147         break;
148     case SVt_PVAV:
149         (void)GvAVn(gv);
150         break;
151     case SVt_PVHV:
152         (void)GvHVn(gv);
153         break;
154     }
155 }
156
157 /*
158 =for apidoc gv_fetchmeth
159
160 Returns the glob with the given C<name> and a defined subroutine or
161 C<NULL>.  The glob lives in the given C<stash>, or in the stashes
162 accessible via @ISA and @UNIVERSAL. 
163
164 The argument C<level> should be either 0 or -1.  If C<level==0>, as a
165 side-effect creates a glob with the given C<name> in the given C<stash>
166 which in the case of success contains an alias for the subroutine, and sets
167 up caching info for this glob.  Similarly for all the searched stashes. 
168
169 This function grants C<"SUPER"> token as a postfix of the stash name. The
170 GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
171 visible to Perl code.  So when calling C<call_sv>, you should not use
172 the GV directly; instead, you should use the method's CV, which can be
173 obtained from the GV with the C<GvCV> macro. 
174
175 =cut
176 */
177
178 GV *
179 Perl_gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level)
180 {
181     AV* av;
182     GV* topgv;
183     GV* gv;
184     GV** gvp;
185     CV* cv;
186
187     if (!stash)
188         return 0;
189     if ((level > 100) || (level < -100))
190         Perl_croak(aTHX_ "Recursive inheritance detected while looking for method '%s' in package '%s'",
191               name, HvNAME(stash));
192
193     DEBUG_o( Perl_deb(aTHX_ "Looking for method %s in package %s\n",name,HvNAME(stash)) );
194
195     gvp = (GV**)hv_fetch(stash, name, len, (level >= 0));
196     if (!gvp)
197         topgv = Nullgv;
198     else {
199         topgv = *gvp;
200         if (SvTYPE(topgv) != SVt_PVGV)
201             gv_init(topgv, stash, name, len, TRUE);
202         if ((cv = GvCV(topgv))) {
203             /* If genuine method or valid cache entry, use it */
204             if (!GvCVGEN(topgv) || GvCVGEN(topgv) == PL_sub_generation)
205                 return topgv;
206             /* Stale cached entry: junk it */
207             SvREFCNT_dec(cv);
208             GvCV(topgv) = cv = Nullcv;
209             GvCVGEN(topgv) = 0;
210         }
211         else if (GvCVGEN(topgv) == PL_sub_generation)
212             return 0;  /* cache indicates sub doesn't exist */
213     }
214
215     gvp = (GV**)hv_fetch(stash, "ISA", 3, FALSE);
216     av = (gvp && (gv = *gvp) && gv != (GV*)&PL_sv_undef) ? GvAV(gv) : Nullav;
217
218     /* create and re-create @.*::SUPER::ISA on demand */
219     if (!av || !SvMAGIC(av)) {
220         char* packname = HvNAME(stash);
221         STRLEN packlen = strlen(packname);
222
223         if (packlen >= 7 && strEQ(packname + packlen - 7, "::SUPER")) {
224             HV* basestash;
225
226             packlen -= 7;
227             basestash = gv_stashpvn(packname, packlen, TRUE);
228             gvp = (GV**)hv_fetch(basestash, "ISA", 3, FALSE);
229             if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (av = GvAV(gv))) {
230                 dTHR;           /* just for SvREFCNT_dec */
231                 gvp = (GV**)hv_fetch(stash, "ISA", 3, TRUE);
232                 if (!gvp || !(gv = *gvp))
233                     Perl_croak(aTHX_ "Cannot create %s::ISA", HvNAME(stash));
234                 if (SvTYPE(gv) != SVt_PVGV)
235                     gv_init(gv, stash, "ISA", 3, TRUE);
236                 SvREFCNT_dec(GvAV(gv));
237                 GvAV(gv) = (AV*)SvREFCNT_inc(av);
238             }
239         }
240     }
241
242     if (av) {
243         SV** svp = AvARRAY(av);
244         /* NOTE: No support for tied ISA */
245         I32 items = AvFILLp(av) + 1;
246         while (items--) {
247             SV* sv = *svp++;
248             HV* basestash = gv_stashsv(sv, FALSE);
249             if (!basestash) {
250                 dTHR;           /* just for ckWARN */
251                 if (ckWARN(WARN_MISC))
252                     Perl_warner(aTHX_ WARN_MISC, "Can't locate package %s for @%s::ISA",
253                         SvPVX(sv), HvNAME(stash));
254                 continue;
255             }
256             gv = gv_fetchmeth(basestash, name, len,
257                               (level >= 0) ? level + 1 : level - 1);
258             if (gv)
259                 goto gotcha;
260         }
261     }
262
263     /* if at top level, try UNIVERSAL */
264
265     if (level == 0 || level == -1) {
266         HV* lastchance;
267
268         if ((lastchance = gv_stashpvn("UNIVERSAL", 9, FALSE))) {
269             if ((gv = gv_fetchmeth(lastchance, name, len,
270                                   (level >= 0) ? level + 1 : level - 1)))
271             {
272           gotcha:
273                 /*
274                  * Cache method in topgv if:
275                  *  1. topgv has no synonyms (else inheritance crosses wires)
276                  *  2. method isn't a stub (else AUTOLOAD fails spectacularly)
277                  */
278                 if (topgv &&
279                     GvREFCNT(topgv) == 1 &&
280                     (cv = GvCV(gv)) &&
281                     (CvROOT(cv) || CvXSUB(cv)))
282                 {
283                     if ((cv = GvCV(topgv)))
284                         SvREFCNT_dec(cv);
285                     GvCV(topgv) = (CV*)SvREFCNT_inc(GvCV(gv));
286                     GvCVGEN(topgv) = PL_sub_generation;
287                 }
288                 return gv;
289             }
290             else if (topgv && GvREFCNT(topgv) == 1) {
291                 /* cache the fact that the method is not defined */
292                 GvCVGEN(topgv) = PL_sub_generation;
293             }
294         }
295     }
296
297     return 0;
298 }
299
300 /*
301 =for apidoc gv_fetchmethod
302
303 See L<gv_fetchmethod_autoload>.
304
305 =cut
306 */
307
308 GV *
309 Perl_gv_fetchmethod(pTHX_ HV *stash, const char *name)
310 {
311     return gv_fetchmethod_autoload(stash, name, TRUE);
312 }
313
314 /*
315 =for apidoc gv_fetchmethod_autoload
316
317 Returns the glob which contains the subroutine to call to invoke the method
318 on the C<stash>.  In fact in the presence of autoloading this may be the
319 glob for "AUTOLOAD".  In this case the corresponding variable $AUTOLOAD is
320 already setup. 
321
322 The third parameter of C<gv_fetchmethod_autoload> determines whether
323 AUTOLOAD lookup is performed if the given method is not present: non-zero
324 means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD. 
325 Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
326 with a non-zero C<autoload> parameter. 
327
328 These functions grant C<"SUPER"> token as a prefix of the method name. Note
329 that if you want to keep the returned glob for a long time, you need to
330 check for it being "AUTOLOAD", since at the later time the call may load a
331 different subroutine due to $AUTOLOAD changing its value. Use the glob
332 created via a side effect to do this. 
333
334 These functions have the same side-effects and as C<gv_fetchmeth> with
335 C<level==0>.  C<name> should be writable if contains C<':'> or C<'
336 ''>. The warning against passing the GV returned by C<gv_fetchmeth> to
337 C<call_sv> apply equally to these functions. 
338
339 =cut
340 */
341
342 GV *
343 Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload)
344 {
345     dTHR;
346     register const char *nend;
347     const char *nsplit = 0;
348     GV* gv;
349     
350     for (nend = name; *nend; nend++) {
351         if (*nend == '\'')
352             nsplit = nend;
353         else if (*nend == ':' && *(nend + 1) == ':')
354             nsplit = ++nend;
355     }
356     if (nsplit) {
357         const char *origname = name;
358         name = nsplit + 1;
359         if (*nsplit == ':')
360             --nsplit;
361         if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) {
362             /* ->SUPER::method should really be looked up in original stash */
363             SV *tmpstr = sv_2mortal(Perl_newSVpvf(aTHX_ "%s::SUPER",
364                                                   CopSTASHPV(PL_curcop)));
365             stash = gv_stashpvn(SvPVX(tmpstr), SvCUR(tmpstr), TRUE);
366             DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n",
367                          origname, HvNAME(stash), name) );
368         }
369         else
370             stash = gv_stashpvn(origname, nsplit - origname, TRUE);
371     }
372
373     gv = gv_fetchmeth(stash, name, nend - name, 0);
374     if (!gv) {
375         if (strEQ(name,"import") || strEQ(name,"unimport"))
376             gv = (GV*)&PL_sv_yes;
377         else if (autoload)
378             gv = gv_autoload4(stash, name, nend - name, TRUE);
379     }
380     else if (autoload) {
381         CV* cv = GvCV(gv);
382         if (!CvROOT(cv) && !CvXSUB(cv)) {
383             GV* stubgv;
384             GV* autogv;
385
386             if (CvANON(cv))
387                 stubgv = gv;
388             else {
389                 stubgv = CvGV(cv);
390                 if (GvCV(stubgv) != cv)         /* orphaned import */
391                     stubgv = gv;
392             }
393             autogv = gv_autoload4(GvSTASH(stubgv),
394                                   GvNAME(stubgv), GvNAMELEN(stubgv), TRUE);
395             if (autogv)
396                 gv = autogv;
397         }
398     }
399
400     return gv;
401 }
402
403 GV*
404 Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
405 {
406     dTHR;
407     static char autoload[] = "AUTOLOAD";
408     static STRLEN autolen = 8;
409     GV* gv;
410     CV* cv;
411     HV* varstash;
412     GV* vargv;
413     SV* varsv;
414
415     if (len == autolen && strnEQ(name, autoload, autolen))
416         return Nullgv;
417     if (!(gv = gv_fetchmeth(stash, autoload, autolen, FALSE)))
418         return Nullgv;
419     cv = GvCV(gv);
420
421     if (!CvROOT(cv))
422         return Nullgv;
423
424     /*
425      * Inheriting AUTOLOAD for non-methods works ... for now.
426      */
427     if (ckWARN(WARN_DEPRECATED) && !method && 
428         (GvCVGEN(gv) || GvSTASH(gv) != stash))
429         Perl_warner(aTHX_ WARN_DEPRECATED,
430           "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
431              HvNAME(stash), (int)len, name);
432
433     /*
434      * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name.
435      * The subroutine's original name may not be "AUTOLOAD", so we don't
436      * use that, but for lack of anything better we will use the sub's
437      * original package to look up $AUTOLOAD.
438      */
439     varstash = GvSTASH(CvGV(cv));
440     vargv = *(GV**)hv_fetch(varstash, autoload, autolen, TRUE);
441     ENTER;
442
443 #ifdef USE_THREADS
444     sv_lock((SV *)varstash);
445 #endif
446     if (!isGV(vargv))
447         gv_init(vargv, varstash, autoload, autolen, FALSE);
448     LEAVE;
449     varsv = GvSV(vargv);
450 #ifdef USE_THREADS
451     sv_lock(varsv);
452 #endif
453     sv_setpv(varsv, HvNAME(stash));
454     sv_catpvn(varsv, "::", 2);
455     sv_catpvn(varsv, name, len);
456     SvTAINTED_off(varsv);
457     return gv;
458 }
459
460 /*
461 =for apidoc gv_stashpv
462
463 Returns a pointer to the stash for a specified package.  C<name> should
464 be a valid UTF-8 string.  If C<create> is set then the package will be
465 created if it does not already exist.  If C<create> is not set and the
466 package does not exist then NULL is returned.
467
468 =cut
469 */
470
471 HV*
472 Perl_gv_stashpv(pTHX_ const char *name, I32 create)
473 {
474     return gv_stashpvn(name, strlen(name), create);
475 }
476
477 HV*
478 Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 create)
479 {
480     char smallbuf[256];
481     char *tmpbuf;
482     HV *stash;
483     GV *tmpgv;
484
485     if (namelen + 3 < sizeof smallbuf)
486         tmpbuf = smallbuf;
487     else
488         New(606, tmpbuf, namelen + 3, char);
489     Copy(name,tmpbuf,namelen,char);
490     tmpbuf[namelen++] = ':';
491     tmpbuf[namelen++] = ':';
492     tmpbuf[namelen] = '\0';
493     tmpgv = gv_fetchpv(tmpbuf, create, SVt_PVHV);
494     if (tmpbuf != smallbuf)
495         Safefree(tmpbuf);
496     if (!tmpgv)
497         return 0;
498     if (!GvHV(tmpgv))
499         GvHV(tmpgv) = newHV();
500     stash = GvHV(tmpgv);
501     if (!HvNAME(stash))
502         HvNAME(stash) = savepv(name);
503     return stash;
504 }
505
506 /*
507 =for apidoc gv_stashsv
508
509 Returns a pointer to the stash for a specified package, which must be a
510 valid UTF-8 string.  See C<gv_stashpv>.
511
512 =cut
513 */
514
515 HV*
516 Perl_gv_stashsv(pTHX_ SV *sv, I32 create)
517 {
518     register char *ptr;
519     STRLEN len;
520     ptr = SvPV(sv,len);
521     return gv_stashpvn(ptr, len, create);
522 }
523
524
525 GV *
526 Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
527 {
528     dTHR;
529     register const char *name = nambeg;
530     register GV *gv = 0;
531     GV**gvp;
532     I32 len;
533     register const char *namend;
534     HV *stash = 0;
535
536     if (*name == '*' && isALPHA(name[1])) /* accidental stringify on a GV? */
537         name++;
538
539     for (namend = name; *namend; namend++) {
540         if ((*namend == ':' && namend[1] == ':')
541             || (*namend == '\'' && namend[1]))
542         {
543             if (!stash)
544                 stash = PL_defstash;
545             if (!stash || !SvREFCNT(stash)) /* symbol table under destruction */
546                 return Nullgv;
547
548             len = namend - name;
549             if (len > 0) {
550                 char smallbuf[256];
551                 char *tmpbuf;
552
553                 if (len + 3 < sizeof smallbuf)
554                     tmpbuf = smallbuf;
555                 else
556                     New(601, tmpbuf, len+3, char);
557                 Copy(name, tmpbuf, len, char);
558                 tmpbuf[len++] = ':';
559                 tmpbuf[len++] = ':';
560                 tmpbuf[len] = '\0';
561                 gvp = (GV**)hv_fetch(stash,tmpbuf,len,add);
562                 gv = gvp ? *gvp : Nullgv;
563                 if (gv && gv != (GV*)&PL_sv_undef) {
564                     if (SvTYPE(gv) != SVt_PVGV)
565                         gv_init(gv, stash, tmpbuf, len, (add & GV_ADDMULTI));
566                     else
567                         GvMULTI_on(gv);
568                 }
569                 if (tmpbuf != smallbuf)
570                     Safefree(tmpbuf);
571                 if (!gv || gv == (GV*)&PL_sv_undef)
572                     return Nullgv;
573
574                 if (!(stash = GvHV(gv)))
575                     stash = GvHV(gv) = newHV();
576
577                 if (!HvNAME(stash))
578                     HvNAME(stash) = savepvn(nambeg, namend - nambeg);
579             }
580
581             if (*namend == ':')
582                 namend++;
583             namend++;
584             name = namend;
585             if (!*name)
586                 return gv ? gv : (GV*)*hv_fetch(PL_defstash, "main::", 6, TRUE);
587         }
588     }
589     len = namend - name;
590     if (!len)
591         len = 1;
592
593     /* No stash in name, so see how we can default */
594
595     if (!stash) {
596         if (isIDFIRST_lazy(name)) {
597             bool global = FALSE;
598
599             if (isUPPER(*name)) {
600                 if (*name == 'S' && (
601                     strEQ(name, "SIG") ||
602                     strEQ(name, "STDIN") ||
603                     strEQ(name, "STDOUT") ||
604                     strEQ(name, "STDERR")))
605                     global = TRUE;
606                 else if (*name == 'I' && strEQ(name, "INC"))
607                     global = TRUE;
608                 else if (*name == 'E' && strEQ(name, "ENV"))
609                     global = TRUE;
610                 else if (*name == 'A' && (
611                   strEQ(name, "ARGV") ||
612                   strEQ(name, "ARGVOUT")))
613                     global = TRUE;
614             }
615             else if (*name == '_' && !name[1])
616                 global = TRUE;
617
618             if (global)
619                 stash = PL_defstash;
620             else if ((COP*)PL_curcop == &PL_compiling) {
621                 stash = PL_curstash;
622                 if (add && (PL_hints & HINT_STRICT_VARS) &&
623                     sv_type != SVt_PVCV &&
624                     sv_type != SVt_PVGV &&
625                     sv_type != SVt_PVFM &&
626                     sv_type != SVt_PVIO &&
627                     !(len == 1 && sv_type == SVt_PV && strchr("ab",*name)) )
628                 {
629                     gvp = (GV**)hv_fetch(stash,name,len,0);
630                     if (!gvp ||
631                         *gvp == (GV*)&PL_sv_undef ||
632                         SvTYPE(*gvp) != SVt_PVGV)
633                     {
634                         stash = 0;
635                     }
636                     else if ((sv_type == SVt_PV   && !GvIMPORTED_SV(*gvp)) ||
637                              (sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp)) ||
638                              (sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp)) )
639                     {
640                         Perl_warn(aTHX_ "Variable \"%c%s\" is not imported",
641                             sv_type == SVt_PVAV ? '@' :
642                             sv_type == SVt_PVHV ? '%' : '$',
643                             name);
644                         if (GvCVu(*gvp))
645                             Perl_warn(aTHX_ "\t(Did you mean &%s instead?)\n", name);
646                         stash = 0;
647                     }
648                 }
649             }
650             else
651                 stash = CopSTASH(PL_curcop);
652         }
653         else
654             stash = PL_defstash;
655     }
656
657     /* By this point we should have a stash and a name */
658
659     if (!stash) {
660         if (add) {
661             qerror(Perl_mess(aTHX_
662                  "Global symbol \"%s%s\" requires explicit package name",
663                  (sv_type == SVt_PV ? "$"
664                   : sv_type == SVt_PVAV ? "@"
665                   : sv_type == SVt_PVHV ? "%"
666                   : ""), name));
667             stash = PL_nullstash;
668         }
669         else
670             return Nullgv;
671     }
672
673     if (!SvREFCNT(stash))       /* symbol table under destruction */
674         return Nullgv;
675
676     gvp = (GV**)hv_fetch(stash,name,len,add);
677     if (!gvp || *gvp == (GV*)&PL_sv_undef)
678         return Nullgv;
679     gv = *gvp;
680     if (SvTYPE(gv) == SVt_PVGV) {
681         if (add) {
682             GvMULTI_on(gv);
683             gv_init_sv(gv, sv_type);
684         }
685         return gv;
686     } else if (add & GV_NOINIT) {
687         return gv;
688     }
689
690     /* Adding a new symbol */
691
692     if (add & GV_ADDWARN && ckWARN_d(WARN_INTERNAL))
693         Perl_warner(aTHX_ WARN_INTERNAL, "Had to create %s unexpectedly", nambeg);
694     gv_init(gv, stash, name, len, add & GV_ADDMULTI);
695     gv_init_sv(gv, sv_type);
696
697     if (isLEXWARN_on && isALPHA(name[0]) && ! ckWARN(WARN_ONCE))
698         GvMULTI_on(gv) ;
699
700     /* set up magic where warranted */
701     switch (*name) {
702     case 'A':
703         if (strEQ(name, "ARGV")) {
704             IoFLAGS(GvIOn(gv)) |= IOf_ARGV|IOf_START;
705         }
706         break;
707     case 'E':
708         if (strnEQ(name, "EXPORT", 6))
709             GvMULTI_on(gv);
710         break;
711     case 'I':
712         if (strEQ(name, "ISA")) {
713             AV* av = GvAVn(gv);
714             GvMULTI_on(gv);
715             sv_magic((SV*)av, (SV*)gv, 'I', Nullch, 0);
716             /* NOTE: No support for tied ISA */
717             if ((add & GV_ADDMULTI) && strEQ(nambeg,"AnyDBM_File::ISA")
718                 && AvFILLp(av) == -1)
719             {
720                 char *pname;
721                 av_push(av, newSVpvn(pname = "NDBM_File",9));
722                 gv_stashpvn(pname, 9, TRUE);
723                 av_push(av, newSVpvn(pname = "DB_File",7));
724                 gv_stashpvn(pname, 7, TRUE);
725                 av_push(av, newSVpvn(pname = "GDBM_File",9));
726                 gv_stashpvn(pname, 9, TRUE);
727                 av_push(av, newSVpvn(pname = "SDBM_File",9));
728                 gv_stashpvn(pname, 9, TRUE);
729                 av_push(av, newSVpvn(pname = "ODBM_File",9));
730                 gv_stashpvn(pname, 9, TRUE);
731             }
732         }
733         break;
734     case 'O':
735         if (strEQ(name, "OVERLOAD")) {
736             HV* hv = GvHVn(gv);
737             GvMULTI_on(gv);
738             hv_magic(hv, Nullgv, 'A');
739         }
740         break;
741     case 'S':
742         if (strEQ(name, "SIG")) {
743             HV *hv;
744             I32 i;
745             if (!PL_psig_ptr) {
746                 int sig_num[] = { SIG_NUM };
747                 New(73, PL_psig_ptr, sizeof(sig_num)/sizeof(*sig_num), SV*);
748                 New(73, PL_psig_name, sizeof(sig_num)/sizeof(*sig_num), SV*);
749             }
750             GvMULTI_on(gv);
751             hv = GvHVn(gv);
752             hv_magic(hv, Nullgv, 'S');
753             for (i = 1; PL_sig_name[i]; i++) {
754                 SV ** init;
755                 init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1);
756                 if (init)
757                     sv_setsv(*init, &PL_sv_undef);
758                 PL_psig_ptr[i] = 0;
759                 PL_psig_name[i] = 0;
760             }
761         }
762         break;
763     case 'V':
764         if (strEQ(name, "VERSION"))
765             GvMULTI_on(gv);
766         break;
767
768     case '&':
769         if (len > 1)
770             break;
771         PL_sawampersand = TRUE;
772         goto ro_magicalize;
773
774     case '`':
775         if (len > 1)
776             break;
777         PL_sawampersand = TRUE;
778         goto ro_magicalize;
779
780     case '\'':
781         if (len > 1)
782             break;
783         PL_sawampersand = TRUE;
784         goto ro_magicalize;
785
786     case ':':
787         if (len > 1)
788             break;
789         sv_setpv(GvSV(gv),PL_chopset);
790         goto magicalize;
791
792     case '?':
793         if (len > 1)
794             break;
795 #ifdef COMPLEX_STATUS
796         (void)SvUPGRADE(GvSV(gv), SVt_PVLV);
797 #endif
798         goto magicalize;
799
800     case '!':
801         if (len > 1)
802             break;
803         if (sv_type > SVt_PV && PL_curcop != &PL_compiling) {
804             HV* stash = gv_stashpvn("Errno",5,FALSE);
805             if (!stash || !(gv_fetchmethod(stash, "TIEHASH"))) {
806                 dSP;
807                 PUTBACK;
808                 require_pv("Errno.pm");
809                 SPAGAIN;
810                 stash = gv_stashpvn("Errno",5,FALSE);
811                 if (!stash || !(gv_fetchmethod(stash, "TIEHASH")))
812                     Perl_croak(aTHX_ "Can't use %%! because Errno.pm is not available");
813             }
814         }
815         goto magicalize;
816     case '-':
817         if (len > 1)
818             break;
819         else {
820             AV* av = GvAVn(gv);
821             sv_magic((SV*)av, Nullsv, 'D', Nullch, 0);
822             SvREADONLY_on(av);
823         }
824         goto magicalize;
825     case '#':
826     case '*':
827         if (ckWARN(WARN_DEPRECATED) && len == 1 && sv_type == SVt_PV)
828             Perl_warner(aTHX_ WARN_DEPRECATED, "Use of $%s is deprecated", name);
829         /* FALL THROUGH */
830     case '[':
831     case '^':
832     case '~':
833     case '=':
834     case '%':
835     case '.':
836     case '(':
837     case ')':
838     case '<':
839     case '>':
840     case ',':
841     case '\\':
842     case '/':
843     case '|':
844     case '\001':        /* $^A */
845     case '\003':        /* $^C */
846     case '\004':        /* $^D */
847     case '\005':        /* $^E */
848     case '\006':        /* $^F */
849     case '\010':        /* $^H */
850     case '\011':        /* $^I, NOT \t in EBCDIC */
851     case '\017':        /* $^O */
852     case '\020':        /* $^P */
853     case '\024':        /* $^T */
854         if (len > 1)
855             break;
856         goto magicalize;
857     case '\023':        /* $^S */
858         if (len > 1)
859             break;
860         goto ro_magicalize;
861     case '\027':        /* $^W & $^WARNING_BITS */
862         if (len > 1 && strNE(name, "\027ARNING_BITS")
863             && strNE(name, "\027IDE_SYSTEM_CALLS"))
864             break;
865         goto magicalize;
866
867     case '+':
868         if (len > 1)
869             break;
870         else {
871             AV* av = GvAVn(gv);
872             sv_magic((SV*)av, (SV*)av, 'D', Nullch, 0);
873             SvREADONLY_on(av);
874         }
875         /* FALL THROUGH */
876     case '1':
877     case '2':
878     case '3':
879     case '4':
880     case '5':
881     case '6':
882     case '7':
883     case '8':
884     case '9':
885       ro_magicalize:
886         SvREADONLY_on(GvSV(gv));
887       magicalize:
888         sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
889         break;
890
891     case '\014':        /* $^L */
892         if (len > 1)
893             break;
894         sv_setpv(GvSV(gv),"\f");
895         PL_formfeed = GvSV(gv);
896         break;
897     case ';':
898         if (len > 1)
899             break;
900         sv_setpv(GvSV(gv),"\034");
901         break;
902     case ']':
903         if (len == 1) {
904             SV *sv = GvSV(gv);
905             (void)SvUPGRADE(sv, SVt_PVNV);
906             Perl_sv_setpvf(aTHX_ sv,
907 #if defined(PERL_SUBVERSION) && (PERL_SUBVERSION > 0)
908                             "%8.6"
909 #else
910                             "%5.3"
911 #endif
912                             NVff,
913                             SvNVX(PL_patchlevel));
914             SvNVX(sv) = SvNVX(PL_patchlevel);
915             SvNOK_on(sv);
916             SvREADONLY_on(sv);
917         }
918         break;
919     case '\026':        /* $^V */
920         if (len == 1) {
921             SV *sv = GvSV(gv);
922             GvSV(gv) = SvREFCNT_inc(PL_patchlevel);
923             SvREFCNT_dec(sv);
924         }
925         break;
926     }
927     return gv;
928 }
929
930 void
931 Perl_gv_fullname4(pTHX_ SV *sv, GV *gv, const char *prefix, bool keepmain)
932 {
933     HV *hv = GvSTASH(gv);
934     if (!hv) {
935         (void)SvOK_off(sv);
936         return;
937     }
938     sv_setpv(sv, prefix ? prefix : "");
939     if (keepmain || strNE(HvNAME(hv), "main")) {
940         sv_catpv(sv,HvNAME(hv));
941         sv_catpvn(sv,"::", 2);
942     }
943     sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
944 }
945
946 void
947 Perl_gv_fullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
948 {
949     HV *hv = GvSTASH(gv);
950     if (!hv) {
951         (void)SvOK_off(sv);
952         return;
953     }
954     sv_setpv(sv, prefix ? prefix : "");
955     sv_catpv(sv,HvNAME(hv));
956     sv_catpvn(sv,"::", 2);
957     sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
958 }
959
960 void
961 Perl_gv_efullname4(pTHX_ SV *sv, GV *gv, const char *prefix, bool keepmain)
962 {
963     GV *egv = GvEGV(gv);
964     if (!egv)
965         egv = gv;
966     gv_fullname4(sv, egv, prefix, keepmain);
967 }
968
969 void
970 Perl_gv_efullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
971 {
972     GV *egv = GvEGV(gv);
973     if (!egv)
974         egv = gv;
975     gv_fullname3(sv, egv, prefix);
976 }
977
978 /* XXX compatibility with versions <= 5.003. */
979 void
980 Perl_gv_fullname(pTHX_ SV *sv, GV *gv)
981 {
982     gv_fullname3(sv, gv, sv == (SV*)gv ? "*" : "");
983 }
984
985 /* XXX compatibility with versions <= 5.003. */
986 void
987 Perl_gv_efullname(pTHX_ SV *sv, GV *gv)
988 {
989     gv_efullname3(sv, gv, sv == (SV*)gv ? "*" : "");
990 }
991
992 IO *
993 Perl_newIO(pTHX)
994 {
995     dTHR;
996     IO *io;
997     GV *iogv;
998
999     io = (IO*)NEWSV(0,0);
1000     sv_upgrade((SV *)io,SVt_PVIO);
1001     SvREFCNT(io) = 1;
1002     SvOBJECT_on(io);
1003     iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV);
1004     /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */
1005     if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv))))
1006       iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV);
1007     SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv));
1008     return io;
1009 }
1010
1011 void
1012 Perl_gv_check(pTHX_ HV *stash)
1013 {
1014     dTHR;
1015     register HE *entry;
1016     register I32 i;
1017     register GV *gv;
1018     HV *hv;
1019
1020     if (!HvARRAY(stash))
1021         return;
1022     for (i = 0; i <= (I32) HvMAX(stash); i++) {
1023         for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
1024             if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
1025                 (gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)) && HvNAME(hv))
1026             {
1027                 if (hv != PL_defstash && hv != stash)
1028                      gv_check(hv);              /* nested package */
1029             }
1030             else if (isALPHA(*HeKEY(entry))) {
1031                 char *file;
1032                 gv = (GV*)HeVAL(entry);
1033                 if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
1034                     continue;
1035                 file = GvFILE(gv);
1036                 /* performance hack: if filename is absolute and it's a standard
1037                  * module, don't bother warning */
1038                 if (file
1039                     && PERL_FILE_IS_ABSOLUTE(file)
1040                     && (instr(file, "/lib/") || instr(file, ".pm")))
1041                 {
1042                     continue;
1043                 }
1044                 CopLINE_set(PL_curcop, GvLINE(gv));
1045 #ifdef USE_ITHREADS
1046                 CopFILE(PL_curcop) = file;      /* set for warning */
1047 #else
1048                 CopFILEGV(PL_curcop) = gv_fetchfile(file);
1049 #endif
1050                 Perl_warner(aTHX_ WARN_ONCE,
1051                         "Name \"%s::%s\" used only once: possible typo",
1052                         HvNAME(stash), GvNAME(gv));
1053             }
1054         }
1055     }
1056 }
1057
1058 GV *
1059 Perl_newGVgen(pTHX_ char *pack)
1060 {
1061     return gv_fetchpv(Perl_form(aTHX_ "%s::_GEN_%ld", pack, (long)PL_gensym++),
1062                       TRUE, SVt_PVGV);
1063 }
1064
1065 /* hopefully this is only called on local symbol table entries */
1066
1067 GP*
1068 Perl_gp_ref(pTHX_ GP *gp)
1069 {
1070     if (!gp)
1071         return (GP*)NULL;
1072     gp->gp_refcnt++;
1073     if (gp->gp_cv) {
1074         if (gp->gp_cvgen) {
1075             /* multi-named GPs cannot be used for method cache */
1076             SvREFCNT_dec(gp->gp_cv);
1077             gp->gp_cv = Nullcv;
1078             gp->gp_cvgen = 0;
1079         }
1080         else {
1081             /* Adding a new name to a subroutine invalidates method cache */
1082             PL_sub_generation++;
1083         }
1084     }
1085     return gp;
1086 }
1087
1088 void
1089 Perl_gp_free(pTHX_ GV *gv)
1090 {
1091     dTHR;  
1092     GP* gp;
1093
1094     if (!gv || !(gp = GvGP(gv)))
1095         return;
1096     if (gp->gp_refcnt == 0) {
1097         if (ckWARN_d(WARN_INTERNAL))
1098             Perl_warner(aTHX_ WARN_INTERNAL,
1099                         "Attempt to free unreferenced glob pointers");
1100         return;
1101     }
1102     if (gp->gp_cv) {
1103         /* Deleting the name of a subroutine invalidates method cache */
1104         PL_sub_generation++;
1105     }
1106     if (--gp->gp_refcnt > 0) {
1107         if (gp->gp_egv == gv)
1108             gp->gp_egv = 0;
1109         return;
1110     }
1111
1112     SvREFCNT_dec(gp->gp_sv);
1113     SvREFCNT_dec(gp->gp_av);
1114     SvREFCNT_dec(gp->gp_hv);
1115     SvREFCNT_dec(gp->gp_io);
1116     SvREFCNT_dec(gp->gp_cv);
1117     SvREFCNT_dec(gp->gp_form);
1118
1119     Safefree(gp);
1120     GvGP(gv) = 0;
1121 }
1122
1123 #if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
1124 #define MICROPORT
1125 #endif
1126
1127 #ifdef  MICROPORT       /* Microport 2.4 hack */
1128 AV *GvAVn(gv)
1129 register GV *gv;
1130 {
1131     if (GvGP(gv)->gp_av) 
1132         return GvGP(gv)->gp_av;
1133     else
1134         return GvGP(gv_AVadd(gv))->gp_av;
1135 }
1136
1137 HV *GvHVn(gv)
1138 register GV *gv;
1139 {
1140     if (GvGP(gv)->gp_hv)
1141         return GvGP(gv)->gp_hv;
1142     else
1143         return GvGP(gv_HVadd(gv))->gp_hv;
1144 }
1145 #endif                  /* Microport 2.4 hack */
1146
1147 /* Updates and caches the CV's */
1148
1149 bool
1150 Perl_Gv_AMupdate(pTHX_ HV *stash)
1151 {
1152   dTHR;
1153   GV* gv;
1154   CV* cv;
1155   MAGIC* mg=mg_find((SV*)stash,'c');
1156   AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL;
1157   AMT amt;
1158   STRLEN n_a;
1159 #ifdef OVERLOAD_VIA_HASH
1160   GV** gvp;
1161   HV* hv;
1162 #endif
1163
1164   if (mg && amtp->was_ok_am == PL_amagic_generation
1165       && amtp->was_ok_sub == PL_sub_generation)
1166       return AMT_AMAGIC(amtp);
1167   if (amtp && AMT_AMAGIC(amtp)) {       /* Have table. */
1168     int i;
1169     for (i=1; i<NofAMmeth; i++) {
1170       if (amtp->table[i]) {
1171         SvREFCNT_dec(amtp->table[i]);
1172       }
1173     }
1174   }
1175   sv_unmagic((SV*)stash, 'c');
1176
1177   DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME(stash)) );
1178
1179   amt.was_ok_am = PL_amagic_generation;
1180   amt.was_ok_sub = PL_sub_generation;
1181   amt.fallback = AMGfallNO;
1182   amt.flags = 0;
1183
1184 #ifdef OVERLOAD_VIA_HASH
1185   gvp=(GV**)hv_fetch(stash,"OVERLOAD",8,FALSE); /* A shortcut */
1186   if (gvp && ((gv = *gvp) != (GV*)&PL_sv_undef && (hv = GvHV(gv)))) {
1187     int filled=0;
1188     int i;
1189     char *cp;
1190     SV* sv;
1191     SV** svp;
1192
1193     /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
1194
1195     if (( cp = (char *)PL_AMG_names[0] ) &&
1196         (svp = (SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
1197       if (SvTRUE(sv)) amt.fallback=AMGfallYES;
1198       else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
1199     }
1200     for (i = 1; i < NofAMmeth; i++) {
1201       cv = 0;
1202       cp = (char *)PL_AMG_names[i];
1203       
1204         svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
1205         if (svp && ((sv = *svp) != &PL_sv_undef)) {
1206           switch (SvTYPE(sv)) {
1207             default:
1208               if (!SvROK(sv)) {
1209                 if (!SvOK(sv)) break;
1210                 gv = gv_fetchmethod(stash, SvPV(sv, n_a));
1211                 if (gv) cv = GvCV(gv);
1212                 break;
1213               }
1214               cv = (CV*)SvRV(sv);
1215               if (SvTYPE(cv) == SVt_PVCV)
1216                   break;
1217                 /* FALL THROUGH */
1218             case SVt_PVHV:
1219             case SVt_PVAV:
1220               Perl_croak(aTHX_ "Not a subroutine reference in overload table");
1221               return FALSE;
1222             case SVt_PVCV:
1223               cv = (CV*)sv;
1224               break;
1225             case SVt_PVGV:
1226               if (!(cv = GvCVu((GV*)sv)))
1227                 cv = sv_2cv(sv, &stash, &gv, FALSE);
1228               break;
1229           }
1230           if (cv) filled=1;
1231           else {
1232             Perl_croak(aTHX_ "Method for operation %s not found in package %.256s during blessing\n",
1233                 cp,HvNAME(stash));
1234             return FALSE;
1235           }
1236         }
1237 #else
1238   {
1239     int filled = 0;
1240     int i;
1241     const char *cp;
1242     SV* sv = NULL;
1243
1244     /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
1245
1246     if ((cp = PL_AMG_names[0])) {
1247         /* Try to find via inheritance. */
1248         gv = gv_fetchmeth(stash, "()", 2, -1); /* A cookie: "()". */
1249         if (gv)
1250             sv = GvSV(gv);
1251
1252         if (!gv)
1253             goto no_table;
1254         else if (SvTRUE(sv))
1255             amt.fallback=AMGfallYES;
1256         else if (SvOK(sv))
1257             amt.fallback=AMGfallNEVER;
1258     }
1259
1260     for (i = 1; i < NofAMmeth; i++) {
1261         SV *cookie = sv_2mortal(Perl_newSVpvf(aTHX_ "(%s", cp = PL_AMG_names[i]));
1262         DEBUG_o( Perl_deb(aTHX_ "Checking overloading of `%s' in package `%.256s'\n",
1263                      cp, HvNAME(stash)) );
1264         /* don't fill the cache while looking up! */
1265         gv = gv_fetchmeth(stash, SvPVX(cookie), SvCUR(cookie), -1);
1266         cv = 0;
1267         if(gv && (cv = GvCV(gv))) {
1268             if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
1269                 && strEQ(HvNAME(GvSTASH(CvGV(cv))), "overload")) {
1270                 /* GvSV contains the name of the method. */
1271                 GV *ngv;
1272                 
1273                 DEBUG_o( Perl_deb(aTHX_ "Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n", 
1274                              SvPV(GvSV(gv), n_a), cp, HvNAME(stash)) );
1275                 if (!SvPOK(GvSV(gv)) 
1276                     || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
1277                                                        FALSE)))
1278                 {
1279                     /* Can be an import stub (created by `can'). */
1280                     if (GvCVGEN(gv)) {
1281                         Perl_croak(aTHX_ "Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'", 
1282                               (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
1283                               cp, HvNAME(stash));
1284                     } else
1285                         Perl_croak(aTHX_ "Can't resolve method `%.256s' overloading `%s' in package `%.256s'", 
1286                               (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
1287                               cp, HvNAME(stash));
1288                 }
1289                 cv = GvCV(gv = ngv);
1290             }
1291             DEBUG_o( Perl_deb(aTHX_ "Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
1292                          cp, HvNAME(stash), HvNAME(GvSTASH(CvGV(cv))),
1293                          GvNAME(CvGV(cv))) );
1294             filled = 1;
1295         }
1296 #endif 
1297         amt.table[i]=(CV*)SvREFCNT_inc(cv);
1298     }
1299     if (filled) {
1300       AMT_AMAGIC_on(&amt);
1301       sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMT));
1302       return TRUE;
1303     }
1304   }
1305   /* Here we have no table: */
1306  no_table:
1307   AMT_AMAGIC_off(&amt);
1308   sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMTS));
1309   return FALSE;
1310 }
1311
1312 SV*
1313 Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
1314 {
1315   dTHR;
1316   MAGIC *mg; 
1317   CV *cv; 
1318   CV **cvp=NULL, **ocvp=NULL;
1319   AMT *amtp, *oamtp;
1320   int fl=0, off, off1, lr=0, assign=AMGf_assign & flags, notfound=0;
1321   int postpr = 0, force_cpy = 0, assignshift = assign ? 1 : 0;
1322   HV* stash;
1323   if (!(AMGf_noleft & flags) && SvAMAGIC(left)
1324       && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c'))
1325       && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr) 
1326                         ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
1327                         : (CV **) NULL))
1328       && ((cv = cvp[off=method+assignshift]) 
1329           || (assign && amtp->fallback > AMGfallNEVER && /* fallback to
1330                                                           * usual method */
1331                   (fl = 1, cv = cvp[off=method])))) {
1332     lr = -1;                    /* Call method for left argument */
1333   } else {
1334     if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
1335       int logic;
1336
1337       /* look for substituted methods */
1338       /* In all the covered cases we should be called with assign==0. */
1339          switch (method) {
1340          case inc_amg:
1341            force_cpy = 1;
1342            if ((cv = cvp[off=add_ass_amg])
1343                || ((cv = cvp[off = add_amg]) && (force_cpy = 0, postpr = 1))) {
1344              right = &PL_sv_yes; lr = -1; assign = 1;
1345            }
1346            break;
1347          case dec_amg:
1348            force_cpy = 1;
1349            if ((cv = cvp[off = subtr_ass_amg])
1350                || ((cv = cvp[off = subtr_amg]) && (force_cpy = 0, postpr=1))) {
1351              right = &PL_sv_yes; lr = -1; assign = 1;
1352            }
1353            break;
1354          case bool__amg:
1355            (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]));
1356            break;
1357          case numer_amg:
1358            (void)((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]));
1359            break;
1360          case string_amg:
1361            (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
1362            break;
1363  case not_amg:
1364    (void)((cv = cvp[off=bool__amg]) 
1365           || (cv = cvp[off=numer_amg])
1366           || (cv = cvp[off=string_amg]));
1367    postpr = 1;
1368    break;
1369          case copy_amg:
1370            {
1371              /*
1372                   * SV* ref causes confusion with the interpreter variable of
1373                   * the same name
1374                   */
1375              SV* tmpRef=SvRV(left);
1376              if (!SvROK(tmpRef) && SvTYPE(tmpRef) <= SVt_PVMG) {
1377                 /*
1378                  * Just to be extra cautious.  Maybe in some
1379                  * additional cases sv_setsv is safe, too.
1380                  */
1381                 SV* newref = newSVsv(tmpRef);
1382                 SvOBJECT_on(newref);
1383                 SvSTASH(newref) = (HV*)SvREFCNT_inc(SvSTASH(tmpRef));
1384                 return newref;
1385              }
1386            }
1387            break;
1388          case abs_amg:
1389            if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg]) 
1390                && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
1391              SV* nullsv=sv_2mortal(newSViv(0));
1392              if (off1==lt_amg) {
1393                SV* lessp = amagic_call(left,nullsv,
1394                                        lt_amg,AMGf_noright);
1395                logic = SvTRUE(lessp);
1396              } else {
1397                SV* lessp = amagic_call(left,nullsv,
1398                                        ncmp_amg,AMGf_noright);
1399                logic = (SvNV(lessp) < 0);
1400              }
1401              if (logic) {
1402                if (off==subtr_amg) {
1403                  right = left;
1404                  left = nullsv;
1405                  lr = 1;
1406                }
1407              } else {
1408                return left;
1409              }
1410            }
1411            break;
1412          case neg_amg:
1413            if ((cv = cvp[off=subtr_amg])) {
1414              right = left;
1415              left = sv_2mortal(newSViv(0));
1416              lr = 1;
1417            }
1418            break;
1419          case iter_amg:                 /* XXXX Eventually should do to_gv. */
1420          case to_sv_amg:
1421          case to_av_amg:
1422          case to_hv_amg:
1423          case to_gv_amg:
1424          case to_cv_amg:
1425              /* FAIL safe */
1426              return NULL;       /* Delegate operation to standard mechanisms. */
1427              break;
1428          default:
1429            goto not_found;
1430          }
1431          if (!cv) goto not_found;
1432     } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
1433                && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(right))),'c'))
1434                && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr) 
1435                           ? (amtp = (AMT*)mg->mg_ptr)->table
1436                           : (CV **) NULL))
1437                && (cv = cvp[off=method])) { /* Method for right
1438                                              * argument found */
1439       lr=1;
1440     } else if (((ocvp && oamtp->fallback > AMGfallNEVER 
1441                  && (cvp=ocvp) && (lr = -1)) 
1442                 || (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
1443                && !(flags & AMGf_unary)) {
1444                                 /* We look for substitution for
1445                                  * comparison operations and
1446                                  * concatenation */
1447       if (method==concat_amg || method==concat_ass_amg
1448           || method==repeat_amg || method==repeat_ass_amg) {
1449         return NULL;            /* Delegate operation to string conversion */
1450       }
1451       off = -1;
1452       switch (method) {
1453          case lt_amg:
1454          case le_amg:
1455          case gt_amg:
1456          case ge_amg:
1457          case eq_amg:
1458          case ne_amg:
1459            postpr = 1; off=ncmp_amg; break;
1460          case slt_amg:
1461          case sle_amg:
1462          case sgt_amg:
1463          case sge_amg:
1464          case seq_amg:
1465          case sne_amg:
1466            postpr = 1; off=scmp_amg; break;
1467          }
1468       if (off != -1) cv = cvp[off];
1469       if (!cv) {
1470         goto not_found;
1471       }
1472     } else {
1473     not_found:                  /* No method found, either report or croak */
1474       if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
1475         notfound = 1; lr = -1;
1476       } else if (cvp && (cv=cvp[nomethod_amg])) {
1477         notfound = 1; lr = 1;
1478       } else {
1479         SV *msg;
1480         if (off==-1) off=method;
1481         msg = sv_2mortal(Perl_newSVpvf(aTHX_ 
1482                       "Operation `%s': no method found,%sargument %s%s%s%s",
1483                       PL_AMG_names[method + assignshift],
1484                       (flags & AMGf_unary ? " " : "\n\tleft "),
1485                       SvAMAGIC(left)? 
1486                         "in overloaded package ":
1487                         "has no overloaded magic",
1488                       SvAMAGIC(left)? 
1489                         HvNAME(SvSTASH(SvRV(left))):
1490                         "",
1491                       SvAMAGIC(right)? 
1492                         ",\n\tright argument in overloaded package ":
1493                         (flags & AMGf_unary 
1494                          ? ""
1495                          : ",\n\tright argument has no overloaded magic"),
1496                       SvAMAGIC(right)? 
1497                         HvNAME(SvSTASH(SvRV(right))):
1498                         ""));
1499         if (amtp && amtp->fallback >= AMGfallYES) {
1500           DEBUG_o( Perl_deb(aTHX_ "%s", SvPVX(msg)) );
1501         } else {
1502           Perl_croak(aTHX_ "%"SVf, msg);
1503         }
1504         return NULL;
1505       }
1506       force_cpy = force_cpy || assign;
1507     }
1508   }
1509   if (!notfound) {
1510     DEBUG_o( Perl_deb(aTHX_ 
1511   "Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
1512                  PL_AMG_names[off],
1513                  method+assignshift==off? "" :
1514                              " (initially `",
1515                  method+assignshift==off? "" :
1516                              PL_AMG_names[method+assignshift],
1517                  method+assignshift==off? "" : "')",
1518                  flags & AMGf_unary? "" :
1519                    lr==1 ? " for right argument": " for left argument",
1520                  flags & AMGf_unary? " for argument" : "",
1521                  HvNAME(stash), 
1522                  fl? ",\n\tassignment variant used": "") );
1523   }
1524     /* Since we use shallow copy during assignment, we need
1525      * to dublicate the contents, probably calling user-supplied
1526      * version of copy operator
1527      */
1528     /* We need to copy in following cases:
1529      * a) Assignment form was called.
1530      *          assignshift==1,  assign==T, method + 1 == off
1531      * b) Increment or decrement, called directly.
1532      *          assignshift==0,  assign==0, method + 0 == off
1533      * c) Increment or decrement, translated to assignment add/subtr.
1534      *          assignshift==0,  assign==T, 
1535      *          force_cpy == T
1536      * d) Increment or decrement, translated to nomethod.
1537      *          assignshift==0,  assign==0, 
1538      *          force_cpy == T
1539      * e) Assignment form translated to nomethod.
1540      *          assignshift==1,  assign==T, method + 1 != off
1541      *          force_cpy == T
1542      */
1543     /*  off is method, method+assignshift, or a result of opcode substitution.
1544      *  In the latter case assignshift==0, so only notfound case is important.
1545      */
1546   if (( (method + assignshift == off)
1547         && (assign || (method == inc_amg) || (method == dec_amg)))
1548       || force_cpy)
1549     RvDEEPCP(left);
1550   {
1551     dSP;
1552     BINOP myop;
1553     SV* res;
1554     bool oldcatch = CATCH_GET;
1555
1556     CATCH_SET(TRUE);
1557     Zero(&myop, 1, BINOP);
1558     myop.op_last = (OP *) &myop;
1559     myop.op_next = Nullop;
1560     myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
1561
1562     PUSHSTACKi(PERLSI_OVERLOAD);
1563     ENTER;
1564     SAVEOP();
1565     PL_op = (OP *) &myop;
1566     if (PERLDB_SUB && PL_curstash != PL_debstash)
1567         PL_op->op_private |= OPpENTERSUB_DB;
1568     PUTBACK;
1569     pp_pushmark();
1570
1571     EXTEND(SP, notfound + 5);
1572     PUSHs(lr>0? right: left);
1573     PUSHs(lr>0? left: right);
1574     PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no ));
1575     if (notfound) {
1576       PUSHs( sv_2mortal(newSVpv((char *)PL_AMG_names[method + assignshift],0)));
1577     }
1578     PUSHs((SV*)cv);
1579     PUTBACK;
1580
1581     if ((PL_op = Perl_pp_entersub(aTHX)))
1582       CALLRUNOPS(aTHX);
1583     LEAVE;
1584     SPAGAIN;
1585
1586     res=POPs;
1587     PUTBACK;
1588     POPSTACK;
1589     CATCH_SET(oldcatch);
1590
1591     if (postpr) {
1592       int ans;
1593       switch (method) {
1594       case le_amg:
1595       case sle_amg:
1596         ans=SvIV(res)<=0; break;
1597       case lt_amg:
1598       case slt_amg:
1599         ans=SvIV(res)<0; break;
1600       case ge_amg:
1601       case sge_amg:
1602         ans=SvIV(res)>=0; break;
1603       case gt_amg:
1604       case sgt_amg:
1605         ans=SvIV(res)>0; break;
1606       case eq_amg:
1607       case seq_amg:
1608         ans=SvIV(res)==0; break;
1609       case ne_amg:
1610       case sne_amg:
1611         ans=SvIV(res)!=0; break;
1612       case inc_amg:
1613       case dec_amg:
1614         SvSetSV(left,res); return left;
1615       case not_amg:
1616         ans=!SvTRUE(res); break;
1617       }
1618       return boolSV(ans);
1619     } else if (method==copy_amg) {
1620       if (!SvROK(res)) {
1621         Perl_croak(aTHX_ "Copy method did not return a reference");
1622       }
1623       return SvREFCNT_inc(SvRV(res));
1624     } else {
1625       return res;
1626     }
1627   }
1628 }
1629
1630 /*
1631 =for apidoc is_gv_magical
1632
1633 Returns C<TRUE> if given the name of a magical GV.
1634
1635 Currently only useful internally when determining if a GV should be
1636 created even in rvalue contexts.
1637
1638 C<flags> is not used at present but available for future extension to
1639 allow selecting particular classes of magical variable.
1640
1641 =cut
1642 */
1643 bool
1644 Perl_is_gv_magical(pTHX_ char *name, STRLEN len, U32 flags)
1645 {
1646     if (!len)
1647         return FALSE;
1648
1649     switch (*name) {
1650     case 'I':
1651         if (len == 3 && strEQ(name, "ISA"))
1652             goto yes;
1653         break;
1654     case 'O':
1655         if (len == 8 && strEQ(name, "OVERLOAD"))
1656             goto yes;
1657         break;
1658     case 'S':
1659         if (len == 3 && strEQ(name, "SIG"))
1660             goto yes;
1661         break;
1662     case '\027':   /* $^W & $^WARNING_BITS */
1663         if (len == 1
1664             || (len == 12 && strEQ(name, "\027ARNING_BITS"))
1665             || (len == 17 && strEQ(name, "\027IDE_SYSTEM_CALLS")))
1666         {
1667             goto yes;
1668         }
1669         break;
1670
1671     case '&':
1672     case '`':
1673     case '\'':
1674     case ':':
1675     case '?':
1676     case '!':
1677     case '-':
1678     case '#':
1679     case '*':
1680     case '[':
1681     case '^':
1682     case '~':
1683     case '=':
1684     case '%':
1685     case '.':
1686     case '(':
1687     case ')':
1688     case '<':
1689     case '>':
1690     case ',':
1691     case '\\':
1692     case '/':
1693     case '|':
1694     case '+':
1695     case ';':
1696     case ']':
1697     case '\001':   /* $^A */
1698     case '\003':   /* $^C */
1699     case '\004':   /* $^D */
1700     case '\005':   /* $^E */
1701     case '\006':   /* $^F */
1702     case '\010':   /* $^H */
1703     case '\011':   /* $^I, NOT \t in EBCDIC */
1704     case '\014':   /* $^L */
1705     case '\017':   /* $^O */
1706     case '\020':   /* $^P */
1707     case '\023':   /* $^S */
1708     case '\024':   /* $^T */
1709     case '\026':   /* $^V */
1710         if (len == 1)
1711             goto yes;
1712         break;
1713     case '1':
1714     case '2':
1715     case '3':
1716     case '4':
1717     case '5':
1718     case '6':
1719     case '7':
1720     case '8':
1721     case '9':
1722         if (len > 1) {
1723             char *end = name + len;
1724             while (--end > name) {
1725                 if (!isDIGIT(*end))
1726                     return FALSE;
1727             }
1728         }
1729     yes:
1730         return TRUE;
1731     default:
1732         break;
1733     }
1734     return FALSE;
1735 }