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