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