[perl 7711: EPOC] updates
[p5sagit/p5-mst-13.2.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 '\020':        /* $^P */
852     case '\024':        /* $^T */
853         if (len > 1)
854             break;
855         goto magicalize;
856     case '\017':        /* $^O & $^OPEN */
857         if (len > 1 && strNE(name, "\017PEN"))
858             break;
859         goto magicalize;
860     case '\023':        /* $^S */
861         if (len > 1)
862             break;
863         goto ro_magicalize;
864     case '\027':        /* $^W & $^WARNING_BITS */
865         if (len > 1 && strNE(name, "\027ARNING_BITS")
866             && strNE(name, "\027IDE_SYSTEM_CALLS"))
867             break;
868         goto magicalize;
869
870     case '+':
871         if (len > 1)
872             break;
873         else {
874             AV* av = GvAVn(gv);
875             sv_magic((SV*)av, (SV*)av, 'D', Nullch, 0);
876             SvREADONLY_on(av);
877         }
878         /* FALL THROUGH */
879     case '1':
880     case '2':
881     case '3':
882     case '4':
883     case '5':
884     case '6':
885     case '7':
886     case '8':
887     case '9':
888       ro_magicalize:
889         SvREADONLY_on(GvSV(gv));
890       magicalize:
891         sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
892         break;
893
894     case '\014':        /* $^L */
895         if (len > 1)
896             break;
897         sv_setpv(GvSV(gv),"\f");
898         PL_formfeed = GvSV(gv);
899         break;
900     case ';':
901         if (len > 1)
902             break;
903         sv_setpv(GvSV(gv),"\034");
904         break;
905     case ']':
906         if (len == 1) {
907             SV *sv = GvSV(gv);
908             (void)SvUPGRADE(sv, SVt_PVNV);
909             Perl_sv_setpvf(aTHX_ sv,
910 #if defined(PERL_SUBVERSION) && (PERL_SUBVERSION > 0)
911                             "%8.6"
912 #else
913                             "%5.3"
914 #endif
915                             NVff,
916                             SvNVX(PL_patchlevel));
917             SvNVX(sv) = SvNVX(PL_patchlevel);
918             SvNOK_on(sv);
919             SvREADONLY_on(sv);
920         }
921         break;
922     case '\026':        /* $^V */
923         if (len == 1) {
924             SV *sv = GvSV(gv);
925             GvSV(gv) = SvREFCNT_inc(PL_patchlevel);
926             SvREFCNT_dec(sv);
927         }
928         break;
929     }
930     return gv;
931 }
932
933 void
934 Perl_gv_fullname4(pTHX_ SV *sv, GV *gv, const char *prefix, bool keepmain)
935 {
936     HV *hv = GvSTASH(gv);
937     if (!hv) {
938         (void)SvOK_off(sv);
939         return;
940     }
941     sv_setpv(sv, prefix ? prefix : "");
942     if (keepmain || strNE(HvNAME(hv), "main")) {
943         sv_catpv(sv,HvNAME(hv));
944         sv_catpvn(sv,"::", 2);
945     }
946     sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
947 }
948
949 void
950 Perl_gv_fullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
951 {
952     HV *hv = GvSTASH(gv);
953     if (!hv) {
954         (void)SvOK_off(sv);
955         return;
956     }
957     sv_setpv(sv, prefix ? prefix : "");
958     sv_catpv(sv,HvNAME(hv));
959     sv_catpvn(sv,"::", 2);
960     sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
961 }
962
963 void
964 Perl_gv_efullname4(pTHX_ SV *sv, GV *gv, const char *prefix, bool keepmain)
965 {
966     GV *egv = GvEGV(gv);
967     if (!egv)
968         egv = gv;
969     gv_fullname4(sv, egv, prefix, keepmain);
970 }
971
972 void
973 Perl_gv_efullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
974 {
975     GV *egv = GvEGV(gv);
976     if (!egv)
977         egv = gv;
978     gv_fullname3(sv, egv, prefix);
979 }
980
981 /* XXX compatibility with versions <= 5.003. */
982 void
983 Perl_gv_fullname(pTHX_ SV *sv, GV *gv)
984 {
985     gv_fullname3(sv, gv, sv == (SV*)gv ? "*" : "");
986 }
987
988 /* XXX compatibility with versions <= 5.003. */
989 void
990 Perl_gv_efullname(pTHX_ SV *sv, GV *gv)
991 {
992     gv_efullname3(sv, gv, sv == (SV*)gv ? "*" : "");
993 }
994
995 IO *
996 Perl_newIO(pTHX)
997 {
998     dTHR;
999     IO *io;
1000     GV *iogv;
1001
1002     io = (IO*)NEWSV(0,0);
1003     sv_upgrade((SV *)io,SVt_PVIO);
1004     SvREFCNT(io) = 1;
1005     SvOBJECT_on(io);
1006     iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV);
1007     /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */
1008     if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv))))
1009       iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV);
1010     SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv));
1011     return io;
1012 }
1013
1014 void
1015 Perl_gv_check(pTHX_ HV *stash)
1016 {
1017     dTHR;
1018     register HE *entry;
1019     register I32 i;
1020     register GV *gv;
1021     HV *hv;
1022
1023     if (!HvARRAY(stash))
1024         return;
1025     for (i = 0; i <= (I32) HvMAX(stash); i++) {
1026         for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
1027             if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
1028                 (gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)) && HvNAME(hv))
1029             {
1030                 if (hv != PL_defstash && hv != stash)
1031                      gv_check(hv);              /* nested package */
1032             }
1033             else if (isALPHA(*HeKEY(entry))) {
1034                 char *file;
1035                 gv = (GV*)HeVAL(entry);
1036                 if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
1037                     continue;
1038                 file = GvFILE(gv);
1039                 /* performance hack: if filename is absolute and it's a standard
1040                  * module, don't bother warning */
1041                 if (file
1042                     && PERL_FILE_IS_ABSOLUTE(file)
1043                     && (instr(file, "/lib/") || instr(file, ".pm")))
1044                 {
1045                     continue;
1046                 }
1047                 CopLINE_set(PL_curcop, GvLINE(gv));
1048 #ifdef USE_ITHREADS
1049                 CopFILE(PL_curcop) = file;      /* set for warning */
1050 #else
1051                 CopFILEGV(PL_curcop) = gv_fetchfile(file);
1052 #endif
1053                 Perl_warner(aTHX_ WARN_ONCE,
1054                         "Name \"%s::%s\" used only once: possible typo",
1055                         HvNAME(stash), GvNAME(gv));
1056             }
1057         }
1058     }
1059 }
1060
1061 GV *
1062 Perl_newGVgen(pTHX_ char *pack)
1063 {
1064     return gv_fetchpv(Perl_form(aTHX_ "%s::_GEN_%ld", pack, (long)PL_gensym++),
1065                       TRUE, SVt_PVGV);
1066 }
1067
1068 /* hopefully this is only called on local symbol table entries */
1069
1070 GP*
1071 Perl_gp_ref(pTHX_ GP *gp)
1072 {
1073     if (!gp)
1074         return (GP*)NULL;
1075     gp->gp_refcnt++;
1076     if (gp->gp_cv) {
1077         if (gp->gp_cvgen) {
1078             /* multi-named GPs cannot be used for method cache */
1079             SvREFCNT_dec(gp->gp_cv);
1080             gp->gp_cv = Nullcv;
1081             gp->gp_cvgen = 0;
1082         }
1083         else {
1084             /* Adding a new name to a subroutine invalidates method cache */
1085             PL_sub_generation++;
1086         }
1087     }
1088     return gp;
1089 }
1090
1091 void
1092 Perl_gp_free(pTHX_ GV *gv)
1093 {
1094     dTHR;
1095     GP* gp;
1096
1097     if (!gv || !(gp = GvGP(gv)))
1098         return;
1099     if (gp->gp_refcnt == 0) {
1100         if (ckWARN_d(WARN_INTERNAL))
1101             Perl_warner(aTHX_ WARN_INTERNAL,
1102                         "Attempt to free unreferenced glob pointers");
1103         return;
1104     }
1105     if (gp->gp_cv) {
1106         /* Deleting the name of a subroutine invalidates method cache */
1107         PL_sub_generation++;
1108     }
1109     if (--gp->gp_refcnt > 0) {
1110         if (gp->gp_egv == gv)
1111             gp->gp_egv = 0;
1112         return;
1113     }
1114
1115     SvREFCNT_dec(gp->gp_sv);
1116     SvREFCNT_dec(gp->gp_av);
1117     SvREFCNT_dec(gp->gp_hv);
1118     SvREFCNT_dec(gp->gp_io);
1119     SvREFCNT_dec(gp->gp_cv);
1120     SvREFCNT_dec(gp->gp_form);
1121
1122     Safefree(gp);
1123     GvGP(gv) = 0;
1124 }
1125
1126 #if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
1127 #define MICROPORT
1128 #endif
1129
1130 #ifdef  MICROPORT       /* Microport 2.4 hack */
1131 AV *GvAVn(gv)
1132 register GV *gv;
1133 {
1134     if (GvGP(gv)->gp_av)
1135         return GvGP(gv)->gp_av;
1136     else
1137         return GvGP(gv_AVadd(gv))->gp_av;
1138 }
1139
1140 HV *GvHVn(gv)
1141 register GV *gv;
1142 {
1143     if (GvGP(gv)->gp_hv)
1144         return GvGP(gv)->gp_hv;
1145     else
1146         return GvGP(gv_HVadd(gv))->gp_hv;
1147 }
1148 #endif                  /* Microport 2.4 hack */
1149
1150 /* Updates and caches the CV's */
1151
1152 bool
1153 Perl_Gv_AMupdate(pTHX_ HV *stash)
1154 {
1155   dTHR;
1156   GV* gv;
1157   CV* cv;
1158   MAGIC* mg=mg_find((SV*)stash,'c');
1159   AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL;
1160   AMT amt;
1161   STRLEN n_a;
1162 #ifdef OVERLOAD_VIA_HASH
1163   GV** gvp;
1164   HV* hv;
1165 #endif
1166
1167   if (mg && amtp->was_ok_am == PL_amagic_generation
1168       && amtp->was_ok_sub == PL_sub_generation)
1169       return AMT_AMAGIC(amtp);
1170   if (amtp && AMT_AMAGIC(amtp)) {       /* Have table. */
1171     int i;
1172     for (i=1; i<NofAMmeth; i++) {
1173       if (amtp->table[i]) {
1174         SvREFCNT_dec(amtp->table[i]);
1175       }
1176     }
1177   }
1178   sv_unmagic((SV*)stash, 'c');
1179
1180   DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME(stash)) );
1181
1182   amt.was_ok_am = PL_amagic_generation;
1183   amt.was_ok_sub = PL_sub_generation;
1184   amt.fallback = AMGfallNO;
1185   amt.flags = 0;
1186
1187 #ifdef OVERLOAD_VIA_HASH
1188   gvp=(GV**)hv_fetch(stash,"OVERLOAD",8,FALSE); /* A shortcut */
1189   if (gvp && ((gv = *gvp) != (GV*)&PL_sv_undef && (hv = GvHV(gv)))) {
1190     int filled=0;
1191     int i;
1192     char *cp;
1193     SV* sv;
1194     SV** svp;
1195
1196     /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
1197
1198     if (( cp = (char *)PL_AMG_names[0] ) &&
1199         (svp = (SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
1200       if (SvTRUE(sv)) amt.fallback=AMGfallYES;
1201       else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
1202     }
1203     for (i = 1; i < NofAMmeth; i++) {
1204       cv = 0;
1205       cp = (char *)PL_AMG_names[i];
1206
1207         svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
1208         if (svp && ((sv = *svp) != &PL_sv_undef)) {
1209           switch (SvTYPE(sv)) {
1210             default:
1211               if (!SvROK(sv)) {
1212                 if (!SvOK(sv)) break;
1213                 gv = gv_fetchmethod(stash, SvPV(sv, n_a));
1214                 if (gv) cv = GvCV(gv);
1215                 break;
1216               }
1217               cv = (CV*)SvRV(sv);
1218               if (SvTYPE(cv) == SVt_PVCV)
1219                   break;
1220                 /* FALL THROUGH */
1221             case SVt_PVHV:
1222             case SVt_PVAV:
1223               Perl_croak(aTHX_ "Not a subroutine reference in overload table");
1224               return FALSE;
1225             case SVt_PVCV:
1226               cv = (CV*)sv;
1227               break;
1228             case SVt_PVGV:
1229               if (!(cv = GvCVu((GV*)sv)))
1230                 cv = sv_2cv(sv, &stash, &gv, FALSE);
1231               break;
1232           }
1233           if (cv) filled=1;
1234           else {
1235             Perl_croak(aTHX_ "Method for operation %s not found in package %.256s during blessing\n",
1236                 cp,HvNAME(stash));
1237             return FALSE;
1238           }
1239         }
1240 #else
1241   {
1242     int filled = 0;
1243     int i;
1244     const char *cp;
1245     SV* sv = NULL;
1246
1247     /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
1248
1249     if ((cp = PL_AMG_names[0])) {
1250         /* Try to find via inheritance. */
1251         gv = gv_fetchmeth(stash, "()", 2, -1); /* A cookie: "()". */
1252         if (gv)
1253             sv = GvSV(gv);
1254
1255         if (!gv)
1256             goto no_table;
1257         else if (SvTRUE(sv))
1258             amt.fallback=AMGfallYES;
1259         else if (SvOK(sv))
1260             amt.fallback=AMGfallNEVER;
1261     }
1262
1263     for (i = 1; i < NofAMmeth; i++) {
1264         SV *cookie = sv_2mortal(Perl_newSVpvf(aTHX_ "(%s", cp = PL_AMG_names[i]));
1265         DEBUG_o( Perl_deb(aTHX_ "Checking overloading of `%s' in package `%.256s'\n",
1266                      cp, HvNAME(stash)) );
1267         /* don't fill the cache while looking up! */
1268         gv = gv_fetchmeth(stash, SvPVX(cookie), SvCUR(cookie), -1);
1269         cv = 0;
1270         if(gv && (cv = GvCV(gv))) {
1271             if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
1272                 && strEQ(HvNAME(GvSTASH(CvGV(cv))), "overload")) {
1273                 /* GvSV contains the name of the method. */
1274                 GV *ngv;
1275                 
1276                 DEBUG_o( Perl_deb(aTHX_ "Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n",
1277                              SvPV(GvSV(gv), n_a), cp, HvNAME(stash)) );
1278                 if (!SvPOK(GvSV(gv))
1279                     || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
1280                                                        FALSE)))
1281                 {
1282                     /* Can be an import stub (created by `can'). */
1283                     if (GvCVGEN(gv)) {
1284                         Perl_croak(aTHX_ "Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'",
1285                               (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
1286                               cp, HvNAME(stash));
1287                     } else
1288                         Perl_croak(aTHX_ "Can't resolve method `%.256s' overloading `%s' in package `%.256s'",
1289                               (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
1290                               cp, HvNAME(stash));
1291                 }
1292                 cv = GvCV(gv = ngv);
1293             }
1294             DEBUG_o( Perl_deb(aTHX_ "Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
1295                          cp, HvNAME(stash), HvNAME(GvSTASH(CvGV(cv))),
1296                          GvNAME(CvGV(cv))) );
1297             filled = 1;
1298         }
1299 #endif
1300         amt.table[i]=(CV*)SvREFCNT_inc(cv);
1301     }
1302     if (filled) {
1303       AMT_AMAGIC_on(&amt);
1304       sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMT));
1305       return TRUE;
1306     }
1307   }
1308   /* Here we have no table: */
1309  no_table:
1310   AMT_AMAGIC_off(&amt);
1311   sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMTS));
1312   return FALSE;
1313 }
1314
1315 SV*
1316 Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
1317 {
1318   dTHR;
1319   MAGIC *mg;
1320   CV *cv;
1321   CV **cvp=NULL, **ocvp=NULL;
1322   AMT *amtp, *oamtp;
1323   int fl=0, off, off1, lr=0, assign=AMGf_assign & flags, notfound=0;
1324   int postpr = 0, force_cpy = 0, assignshift = assign ? 1 : 0;
1325   HV* stash;
1326   if (!(AMGf_noleft & flags) && SvAMAGIC(left)
1327       && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c'))
1328       && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1329                         ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
1330                         : (CV **) NULL))
1331       && ((cv = cvp[off=method+assignshift])
1332           || (assign && amtp->fallback > AMGfallNEVER && /* fallback to
1333                                                           * usual method */
1334                   (fl = 1, cv = cvp[off=method])))) {
1335     lr = -1;                    /* Call method for left argument */
1336   } else {
1337     if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
1338       int logic;
1339
1340       /* look for substituted methods */
1341       /* In all the covered cases we should be called with assign==0. */
1342          switch (method) {
1343          case inc_amg:
1344            force_cpy = 1;
1345            if ((cv = cvp[off=add_ass_amg])
1346                || ((cv = cvp[off = add_amg]) && (force_cpy = 0, postpr = 1))) {
1347              right = &PL_sv_yes; lr = -1; assign = 1;
1348            }
1349            break;
1350          case dec_amg:
1351            force_cpy = 1;
1352            if ((cv = cvp[off = subtr_ass_amg])
1353                || ((cv = cvp[off = subtr_amg]) && (force_cpy = 0, postpr=1))) {
1354              right = &PL_sv_yes; lr = -1; assign = 1;
1355            }
1356            break;
1357          case bool__amg:
1358            (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]));
1359            break;
1360          case numer_amg:
1361            (void)((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]));
1362            break;
1363          case string_amg:
1364            (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
1365            break;
1366  case not_amg:
1367    (void)((cv = cvp[off=bool__amg])
1368           || (cv = cvp[off=numer_amg])
1369           || (cv = cvp[off=string_amg]));
1370    postpr = 1;
1371    break;
1372          case copy_amg:
1373            {
1374              /*
1375                   * SV* ref causes confusion with the interpreter variable of
1376                   * the same name
1377                   */
1378              SV* tmpRef=SvRV(left);
1379              if (!SvROK(tmpRef) && SvTYPE(tmpRef) <= SVt_PVMG) {
1380                 /*
1381                  * Just to be extra cautious.  Maybe in some
1382                  * additional cases sv_setsv is safe, too.
1383                  */
1384                 SV* newref = newSVsv(tmpRef);
1385                 SvOBJECT_on(newref);
1386                 SvSTASH(newref) = (HV*)SvREFCNT_inc(SvSTASH(tmpRef));
1387                 return newref;
1388              }
1389            }
1390            break;
1391          case abs_amg:
1392            if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
1393                && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
1394              SV* nullsv=sv_2mortal(newSViv(0));
1395              if (off1==lt_amg) {
1396                SV* lessp = amagic_call(left,nullsv,
1397                                        lt_amg,AMGf_noright);
1398                logic = SvTRUE(lessp);
1399              } else {
1400                SV* lessp = amagic_call(left,nullsv,
1401                                        ncmp_amg,AMGf_noright);
1402                logic = (SvNV(lessp) < 0);
1403              }
1404              if (logic) {
1405                if (off==subtr_amg) {
1406                  right = left;
1407                  left = nullsv;
1408                  lr = 1;
1409                }
1410              } else {
1411                return left;
1412              }
1413            }
1414            break;
1415          case neg_amg:
1416            if ((cv = cvp[off=subtr_amg])) {
1417              right = left;
1418              left = sv_2mortal(newSViv(0));
1419              lr = 1;
1420            }
1421            break;
1422          case iter_amg:                 /* XXXX Eventually should do to_gv. */
1423              /* FAIL safe */
1424              return NULL;       /* Delegate operation to standard mechanisms. */
1425              break;
1426          case to_sv_amg:
1427          case to_av_amg:
1428          case to_hv_amg:
1429          case to_gv_amg:
1430          case to_cv_amg:
1431              /* FAIL safe */
1432              return left;       /* Delegate operation to standard mechanisms. */
1433              break;
1434          default:
1435            goto not_found;
1436          }
1437          if (!cv) goto not_found;
1438     } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
1439                && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(right))),'c'))
1440                && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1441                           ? (amtp = (AMT*)mg->mg_ptr)->table
1442                           : (CV **) NULL))
1443                && (cv = cvp[off=method])) { /* Method for right
1444                                              * argument found */
1445       lr=1;
1446     } else if (((ocvp && oamtp->fallback > AMGfallNEVER
1447                  && (cvp=ocvp) && (lr = -1))
1448                 || (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
1449                && !(flags & AMGf_unary)) {
1450                                 /* We look for substitution for
1451                                  * comparison operations and
1452                                  * concatenation */
1453       if (method==concat_amg || method==concat_ass_amg
1454           || method==repeat_amg || method==repeat_ass_amg) {
1455         return NULL;            /* Delegate operation to string conversion */
1456       }
1457       off = -1;
1458       switch (method) {
1459          case lt_amg:
1460          case le_amg:
1461          case gt_amg:
1462          case ge_amg:
1463          case eq_amg:
1464          case ne_amg:
1465            postpr = 1; off=ncmp_amg; break;
1466          case slt_amg:
1467          case sle_amg:
1468          case sgt_amg:
1469          case sge_amg:
1470          case seq_amg:
1471          case sne_amg:
1472            postpr = 1; off=scmp_amg; break;
1473          }
1474       if (off != -1) cv = cvp[off];
1475       if (!cv) {
1476         goto not_found;
1477       }
1478     } else {
1479     not_found:                  /* No method found, either report or croak */
1480       switch (method) {
1481          case to_sv_amg:
1482          case to_av_amg:
1483          case to_hv_amg:
1484          case to_gv_amg:
1485          case to_cv_amg:
1486              /* FAIL safe */
1487              return left;       /* Delegate operation to standard mechanisms. */
1488              break;
1489       }
1490       if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
1491         notfound = 1; lr = -1;
1492       } else if (cvp && (cv=cvp[nomethod_amg])) {
1493         notfound = 1; lr = 1;
1494       } else {
1495         SV *msg;
1496         if (off==-1) off=method;
1497         msg = sv_2mortal(Perl_newSVpvf(aTHX_
1498                       "Operation `%s': no method found,%sargument %s%s%s%s",
1499                       PL_AMG_names[method + assignshift],
1500                       (flags & AMGf_unary ? " " : "\n\tleft "),
1501                       SvAMAGIC(left)?
1502                         "in overloaded package ":
1503                         "has no overloaded magic",
1504                       SvAMAGIC(left)?
1505                         HvNAME(SvSTASH(SvRV(left))):
1506                         "",
1507                       SvAMAGIC(right)?
1508                         ",\n\tright argument in overloaded package ":
1509                         (flags & AMGf_unary
1510                          ? ""
1511                          : ",\n\tright argument has no overloaded magic"),
1512                       SvAMAGIC(right)?
1513                         HvNAME(SvSTASH(SvRV(right))):
1514                         ""));
1515         if (amtp && amtp->fallback >= AMGfallYES) {
1516           DEBUG_o( Perl_deb(aTHX_ "%s", SvPVX(msg)) );
1517         } else {
1518           Perl_croak(aTHX_ "%"SVf, msg);
1519         }
1520         return NULL;
1521       }
1522       force_cpy = force_cpy || assign;
1523     }
1524   }
1525   if (!notfound) {
1526     DEBUG_o( Perl_deb(aTHX_
1527   "Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
1528                  PL_AMG_names[off],
1529                  method+assignshift==off? "" :
1530                              " (initially `",
1531                  method+assignshift==off? "" :
1532                              PL_AMG_names[method+assignshift],
1533                  method+assignshift==off? "" : "')",
1534                  flags & AMGf_unary? "" :
1535                    lr==1 ? " for right argument": " for left argument",
1536                  flags & AMGf_unary? " for argument" : "",
1537                  HvNAME(stash),
1538                  fl? ",\n\tassignment variant used": "") );
1539   }
1540     /* Since we use shallow copy during assignment, we need
1541      * to dublicate the contents, probably calling user-supplied
1542      * version of copy operator
1543      */
1544     /* We need to copy in following cases:
1545      * a) Assignment form was called.
1546      *          assignshift==1,  assign==T, method + 1 == off
1547      * b) Increment or decrement, called directly.
1548      *          assignshift==0,  assign==0, method + 0 == off
1549      * c) Increment or decrement, translated to assignment add/subtr.
1550      *          assignshift==0,  assign==T,
1551      *          force_cpy == T
1552      * d) Increment or decrement, translated to nomethod.
1553      *          assignshift==0,  assign==0,
1554      *          force_cpy == T
1555      * e) Assignment form translated to nomethod.
1556      *          assignshift==1,  assign==T, method + 1 != off
1557      *          force_cpy == T
1558      */
1559     /*  off is method, method+assignshift, or a result of opcode substitution.
1560      *  In the latter case assignshift==0, so only notfound case is important.
1561      */
1562   if (( (method + assignshift == off)
1563         && (assign || (method == inc_amg) || (method == dec_amg)))
1564       || force_cpy)
1565     RvDEEPCP(left);
1566   {
1567     dSP;
1568     BINOP myop;
1569     SV* res;
1570     bool oldcatch = CATCH_GET;
1571
1572     CATCH_SET(TRUE);
1573     Zero(&myop, 1, BINOP);
1574     myop.op_last = (OP *) &myop;
1575     myop.op_next = Nullop;
1576     myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
1577
1578     PUSHSTACKi(PERLSI_OVERLOAD);
1579     ENTER;
1580     SAVEOP();
1581     PL_op = (OP *) &myop;
1582     if (PERLDB_SUB && PL_curstash != PL_debstash)
1583         PL_op->op_private |= OPpENTERSUB_DB;
1584     PUTBACK;
1585     pp_pushmark();
1586
1587     EXTEND(SP, notfound + 5);
1588     PUSHs(lr>0? right: left);
1589     PUSHs(lr>0? left: right);
1590     PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no ));
1591     if (notfound) {
1592       PUSHs( sv_2mortal(newSVpv((char *)PL_AMG_names[method + assignshift],0)));
1593     }
1594     PUSHs((SV*)cv);
1595     PUTBACK;
1596
1597     if ((PL_op = Perl_pp_entersub(aTHX)))
1598       CALLRUNOPS(aTHX);
1599     LEAVE;
1600     SPAGAIN;
1601
1602     res=POPs;
1603     PUTBACK;
1604     POPSTACK;
1605     CATCH_SET(oldcatch);
1606
1607     if (postpr) {
1608       int ans;
1609       switch (method) {
1610       case le_amg:
1611       case sle_amg:
1612         ans=SvIV(res)<=0; break;
1613       case lt_amg:
1614       case slt_amg:
1615         ans=SvIV(res)<0; break;
1616       case ge_amg:
1617       case sge_amg:
1618         ans=SvIV(res)>=0; break;
1619       case gt_amg:
1620       case sgt_amg:
1621         ans=SvIV(res)>0; break;
1622       case eq_amg:
1623       case seq_amg:
1624         ans=SvIV(res)==0; break;
1625       case ne_amg:
1626       case sne_amg:
1627         ans=SvIV(res)!=0; break;
1628       case inc_amg:
1629       case dec_amg:
1630         SvSetSV(left,res); return left;
1631       case not_amg:
1632         ans=!SvTRUE(res); break;
1633       }
1634       return boolSV(ans);
1635     } else if (method==copy_amg) {
1636       if (!SvROK(res)) {
1637         Perl_croak(aTHX_ "Copy method did not return a reference");
1638       }
1639       return SvREFCNT_inc(SvRV(res));
1640     } else {
1641       return res;
1642     }
1643   }
1644 }
1645
1646 /*
1647 =for apidoc is_gv_magical
1648
1649 Returns C<TRUE> if given the name of a magical GV.
1650
1651 Currently only useful internally when determining if a GV should be
1652 created even in rvalue contexts.
1653
1654 C<flags> is not used at present but available for future extension to
1655 allow selecting particular classes of magical variable.
1656
1657 =cut
1658 */
1659 bool
1660 Perl_is_gv_magical(pTHX_ char *name, STRLEN len, U32 flags)
1661 {
1662     if (!len)
1663         return FALSE;
1664
1665     switch (*name) {
1666     case 'I':
1667         if (len == 3 && strEQ(name, "ISA"))
1668             goto yes;
1669         break;
1670     case 'O':
1671         if (len == 8 && strEQ(name, "OVERLOAD"))
1672             goto yes;
1673         break;
1674     case 'S':
1675         if (len == 3 && strEQ(name, "SIG"))
1676             goto yes;
1677         break;
1678     case '\017':   /* $^O & $^OPEN */
1679         if (len == 1
1680             || (len == 4 && strEQ(name, "\027PEN")))
1681         {
1682             goto yes;
1683         }
1684         break;
1685     case '\027':   /* $^W & $^WARNING_BITS */
1686         if (len == 1
1687             || (len == 12 && strEQ(name, "\027ARNING_BITS"))
1688             || (len == 17 && strEQ(name, "\027IDE_SYSTEM_CALLS")))
1689         {
1690             goto yes;
1691         }
1692         break;
1693
1694     case '&':
1695     case '`':
1696     case '\'':
1697     case ':':
1698     case '?':
1699     case '!':
1700     case '-':
1701     case '#':
1702     case '*':
1703     case '[':
1704     case '^':
1705     case '~':
1706     case '=':
1707     case '%':
1708     case '.':
1709     case '(':
1710     case ')':
1711     case '<':
1712     case '>':
1713     case ',':
1714     case '\\':
1715     case '/':
1716     case '|':
1717     case '+':
1718     case ';':
1719     case ']':
1720     case '\001':   /* $^A */
1721     case '\003':   /* $^C */
1722     case '\004':   /* $^D */
1723     case '\005':   /* $^E */
1724     case '\006':   /* $^F */
1725     case '\010':   /* $^H */
1726     case '\011':   /* $^I, NOT \t in EBCDIC */
1727     case '\014':   /* $^L */
1728     case '\020':   /* $^P */
1729     case '\023':   /* $^S */
1730     case '\024':   /* $^T */
1731     case '\026':   /* $^V */
1732         if (len == 1)
1733             goto yes;
1734         break;
1735     case '1':
1736     case '2':
1737     case '3':
1738     case '4':
1739     case '5':
1740     case '6':
1741     case '7':
1742     case '8':
1743     case '9':
1744         if (len > 1) {
1745             char *end = name + len;
1746             while (--end > name) {
1747                 if (!isDIGIT(*end))
1748                     return FALSE;
1749             }
1750         }
1751     yes:
1752         return TRUE;
1753     default:
1754         break;
1755     }
1756     return FALSE;
1757 }