xref: /openbsd/gnu/usr.bin/perl/gv.c (revision e2e5c5d3)
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)), gv, '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, '*', name, len);
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"))
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     /*
422      * Inheriting AUTOLOAD for non-methods works ... for now.
423      */
424     if (ckWARN(WARN_DEPRECATED) && !method &&
425 	(GvCVGEN(gv) || GvSTASH(gv) != stash))
426 	Perl_warner(aTHX_ WARN_DEPRECATED,
427 	  "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
428 	     HvNAME(stash), (int)len, name);
429 
430     /*
431      * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name.
432      * The subroutine's original name may not be "AUTOLOAD", so we don't
433      * use that, but for lack of anything better we will use the sub's
434      * original package to look up $AUTOLOAD.
435      */
436     varstash = GvSTASH(CvGV(cv));
437     vargv = *(GV**)hv_fetch(varstash, autoload, autolen, TRUE);
438     if (!isGV(vargv))
439 	gv_init(vargv, varstash, autoload, autolen, FALSE);
440     varsv = GvSV(vargv);
441     sv_setpv(varsv, HvNAME(stash));
442     sv_catpvn(varsv, "::", 2);
443     sv_catpvn(varsv, name, len);
444     SvTAINTED_off(varsv);
445     return gv;
446 }
447 
448 /*
449 =for apidoc gv_stashpv
450 
451 Returns a pointer to the stash for a specified package.  C<name> should
452 be a valid UTF-8 string.  If C<create> is set then the package will be
453 created if it does not already exist.  If C<create> is not set and the
454 package does not exist then NULL is returned.
455 
456 =cut
457 */
458 
459 HV*
460 Perl_gv_stashpv(pTHX_ const char *name, I32 create)
461 {
462     return gv_stashpvn(name, strlen(name), create);
463 }
464 
465 HV*
466 Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 create)
467 {
468     char smallbuf[256];
469     char *tmpbuf;
470     HV *stash;
471     GV *tmpgv;
472 
473     if (namelen + 3 < sizeof smallbuf)
474 	tmpbuf = smallbuf;
475     else
476 	New(606, tmpbuf, namelen + 3, char);
477     Copy(name,tmpbuf,namelen,char);
478     tmpbuf[namelen++] = ':';
479     tmpbuf[namelen++] = ':';
480     tmpbuf[namelen] = '\0';
481     tmpgv = gv_fetchpv(tmpbuf, create, SVt_PVHV);
482     if (tmpbuf != smallbuf)
483 	Safefree(tmpbuf);
484     if (!tmpgv)
485 	return 0;
486     if (!GvHV(tmpgv))
487 	GvHV(tmpgv) = newHV();
488     stash = GvHV(tmpgv);
489     if (!HvNAME(stash))
490 	HvNAME(stash) = savepv(name);
491     return stash;
492 }
493 
494 /*
495 =for apidoc gv_stashsv
496 
497 Returns a pointer to the stash for a specified package, which must be a
498 valid UTF-8 string.  See C<gv_stashpv>.
499 
500 =cut
501 */
502 
503 HV*
504 Perl_gv_stashsv(pTHX_ SV *sv, I32 create)
505 {
506     register char *ptr;
507     STRLEN len;
508     ptr = SvPV(sv,len);
509     return gv_stashpvn(ptr, len, create);
510 }
511 
512 
513 GV *
514 Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
515 {
516     dTHR;
517     register const char *name = nambeg;
518     register GV *gv = 0;
519     GV**gvp;
520     I32 len;
521     register const char *namend;
522     HV *stash = 0;
523     U32 add_gvflags = 0;
524 
525     if (*name == '*' && isALPHA(name[1])) /* accidental stringify on a GV? */
526 	name++;
527 
528     for (namend = name; *namend; namend++) {
529 	if ((*namend == ':' && namend[1] == ':')
530 	    || (*namend == '\'' && namend[1]))
531 	{
532 	    if (!stash)
533 		stash = PL_defstash;
534 	    if (!stash || !SvREFCNT(stash)) /* symbol table under destruction */
535 		return Nullgv;
536 
537 	    len = namend - name;
538 	    if (len > 0) {
539 		char smallbuf[256];
540 		char *tmpbuf;
541 
542 		if (len + 3 < sizeof smallbuf)
543 		    tmpbuf = smallbuf;
544 		else
545 		    New(601, tmpbuf, len+3, char);
546 		Copy(name, tmpbuf, len, char);
547 		tmpbuf[len++] = ':';
548 		tmpbuf[len++] = ':';
549 		tmpbuf[len] = '\0';
550 		gvp = (GV**)hv_fetch(stash,tmpbuf,len,add);
551 		gv = gvp ? *gvp : Nullgv;
552 		if (gv && gv != (GV*)&PL_sv_undef) {
553 		    if (SvTYPE(gv) != SVt_PVGV)
554 			gv_init(gv, stash, tmpbuf, len, (add & GV_ADDMULTI));
555 		    else
556 			GvMULTI_on(gv);
557 		}
558 		if (tmpbuf != smallbuf)
559 		    Safefree(tmpbuf);
560 		if (!gv || gv == (GV*)&PL_sv_undef)
561 		    return Nullgv;
562 
563 		if (!(stash = GvHV(gv)))
564 		    stash = GvHV(gv) = newHV();
565 
566 		if (!HvNAME(stash))
567 		    HvNAME(stash) = savepvn(nambeg, namend - nambeg);
568 	    }
569 
570 	    if (*namend == ':')
571 		namend++;
572 	    namend++;
573 	    name = namend;
574 	    if (!*name)
575 		return gv ? gv : (GV*)*hv_fetch(PL_defstash, "main::", 6, TRUE);
576 	}
577     }
578     len = namend - name;
579     if (!len)
580 	len = 1;
581 
582     /* No stash in name, so see how we can default */
583 
584     if (!stash) {
585 	if (isIDFIRST_lazy(name)) {
586 	    bool global = FALSE;
587 
588 	    if (isUPPER(*name)) {
589 		if (*name == 'S' && (
590 		    strEQ(name, "SIG") ||
591 		    strEQ(name, "STDIN") ||
592 		    strEQ(name, "STDOUT") ||
593 		    strEQ(name, "STDERR")))
594 		    global = TRUE;
595 		else if (*name == 'I' && strEQ(name, "INC"))
596 		    global = TRUE;
597 		else if (*name == 'E' && strEQ(name, "ENV"))
598 		    global = TRUE;
599 		else if (*name == 'A' && (
600 		  strEQ(name, "ARGV") ||
601 		  strEQ(name, "ARGVOUT")))
602 		    global = TRUE;
603 	    }
604 	    else if (*name == '_' && !name[1])
605 		global = TRUE;
606 
607 	    if (global)
608 		stash = PL_defstash;
609 	    else if ((COP*)PL_curcop == &PL_compiling) {
610 		stash = PL_curstash;
611 		if (add && (PL_hints & HINT_STRICT_VARS) &&
612 		    sv_type != SVt_PVCV &&
613 		    sv_type != SVt_PVGV &&
614 		    sv_type != SVt_PVFM &&
615 		    sv_type != SVt_PVIO &&
616 		    !(len == 1 && sv_type == SVt_PV && strchr("ab",*name)) )
617 		{
618 		    gvp = (GV**)hv_fetch(stash,name,len,0);
619 		    if (!gvp ||
620 			*gvp == (GV*)&PL_sv_undef ||
621 			SvTYPE(*gvp) != SVt_PVGV)
622 		    {
623 			stash = 0;
624 		    }
625 		    else if ((sv_type == SVt_PV   && !GvIMPORTED_SV(*gvp)) ||
626 			     (sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp)) ||
627 			     (sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp)) )
628 		    {
629 			Perl_warn(aTHX_ "Variable \"%c%s\" is not imported",
630 			    sv_type == SVt_PVAV ? '@' :
631 			    sv_type == SVt_PVHV ? '%' : '$',
632 			    name);
633 			if (GvCVu(*gvp))
634 			    Perl_warn(aTHX_ "\t(Did you mean &%s instead?)\n", name);
635 			stash = 0;
636 		    }
637 		}
638 	    }
639 	    else
640 		stash = CopSTASH(PL_curcop);
641 	}
642 	else
643 	    stash = PL_defstash;
644     }
645 
646     /* By this point we should have a stash and a name */
647 
648     if (!stash) {
649 	if (add) {
650 	    qerror(Perl_mess(aTHX_
651 		 "Global symbol \"%s%s\" requires explicit package name",
652 		 (sv_type == SVt_PV ? "$"
653 		  : sv_type == SVt_PVAV ? "@"
654 		  : sv_type == SVt_PVHV ? "%"
655 		  : ""), name));
656 	}
657 	return Nullgv;
658     }
659 
660     if (!SvREFCNT(stash))	/* symbol table under destruction */
661 	return Nullgv;
662 
663     gvp = (GV**)hv_fetch(stash,name,len,add);
664     if (!gvp || *gvp == (GV*)&PL_sv_undef)
665 	return Nullgv;
666     gv = *gvp;
667     if (SvTYPE(gv) == SVt_PVGV) {
668 	if (add) {
669 	    GvMULTI_on(gv);
670 	    gv_init_sv(gv, sv_type);
671 	}
672 	return gv;
673     } else if (add & GV_NOINIT) {
674 	return gv;
675     }
676 
677     /* Adding a new symbol */
678 
679     if (add & GV_ADDWARN && ckWARN_d(WARN_INTERNAL))
680 	Perl_warner(aTHX_ WARN_INTERNAL, "Had to create %s unexpectedly", nambeg);
681     gv_init(gv, stash, name, len, add & GV_ADDMULTI);
682     gv_init_sv(gv, sv_type);
683     GvFLAGS(gv) |= add_gvflags;
684 
685     if (isLEXWARN_on && isALPHA(name[0]) && ! ckWARN(WARN_ONCE))
686         GvMULTI_on(gv) ;
687 
688     /* set up magic where warranted */
689     switch (*name) {
690     case 'A':
691 	if (strEQ(name, "ARGV")) {
692 	    IoFLAGS(GvIOn(gv)) |= IOf_ARGV|IOf_START;
693 	}
694 	break;
695     case 'E':
696 	if (strnEQ(name, "EXPORT", 6))
697 	    GvMULTI_on(gv);
698 	break;
699     case 'I':
700 	if (strEQ(name, "ISA")) {
701 	    AV* av = GvAVn(gv);
702 	    GvMULTI_on(gv);
703 	    sv_magic((SV*)av, (SV*)gv, 'I', Nullch, 0);
704 	    /* NOTE: No support for tied ISA */
705 	    if ((add & GV_ADDMULTI) && strEQ(nambeg,"AnyDBM_File::ISA")
706 		&& AvFILLp(av) == -1)
707 	    {
708 		char *pname;
709 		av_push(av, newSVpvn(pname = "NDBM_File",9));
710 		gv_stashpvn(pname, 9, TRUE);
711 		av_push(av, newSVpvn(pname = "DB_File",7));
712 		gv_stashpvn(pname, 7, TRUE);
713 		av_push(av, newSVpvn(pname = "GDBM_File",9));
714 		gv_stashpvn(pname, 9, TRUE);
715 		av_push(av, newSVpvn(pname = "SDBM_File",9));
716 		gv_stashpvn(pname, 9, TRUE);
717 		av_push(av, newSVpvn(pname = "ODBM_File",9));
718 		gv_stashpvn(pname, 9, TRUE);
719 	    }
720 	}
721 	break;
722     case 'O':
723         if (strEQ(name, "OVERLOAD")) {
724             HV* hv = GvHVn(gv);
725             GvMULTI_on(gv);
726             hv_magic(hv, gv, 'A');
727         }
728         break;
729     case 'S':
730 	if (strEQ(name, "SIG")) {
731 	    HV *hv;
732 	    I32 i;
733 	    if (!PL_psig_ptr) {
734 		int sig_num[] = { SIG_NUM };
735 		New(73, PL_psig_ptr, sizeof(sig_num)/sizeof(*sig_num), SV*);
736 		New(73, PL_psig_name, sizeof(sig_num)/sizeof(*sig_num), SV*);
737 	    }
738 	    GvMULTI_on(gv);
739 	    hv = GvHVn(gv);
740 	    hv_magic(hv, gv, 'S');
741 	    for (i = 1; PL_sig_name[i]; i++) {
742 	    	SV ** init;
743 	    	init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1);
744 	    	if (init)
745 		    sv_setsv(*init, &PL_sv_undef);
746 	    	PL_psig_ptr[i] = 0;
747 	    	PL_psig_name[i] = 0;
748 	    }
749 	}
750 	break;
751     case 'V':
752 	if (strEQ(name, "VERSION"))
753 	    GvMULTI_on(gv);
754 	break;
755 
756     case '&':
757 	if (len > 1)
758 	    break;
759 	PL_sawampersand = TRUE;
760 	goto ro_magicalize;
761 
762     case '`':
763 	if (len > 1)
764 	    break;
765 	PL_sawampersand = TRUE;
766 	goto ro_magicalize;
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 	sv_setpv(GvSV(gv),PL_chopset);
778 	goto magicalize;
779 
780     case '?':
781 	if (len > 1)
782 	    break;
783 #ifdef COMPLEX_STATUS
784 	(void)SvUPGRADE(GvSV(gv), SVt_PVLV);
785 #endif
786 	goto magicalize;
787 
788     case '!':
789 	if (len > 1)
790 	    break;
791 	if (sv_type > SVt_PV && PL_curcop != &PL_compiling) {
792 	    HV* stash = gv_stashpvn("Errno",5,FALSE);
793 	    if (!stash || !(gv_fetchmethod(stash, "TIEHASH"))) {
794 		dSP;
795 		PUTBACK;
796 		require_pv("Errno.pm");
797 		SPAGAIN;
798 		stash = gv_stashpvn("Errno",5,FALSE);
799 		if (!stash || !(gv_fetchmethod(stash, "TIEHASH")))
800 		    Perl_croak(aTHX_ "Can't use %%! because Errno.pm is not available");
801 	    }
802 	}
803 	goto magicalize;
804     case '-':
805 	if (len > 1)
806 	    break;
807 	else {
808             AV* av = GvAVn(gv);
809             sv_magic((SV*)av, Nullsv, 'D', Nullch, 0);
810         }
811 	goto magicalize;
812     case '#':
813     case '*':
814 	if (ckWARN(WARN_DEPRECATED) && len == 1 && sv_type == SVt_PV)
815 	    Perl_warner(aTHX_ WARN_DEPRECATED, "Use of $%s is deprecated", name);
816 	/* FALL THROUGH */
817     case '[':
818     case '^':
819     case '~':
820     case '=':
821     case '%':
822     case '.':
823     case '(':
824     case ')':
825     case '<':
826     case '>':
827     case ',':
828     case '\\':
829     case '/':
830     case '|':
831     case '\001':	/* $^A */
832     case '\003':	/* $^C */
833     case '\004':	/* $^D */
834     case '\005':	/* $^E */
835     case '\006':	/* $^F */
836     case '\010':	/* $^H */
837     case '\011':	/* $^I, NOT \t in EBCDIC */
838     case '\017':	/* $^O */
839     case '\020':	/* $^P */
840     case '\024':	/* $^T */
841 	if (len > 1)
842 	    break;
843 	goto magicalize;
844     case '\023':	/* $^S */
845 	if (len > 1)
846 	    break;
847 	goto ro_magicalize;
848     case '\027':	/* $^W & $^WARNING_BITS */
849 	if (len > 1 && strNE(name, "\027ARNING_BITS")
850 	    && strNE(name, "\027IDE_SYSTEM_CALLS"))
851 	    break;
852 	goto magicalize;
853 
854     case '+':
855 	if (len > 1)
856 	    break;
857 	else {
858             AV* av = GvAVn(gv);
859             sv_magic((SV*)av, (SV*)av, 'D', Nullch, 0);
860         }
861 	/* FALL THROUGH */
862     case '1':
863     case '2':
864     case '3':
865     case '4':
866     case '5':
867     case '6':
868     case '7':
869     case '8':
870     case '9':
871       ro_magicalize:
872 	SvREADONLY_on(GvSV(gv));
873       magicalize:
874 	sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
875 	break;
876 
877     case '\014':	/* $^L */
878 	if (len > 1)
879 	    break;
880 	sv_setpv(GvSV(gv),"\f");
881 	PL_formfeed = GvSV(gv);
882 	break;
883     case ';':
884 	if (len > 1)
885 	    break;
886 	sv_setpv(GvSV(gv),"\034");
887 	break;
888     case ']':
889 	if (len == 1) {
890 	    SV *sv = GvSV(gv);
891 	    (void)SvUPGRADE(sv, SVt_PVNV);
892 	    SvNVX(sv) = SvNVX(PL_patchlevel);
893 	    SvNOK_on(sv);
894 	    (void)SvPV_nolen(sv);
895 	    SvREADONLY_on(sv);
896 	}
897 	break;
898     case '\026':	/* $^V */
899 	if (len == 1) {
900 	    SV *sv = GvSV(gv);
901 	    GvSV(gv) = SvREFCNT_inc(PL_patchlevel);
902 	    SvREFCNT_dec(sv);
903 	}
904 	break;
905     }
906     return gv;
907 }
908 
909 void
910 Perl_gv_fullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
911 {
912     HV *hv = GvSTASH(gv);
913     if (!hv) {
914 	(void)SvOK_off(sv);
915 	return;
916     }
917     sv_setpv(sv, prefix ? prefix : "");
918     sv_catpv(sv,HvNAME(hv));
919     sv_catpvn(sv,"::", 2);
920     sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
921 }
922 
923 void
924 Perl_gv_efullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
925 {
926     GV *egv = GvEGV(gv);
927     if (!egv)
928 	egv = gv;
929     gv_fullname3(sv, egv, prefix);
930 }
931 
932 /* XXX compatibility with versions <= 5.003. */
933 void
934 Perl_gv_fullname(pTHX_ SV *sv, GV *gv)
935 {
936     gv_fullname3(sv, gv, sv == (SV*)gv ? "*" : "");
937 }
938 
939 /* XXX compatibility with versions <= 5.003. */
940 void
941 Perl_gv_efullname(pTHX_ SV *sv, GV *gv)
942 {
943     gv_efullname3(sv, gv, sv == (SV*)gv ? "*" : "");
944 }
945 
946 IO *
947 Perl_newIO(pTHX)
948 {
949     dTHR;
950     IO *io;
951     GV *iogv;
952 
953     io = (IO*)NEWSV(0,0);
954     sv_upgrade((SV *)io,SVt_PVIO);
955     SvREFCNT(io) = 1;
956     SvOBJECT_on(io);
957     iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV);
958     /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */
959     if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv))))
960       iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV);
961     SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv));
962     return io;
963 }
964 
965 void
966 Perl_gv_check(pTHX_ HV *stash)
967 {
968     dTHR;
969     register HE *entry;
970     register I32 i;
971     register GV *gv;
972     HV *hv;
973 
974     if (!HvARRAY(stash))
975 	return;
976     for (i = 0; i <= (I32) HvMAX(stash); i++) {
977 	for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
978 	    if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
979 		(gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)) && HvNAME(hv))
980 	    {
981 		if (hv != PL_defstash && hv != stash)
982 		     gv_check(hv);              /* nested package */
983 	    }
984 	    else if (isALPHA(*HeKEY(entry))) {
985 		char *file;
986 		gv = (GV*)HeVAL(entry);
987 		if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
988 		    continue;
989 		file = GvFILE(gv);
990 		/* performance hack: if filename is absolute and it's a standard
991 		 * module, don't bother warning */
992 		if (file
993 		    && PERL_FILE_IS_ABSOLUTE(file)
994 		    && (instr(file, "/lib/") || instr(file, ".pm")))
995 		{
996 		    continue;
997 		}
998 		CopLINE_set(PL_curcop, GvLINE(gv));
999 #ifdef USE_ITHREADS
1000 		CopFILE(PL_curcop) = file;	/* set for warning */
1001 #else
1002 		CopFILEGV(PL_curcop) = gv_fetchfile(file);
1003 #endif
1004 		Perl_warner(aTHX_ WARN_ONCE,
1005 			"Name \"%s::%s\" used only once: possible typo",
1006 			HvNAME(stash), GvNAME(gv));
1007 	    }
1008 	}
1009     }
1010 }
1011 
1012 GV *
1013 Perl_newGVgen(pTHX_ char *pack)
1014 {
1015     return gv_fetchpv(Perl_form(aTHX_ "%s::_GEN_%ld", pack, (long)PL_gensym++),
1016 		      TRUE, SVt_PVGV);
1017 }
1018 
1019 /* hopefully this is only called on local symbol table entries */
1020 
1021 GP*
1022 Perl_gp_ref(pTHX_ GP *gp)
1023 {
1024     if (!gp)
1025 	return (GP*)NULL;
1026     gp->gp_refcnt++;
1027     if (gp->gp_cv) {
1028 	if (gp->gp_cvgen) {
1029 	    /* multi-named GPs cannot be used for method cache */
1030 	    SvREFCNT_dec(gp->gp_cv);
1031 	    gp->gp_cv = Nullcv;
1032 	    gp->gp_cvgen = 0;
1033 	}
1034 	else {
1035 	    /* Adding a new name to a subroutine invalidates method cache */
1036 	    PL_sub_generation++;
1037 	}
1038     }
1039     return gp;
1040 }
1041 
1042 void
1043 Perl_gp_free(pTHX_ GV *gv)
1044 {
1045     dTHR;
1046     GP* gp;
1047 
1048     if (!gv || !(gp = GvGP(gv)))
1049 	return;
1050     if (gp->gp_refcnt == 0) {
1051 	if (ckWARN_d(WARN_INTERNAL))
1052 	    Perl_warner(aTHX_ WARN_INTERNAL,
1053 			"Attempt to free unreferenced glob pointers");
1054         return;
1055     }
1056     if (gp->gp_cv) {
1057 	/* Deleting the name of a subroutine invalidates method cache */
1058 	PL_sub_generation++;
1059     }
1060     if (--gp->gp_refcnt > 0) {
1061 	if (gp->gp_egv == gv)
1062 	    gp->gp_egv = 0;
1063         return;
1064     }
1065 
1066     SvREFCNT_dec(gp->gp_sv);
1067     SvREFCNT_dec(gp->gp_av);
1068     SvREFCNT_dec(gp->gp_hv);
1069     SvREFCNT_dec(gp->gp_io);
1070     SvREFCNT_dec(gp->gp_cv);
1071     SvREFCNT_dec(gp->gp_form);
1072 
1073     Safefree(gp);
1074     GvGP(gv) = 0;
1075 }
1076 
1077 #if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
1078 #define MICROPORT
1079 #endif
1080 
1081 #ifdef	MICROPORT	/* Microport 2.4 hack */
1082 AV *GvAVn(gv)
1083 register GV *gv;
1084 {
1085     if (GvGP(gv)->gp_av)
1086 	return GvGP(gv)->gp_av;
1087     else
1088 	return GvGP(gv_AVadd(gv))->gp_av;
1089 }
1090 
1091 HV *GvHVn(gv)
1092 register GV *gv;
1093 {
1094     if (GvGP(gv)->gp_hv)
1095 	return GvGP(gv)->gp_hv;
1096     else
1097 	return GvGP(gv_HVadd(gv))->gp_hv;
1098 }
1099 #endif			/* Microport 2.4 hack */
1100 
1101 /* Updates and caches the CV's */
1102 
1103 bool
1104 Perl_Gv_AMupdate(pTHX_ HV *stash)
1105 {
1106   dTHR;
1107   GV* gv;
1108   CV* cv;
1109   MAGIC* mg=mg_find((SV*)stash,'c');
1110   AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL;
1111   AMT amt;
1112   STRLEN n_a;
1113 #ifdef OVERLOAD_VIA_HASH
1114   GV** gvp;
1115   HV* hv;
1116 #endif
1117 
1118   if (mg && amtp->was_ok_am == PL_amagic_generation
1119       && amtp->was_ok_sub == PL_sub_generation)
1120       return AMT_AMAGIC(amtp);
1121   if (amtp && AMT_AMAGIC(amtp)) {	/* Have table. */
1122     int i;
1123     for (i=1; i<NofAMmeth; i++) {
1124       if (amtp->table[i]) {
1125 	SvREFCNT_dec(amtp->table[i]);
1126       }
1127     }
1128   }
1129   sv_unmagic((SV*)stash, 'c');
1130 
1131   DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME(stash)) );
1132 
1133   amt.was_ok_am = PL_amagic_generation;
1134   amt.was_ok_sub = PL_sub_generation;
1135   amt.fallback = AMGfallNO;
1136   amt.flags = 0;
1137 
1138 #ifdef OVERLOAD_VIA_HASH
1139   gvp=(GV**)hv_fetch(stash,"OVERLOAD",8,FALSE);	/* A shortcut */
1140   if (gvp && ((gv = *gvp) != (GV*)&PL_sv_undef && (hv = GvHV(gv)))) {
1141     int filled=0;
1142     int i;
1143     char *cp;
1144     SV* sv;
1145     SV** svp;
1146 
1147     /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
1148 
1149     if (( cp = (char *)PL_AMG_names[0] ) &&
1150 	(svp = (SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
1151       if (SvTRUE(sv)) amt.fallback=AMGfallYES;
1152       else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
1153     }
1154     for (i = 1; i < NofAMmeth; i++) {
1155       cv = 0;
1156       cp = (char *)PL_AMG_names[i];
1157 
1158         svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
1159         if (svp && ((sv = *svp) != &PL_sv_undef)) {
1160           switch (SvTYPE(sv)) {
1161             default:
1162               if (!SvROK(sv)) {
1163                 if (!SvOK(sv)) break;
1164 		gv = gv_fetchmethod(stash, SvPV(sv, n_a));
1165                 if (gv) cv = GvCV(gv);
1166                 break;
1167               }
1168               cv = (CV*)SvRV(sv);
1169               if (SvTYPE(cv) == SVt_PVCV)
1170                   break;
1171                 /* FALL THROUGH */
1172             case SVt_PVHV:
1173             case SVt_PVAV:
1174 	      Perl_croak(aTHX_ "Not a subroutine reference in overload table");
1175 	      return FALSE;
1176             case SVt_PVCV:
1177               cv = (CV*)sv;
1178               break;
1179             case SVt_PVGV:
1180               if (!(cv = GvCVu((GV*)sv)))
1181                 cv = sv_2cv(sv, &stash, &gv, FALSE);
1182               break;
1183           }
1184           if (cv) filled=1;
1185 	  else {
1186 	    Perl_croak(aTHX_ "Method for operation %s not found in package %.256s during blessing\n",
1187 		cp,HvNAME(stash));
1188 	    return FALSE;
1189 	  }
1190         }
1191 #else
1192   {
1193     int filled = 0;
1194     int i;
1195     const char *cp;
1196     SV* sv = NULL;
1197 
1198     /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
1199 
1200     if ((cp = PL_AMG_names[0])) {
1201 	/* Try to find via inheritance. */
1202 	gv = gv_fetchmeth(stash, "()", 2, -1); /* A cookie: "()". */
1203 	if (gv)
1204 	    sv = GvSV(gv);
1205 
1206 	if (!gv)
1207 	    goto no_table;
1208 	else if (SvTRUE(sv))
1209 	    amt.fallback=AMGfallYES;
1210 	else if (SvOK(sv))
1211 	    amt.fallback=AMGfallNEVER;
1212     }
1213 
1214     for (i = 1; i < NofAMmeth; i++) {
1215 	SV *cookie = sv_2mortal(Perl_newSVpvf(aTHX_ "(%s", cp = PL_AMG_names[i]));
1216 	DEBUG_o( Perl_deb(aTHX_ "Checking overloading of `%s' in package `%.256s'\n",
1217 		     cp, HvNAME(stash)) );
1218 	/* don't fill the cache while looking up! */
1219 	gv = gv_fetchmeth(stash, SvPVX(cookie), SvCUR(cookie), -1);
1220         cv = 0;
1221         if(gv && (cv = GvCV(gv))) {
1222 	    if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
1223 		&& strEQ(HvNAME(GvSTASH(CvGV(cv))), "overload")) {
1224 		/* GvSV contains the name of the method. */
1225 		GV *ngv;
1226 
1227 		DEBUG_o( Perl_deb(aTHX_ "Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n",
1228 			     SvPV(GvSV(gv), n_a), cp, HvNAME(stash)) );
1229 		if (!SvPOK(GvSV(gv))
1230 		    || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
1231 						       FALSE)))
1232 		{
1233 		    /* Can be an import stub (created by `can'). */
1234 		    if (GvCVGEN(gv)) {
1235 			Perl_croak(aTHX_ "Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'",
1236 			      (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
1237 			      cp, HvNAME(stash));
1238 		    } else
1239 			Perl_croak(aTHX_ "Can't resolve method `%.256s' overloading `%s' in package `%.256s'",
1240 			      (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
1241 			      cp, HvNAME(stash));
1242 		}
1243 		cv = GvCV(gv = ngv);
1244 	    }
1245 	    DEBUG_o( Perl_deb(aTHX_ "Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
1246 			 cp, HvNAME(stash), HvNAME(GvSTASH(CvGV(cv))),
1247 			 GvNAME(CvGV(cv))) );
1248 	    filled = 1;
1249 	}
1250 #endif
1251 	amt.table[i]=(CV*)SvREFCNT_inc(cv);
1252     }
1253     if (filled) {
1254       AMT_AMAGIC_on(&amt);
1255       sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMT));
1256       return TRUE;
1257     }
1258   }
1259   /* Here we have no table: */
1260  no_table:
1261   AMT_AMAGIC_off(&amt);
1262   sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMTS));
1263   return FALSE;
1264 }
1265 
1266 SV*
1267 Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
1268 {
1269   dTHR;
1270   MAGIC *mg;
1271   CV *cv;
1272   CV **cvp=NULL, **ocvp=NULL;
1273   AMT *amtp, *oamtp;
1274   int fl=0, off, off1, lr=0, assign=AMGf_assign & flags, notfound=0;
1275   int postpr = 0, force_cpy = 0, assignshift = assign ? 1 : 0;
1276   HV* stash;
1277   if (!(AMGf_noleft & flags) && SvAMAGIC(left)
1278       && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c'))
1279       && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1280 			? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
1281 			: (CV **) NULL))
1282       && ((cv = cvp[off=method+assignshift])
1283 	  || (assign && amtp->fallback > AMGfallNEVER && /* fallback to
1284 						          * usual method */
1285 		  (fl = 1, cv = cvp[off=method])))) {
1286     lr = -1;			/* Call method for left argument */
1287   } else {
1288     if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
1289       int logic;
1290 
1291       /* look for substituted methods */
1292       /* In all the covered cases we should be called with assign==0. */
1293 	 switch (method) {
1294 	 case inc_amg:
1295 	   force_cpy = 1;
1296 	   if ((cv = cvp[off=add_ass_amg])
1297 	       || ((cv = cvp[off = add_amg]) && (force_cpy = 0, postpr = 1))) {
1298 	     right = &PL_sv_yes; lr = -1; assign = 1;
1299 	   }
1300 	   break;
1301 	 case dec_amg:
1302 	   force_cpy = 1;
1303 	   if ((cv = cvp[off = subtr_ass_amg])
1304 	       || ((cv = cvp[off = subtr_amg]) && (force_cpy = 0, postpr=1))) {
1305 	     right = &PL_sv_yes; lr = -1; assign = 1;
1306 	   }
1307 	   break;
1308 	 case bool__amg:
1309 	   (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]));
1310 	   break;
1311 	 case numer_amg:
1312 	   (void)((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]));
1313 	   break;
1314 	 case string_amg:
1315 	   (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
1316 	   break;
1317  case not_amg:
1318    (void)((cv = cvp[off=bool__amg])
1319 	  || (cv = cvp[off=numer_amg])
1320 	  || (cv = cvp[off=string_amg]));
1321    postpr = 1;
1322    break;
1323 	 case copy_amg:
1324 	   {
1325 	     /*
1326 		  * SV* ref causes confusion with the interpreter variable of
1327 		  * the same name
1328 		  */
1329 	     SV* tmpRef=SvRV(left);
1330 	     if (!SvROK(tmpRef) && SvTYPE(tmpRef) <= SVt_PVMG) {
1331 		/*
1332 		 * Just to be extra cautious.  Maybe in some
1333 		 * additional cases sv_setsv is safe, too.
1334 		 */
1335 		SV* newref = newSVsv(tmpRef);
1336 		SvOBJECT_on(newref);
1337 		SvSTASH(newref) = (HV*)SvREFCNT_inc(SvSTASH(tmpRef));
1338 		return newref;
1339 	     }
1340 	   }
1341 	   break;
1342 	 case abs_amg:
1343 	   if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
1344 	       && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
1345 	     SV* nullsv=sv_2mortal(newSViv(0));
1346 	     if (off1==lt_amg) {
1347 	       SV* lessp = amagic_call(left,nullsv,
1348 				       lt_amg,AMGf_noright);
1349 	       logic = SvTRUE(lessp);
1350 	     } else {
1351 	       SV* lessp = amagic_call(left,nullsv,
1352 				       ncmp_amg,AMGf_noright);
1353 	       logic = (SvNV(lessp) < 0);
1354 	     }
1355 	     if (logic) {
1356 	       if (off==subtr_amg) {
1357 		 right = left;
1358 		 left = nullsv;
1359 		 lr = 1;
1360 	       }
1361 	     } else {
1362 	       return left;
1363 	     }
1364 	   }
1365 	   break;
1366 	 case neg_amg:
1367 	   if ((cv = cvp[off=subtr_amg])) {
1368 	     right = left;
1369 	     left = sv_2mortal(newSViv(0));
1370 	     lr = 1;
1371 	   }
1372 	   break;
1373 	 case iter_amg:			/* XXXX Eventually should do to_gv. */
1374 	 case to_sv_amg:
1375 	 case to_av_amg:
1376 	 case to_hv_amg:
1377 	 case to_gv_amg:
1378 	 case to_cv_amg:
1379 	     /* FAIL safe */
1380 	     return NULL;	/* Delegate operation to standard mechanisms. */
1381 	     break;
1382 	 default:
1383 	   goto not_found;
1384 	 }
1385 	 if (!cv) goto not_found;
1386     } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
1387 	       && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(right))),'c'))
1388 	       && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1389 			  ? (amtp = (AMT*)mg->mg_ptr)->table
1390 			  : (CV **) NULL))
1391 	       && (cv = cvp[off=method])) { /* Method for right
1392 					     * argument found */
1393       lr=1;
1394     } else if (((ocvp && oamtp->fallback > AMGfallNEVER
1395 		 && (cvp=ocvp) && (lr = -1))
1396 		|| (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
1397 	       && !(flags & AMGf_unary)) {
1398 				/* We look for substitution for
1399 				 * comparison operations and
1400 				 * concatenation */
1401       if (method==concat_amg || method==concat_ass_amg
1402 	  || method==repeat_amg || method==repeat_ass_amg) {
1403 	return NULL;		/* Delegate operation to string conversion */
1404       }
1405       off = -1;
1406       switch (method) {
1407 	 case lt_amg:
1408 	 case le_amg:
1409 	 case gt_amg:
1410 	 case ge_amg:
1411 	 case eq_amg:
1412 	 case ne_amg:
1413 	   postpr = 1; off=ncmp_amg; break;
1414 	 case slt_amg:
1415 	 case sle_amg:
1416 	 case sgt_amg:
1417 	 case sge_amg:
1418 	 case seq_amg:
1419 	 case sne_amg:
1420 	   postpr = 1; off=scmp_amg; break;
1421 	 }
1422       if (off != -1) cv = cvp[off];
1423       if (!cv) {
1424 	goto not_found;
1425       }
1426     } else {
1427     not_found:			/* No method found, either report or croak */
1428       if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
1429 	notfound = 1; lr = -1;
1430       } else if (cvp && (cv=cvp[nomethod_amg])) {
1431 	notfound = 1; lr = 1;
1432       } else {
1433 	SV *msg;
1434 	if (off==-1) off=method;
1435 	msg = sv_2mortal(Perl_newSVpvf(aTHX_
1436 		      "Operation `%s': no method found,%sargument %s%s%s%s",
1437 		      PL_AMG_names[method + assignshift],
1438 		      (flags & AMGf_unary ? " " : "\n\tleft "),
1439 		      SvAMAGIC(left)?
1440 		        "in overloaded package ":
1441 		        "has no overloaded magic",
1442 		      SvAMAGIC(left)?
1443 		        HvNAME(SvSTASH(SvRV(left))):
1444 		        "",
1445 		      SvAMAGIC(right)?
1446 		        ",\n\tright argument in overloaded package ":
1447 		        (flags & AMGf_unary
1448 			 ? ""
1449 			 : ",\n\tright argument has no overloaded magic"),
1450 		      SvAMAGIC(right)?
1451 		        HvNAME(SvSTASH(SvRV(right))):
1452 		        ""));
1453 	if (amtp && amtp->fallback >= AMGfallYES) {
1454 	  DEBUG_o( Perl_deb(aTHX_ "%s", SvPVX(msg)) );
1455 	} else {
1456 	  Perl_croak(aTHX_ "%"SVf, msg);
1457 	}
1458 	return NULL;
1459       }
1460       force_cpy = force_cpy || assign;
1461     }
1462   }
1463   if (!notfound) {
1464     DEBUG_o( Perl_deb(aTHX_
1465   "Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
1466 		 PL_AMG_names[off],
1467 		 method+assignshift==off? "" :
1468 		             " (initially `",
1469 		 method+assignshift==off? "" :
1470 		             PL_AMG_names[method+assignshift],
1471 		 method+assignshift==off? "" : "')",
1472 		 flags & AMGf_unary? "" :
1473 		   lr==1 ? " for right argument": " for left argument",
1474 		 flags & AMGf_unary? " for argument" : "",
1475 		 HvNAME(stash),
1476 		 fl? ",\n\tassignment variant used": "") );
1477   }
1478     /* Since we use shallow copy during assignment, we need
1479      * to dublicate the contents, probably calling user-supplied
1480      * version of copy operator
1481      */
1482     /* We need to copy in following cases:
1483      * a) Assignment form was called.
1484      * 		assignshift==1,  assign==T, method + 1 == off
1485      * b) Increment or decrement, called directly.
1486      * 		assignshift==0,  assign==0, method + 0 == off
1487      * c) Increment or decrement, translated to assignment add/subtr.
1488      * 		assignshift==0,  assign==T,
1489      *		force_cpy == T
1490      * d) Increment or decrement, translated to nomethod.
1491      * 		assignshift==0,  assign==0,
1492      *		force_cpy == T
1493      * e) Assignment form translated to nomethod.
1494      * 		assignshift==1,  assign==T, method + 1 != off
1495      *		force_cpy == T
1496      */
1497     /*	off is method, method+assignshift, or a result of opcode substitution.
1498      *	In the latter case assignshift==0, so only notfound case is important.
1499      */
1500   if (( (method + assignshift == off)
1501 	&& (assign || (method == inc_amg) || (method == dec_amg)))
1502       || force_cpy)
1503     RvDEEPCP(left);
1504   {
1505     dSP;
1506     BINOP myop;
1507     SV* res;
1508     bool oldcatch = CATCH_GET;
1509 
1510     CATCH_SET(TRUE);
1511     Zero(&myop, 1, BINOP);
1512     myop.op_last = (OP *) &myop;
1513     myop.op_next = Nullop;
1514     myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
1515 
1516     PUSHSTACKi(PERLSI_OVERLOAD);
1517     ENTER;
1518     SAVEOP();
1519     PL_op = (OP *) &myop;
1520     if (PERLDB_SUB && PL_curstash != PL_debstash)
1521 	PL_op->op_private |= OPpENTERSUB_DB;
1522     PUTBACK;
1523     pp_pushmark();
1524 
1525     EXTEND(SP, notfound + 5);
1526     PUSHs(lr>0? right: left);
1527     PUSHs(lr>0? left: right);
1528     PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no ));
1529     if (notfound) {
1530       PUSHs( sv_2mortal(newSVpv((char *)PL_AMG_names[method + assignshift],0)));
1531     }
1532     PUSHs((SV*)cv);
1533     PUTBACK;
1534 
1535     if ((PL_op = Perl_pp_entersub(aTHX)))
1536       CALLRUNOPS(aTHX);
1537     LEAVE;
1538     SPAGAIN;
1539 
1540     res=POPs;
1541     PUTBACK;
1542     POPSTACK;
1543     CATCH_SET(oldcatch);
1544 
1545     if (postpr) {
1546       int ans;
1547       switch (method) {
1548       case le_amg:
1549       case sle_amg:
1550 	ans=SvIV(res)<=0; break;
1551       case lt_amg:
1552       case slt_amg:
1553 	ans=SvIV(res)<0; break;
1554       case ge_amg:
1555       case sge_amg:
1556 	ans=SvIV(res)>=0; break;
1557       case gt_amg:
1558       case sgt_amg:
1559 	ans=SvIV(res)>0; break;
1560       case eq_amg:
1561       case seq_amg:
1562 	ans=SvIV(res)==0; break;
1563       case ne_amg:
1564       case sne_amg:
1565 	ans=SvIV(res)!=0; break;
1566       case inc_amg:
1567       case dec_amg:
1568 	SvSetSV(left,res); return left;
1569       case not_amg:
1570 	ans=!SvTRUE(res); break;
1571       }
1572       return boolSV(ans);
1573     } else if (method==copy_amg) {
1574       if (!SvROK(res)) {
1575 	Perl_croak(aTHX_ "Copy method did not return a reference");
1576       }
1577       return SvREFCNT_inc(SvRV(res));
1578     } else {
1579       return res;
1580     }
1581   }
1582 }
1583