[win32] merge change#985 from maintbranch
[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
067391ea 712 case '!':
713 if(len > 1)
714 break;
1d3434b8 715 if(sv_type > SVt_PV) {
067391ea 716 HV* stash = gv_stashpvn("Errno",5,FALSE);
717 if(!stash || !(gv_fetchmethod(stash, "TIEHASH"))) {
718 dSP;
719 PUTBACK;
720 perl_require_pv("Errno.pm");
721 SPAGAIN;
722 stash = gv_stashpvn("Errno",5,FALSE);
723 if (!stash || !(gv_fetchmethod(stash, "TIEHASH")))
1d3434b8 724 croak("Can't use %%! because Errno.pm is not avaliable");
067391ea 725 }
726 }
727 goto magicalize;
93a17b20 728 case '#':
a0d0e21e 729 case '*':
730 if (dowarn && len == 1 && sv_type == SVt_PV)
731 warn("Use of $%s is deprecated", name);
732 /* FALL THROUGH */
733 case '[':
93a17b20 734 case '^':
735 case '~':
736 case '=':
737 case '-':
738 case '%':
739 case '.':
93a17b20 740 case '(':
741 case ')':
742 case '<':
743 case '>':
744 case ',':
745 case '\\':
746 case '/':
93a17b20 747 case '|':
748a9306 748 case '\001':
93a17b20 749 case '\004':
ad8898e0 750 case '\005':
748a9306 751 case '\006':
a0d0e21e 752 case '\010':
ad8898e0 753 case '\017':
93a17b20 754 case '\t':
755 case '\020':
756 case '\024':
757 case '\027':
463ee0b2 758 if (len > 1)
759 break;
760 goto magicalize;
761
a0d0e21e 762 case '+':
463ee0b2 763 case '1':
764 case '2':
765 case '3':
766 case '4':
767 case '5':
768 case '6':
769 case '7':
770 case '8':
771 case '9':
fb73857a 772 case '\023':
a0d0e21e 773 ro_magicalize:
774 SvREADONLY_on(GvSV(gv));
93a17b20 775 magicalize:
463ee0b2 776 sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
93a17b20 777 break;
778
779 case '\014':
463ee0b2 780 if (len > 1)
781 break;
93a17b20 782 sv_setpv(GvSV(gv),"\f");
783 formfeed = GvSV(gv);
784 break;
785 case ';':
463ee0b2 786 if (len > 1)
787 break;
93a17b20 788 sv_setpv(GvSV(gv),"\034");
789 break;
463ee0b2 790 case ']':
791 if (len == 1) {
f86702cc 792 SV *sv = GvSV(gv);
93a17b20 793 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 794 sv_setpv(sv, patchlevel);
f86702cc 795 (void)sv_2nv(sv);
796 SvREADONLY_on(sv);
93a17b20 797 }
798 break;
79072805 799 }
93a17b20 800 return gv;
79072805 801}
802
803void
8ac85365 804gv_fullname3(SV *sv, GV *gv, char *prefix)
79072805 805{
806 HV *hv = GvSTASH(gv);
f967eb5f 807 if (!hv) {
808 SvOK_off(sv);
79072805 809 return;
f967eb5f 810 }
811 sv_setpv(sv, prefix ? prefix : "");
79072805 812 sv_catpv(sv,HvNAME(hv));
463ee0b2 813 sv_catpvn(sv,"::", 2);
79072805 814 sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
815}
816
817void
8ac85365 818gv_efullname3(SV *sv, GV *gv, char *prefix)
79072805 819{
f967eb5f 820 GV *egv = GvEGV(gv);
748a9306 821 if (!egv)
822 egv = gv;
f6aff53a 823 gv_fullname3(sv, egv, prefix);
824}
825
826/* XXX compatibility with versions <= 5.003. */
827void
8ac85365 828gv_fullname(SV *sv, GV *gv)
f6aff53a 829{
830 gv_fullname3(sv, gv, sv == (SV*)gv ? "*" : "");
831}
832
833/* XXX compatibility with versions <= 5.003. */
834void
8ac85365 835gv_efullname(SV *sv, GV *gv)
f6aff53a 836{
837 gv_efullname3(sv, gv, sv == (SV*)gv ? "*" : "");
79072805 838}
839
840IO *
8ac85365 841newIO(void)
79072805 842{
11343788 843 dTHR;
79072805 844 IO *io;
8990e307 845 GV *iogv;
846
847 io = (IO*)NEWSV(0,0);
a0d0e21e 848 sv_upgrade((SV *)io,SVt_PVIO);
8990e307 849 SvREFCNT(io) = 1;
850 SvOBJECT_on(io);
c9de509e 851 iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV);
852 if (!iogv)
853 iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV);
8990e307 854 SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv));
79072805 855 return io;
856}
857
858void
8ac85365 859gv_check(HV *stash)
79072805 860{
11343788 861 dTHR;
79072805 862 register HE *entry;
863 register I32 i;
864 register GV *gv;
463ee0b2 865 HV *hv;
a0d0e21e 866 GV *filegv;
463ee0b2 867
8990e307 868 if (!HvARRAY(stash))
869 return;
a0d0e21e 870 for (i = 0; i <= (I32) HvMAX(stash); i++) {
dc437b57 871 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
872 if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
873 (gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)) && HvNAME(hv))
a0d0e21e 874 {
875 if (hv != defstash)
876 gv_check(hv); /* nested package */
877 }
dc437b57 878 else if (isALPHA(*HeKEY(entry))) {
879 gv = (GV*)HeVAL(entry);
55d729e4 880 if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
463ee0b2 881 continue;
882 curcop->cop_line = GvLINE(gv);
a0d0e21e 883 filegv = GvFILEGV(gv);
884 curcop->cop_filegv = filegv;
a5f75d66 885 if (filegv && GvMULTI(filegv)) /* Filename began with slash */
8990e307 886 continue;
dc437b57 887 warn("Name \"%s::%s\" used only once: possible typo",
a0d0e21e 888 HvNAME(stash), GvNAME(gv));
463ee0b2 889 }
79072805 890 }
891 }
892}
893
894GV *
8ac85365 895newGVgen(char *pack)
79072805 896{
46fc3d4c 897 return gv_fetchpv(form("%s::_GEN_%ld", pack, (long)gensym++),
898 TRUE, SVt_PVGV);
79072805 899}
900
901/* hopefully this is only called on local symbol table entries */
902
903GP*
8ac85365 904gp_ref(GP *gp)
79072805 905{
906 gp->gp_refcnt++;
44a8e56a 907 if (gp->gp_cv) {
908 if (gp->gp_cvgen) {
909 /* multi-named GPs cannot be used for method cache */
910 SvREFCNT_dec(gp->gp_cv);
911 gp->gp_cv = Nullcv;
912 gp->gp_cvgen = 0;
913 }
914 else {
915 /* Adding a new name to a subroutine invalidates method cache */
916 sub_generation++;
917 }
918 }
79072805 919 return gp;
79072805 920}
921
922void
8ac85365 923gp_free(GV *gv)
79072805 924{
79072805 925 GP* gp;
377b8fbc 926 CV* cv;
79072805 927
928 if (!gv || !(gp = GvGP(gv)))
929 return;
930 if (gp->gp_refcnt == 0) {
931 warn("Attempt to free unreferenced glob pointers");
932 return;
933 }
44a8e56a 934 if (gp->gp_cv) {
935 /* Deleting the name of a subroutine invalidates method cache */
936 sub_generation++;
937 }
748a9306 938 if (--gp->gp_refcnt > 0) {
939 if (gp->gp_egv == gv)
940 gp->gp_egv = 0;
79072805 941 return;
748a9306 942 }
79072805 943
8990e307 944 SvREFCNT_dec(gp->gp_sv);
945 SvREFCNT_dec(gp->gp_av);
946 SvREFCNT_dec(gp->gp_hv);
377b8fbc 947 SvREFCNT_dec(gp->gp_io);
a6006777 948 SvREFCNT_dec(gp->gp_cv);
748a9306 949 SvREFCNT_dec(gp->gp_form);
950
79072805 951 Safefree(gp);
952 GvGP(gv) = 0;
953}
954
955#if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
956#define MICROPORT
957#endif
958
959#ifdef MICROPORT /* Microport 2.4 hack */
960AV *GvAVn(gv)
961register GV *gv;
962{
963 if (GvGP(gv)->gp_av)
964 return GvGP(gv)->gp_av;
965 else
966 return GvGP(gv_AVadd(gv))->gp_av;
967}
968
969HV *GvHVn(gv)
970register GV *gv;
971{
972 if (GvGP(gv)->gp_hv)
973 return GvGP(gv)->gp_hv;
974 else
975 return GvGP(gv_HVadd(gv))->gp_hv;
976}
977#endif /* Microport 2.4 hack */
a0d0e21e 978
979#ifdef OVERLOAD
980/* Updates and caches the CV's */
981
982bool
8ac85365 983Gv_AMupdate(HV *stash)
a0d0e21e 984{
11343788 985 dTHR;
a0d0e21e 986 GV** gvp;
987 HV* hv;
988 GV* gv;
989 CV* cv;
990 MAGIC* mg=mg_find((SV*)stash,'c');
8ac85365 991 AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL;
a6006777 992 AMT amt;
a0d0e21e 993
e7ea3e70 994 if (mg && amtp->was_ok_am == amagic_generation
995 && amtp->was_ok_sub == sub_generation)
a6006777 996 return AMT_AMAGIC(amtp);
997 if (amtp && AMT_AMAGIC(amtp)) { /* Have table. */
748a9306 998 int i;
a6006777 999 for (i=1; i<NofAMmeth; i++) {
748a9306 1000 if (amtp->table[i]) {
1001 SvREFCNT_dec(amtp->table[i]);
1002 }
1003 }
1004 }
a0d0e21e 1005 sv_unmagic((SV*)stash, 'c');
1006
1007 DEBUG_o( deb("Recalcing overload magic in package %s\n",HvNAME(stash)) );
1008
a6006777 1009 amt.was_ok_am = amagic_generation;
1010 amt.was_ok_sub = sub_generation;
1011 amt.fallback = AMGfallNO;
1012 amt.flags = 0;
1013
1014#ifdef OVERLOAD_VIA_HASH
1015 gvp=(GV**)hv_fetch(stash,"OVERLOAD",8,FALSE); /* A shortcut */
a0d0e21e 1016 if (gvp && ((gv = *gvp) != (GV*)&sv_undef && (hv = GvHV(gv)))) {
1017 int filled=0;
1018 int i;
1019 char *cp;
a0d0e21e 1020 SV* sv;
1021 SV** svp;
a0d0e21e 1022
1023 /* Work with "fallback" key, which we assume to be first in AMG_names */
1024
a6006777 1025 if (( cp = (char *)AMG_names[0] ) &&
1026 (svp = (SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
a0d0e21e 1027 if (SvTRUE(sv)) amt.fallback=AMGfallYES;
1028 else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
1029 }
a6006777 1030 for (i = 1; i < NofAMmeth; i++) {
1031 cv = 0;
1032 cp = (char *)AMG_names[i];
1033
1034 svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
dc437b57 1035 if (svp && ((sv = *svp) != &sv_undef)) {
a0d0e21e 1036 switch (SvTYPE(sv)) {
1037 default:
1038 if (!SvROK(sv)) {
1039 if (!SvOK(sv)) break;
748a9306 1040 gv = gv_fetchmethod(stash, SvPV(sv, na));
a0d0e21e 1041 if (gv) cv = GvCV(gv);
1042 break;
1043 }
1044 cv = (CV*)SvRV(sv);
1045 if (SvTYPE(cv) == SVt_PVCV)
1046 break;
1047 /* FALL THROUGH */
1048 case SVt_PVHV:
1049 case SVt_PVAV:
a6006777 1050 croak("Not a subroutine reference in overload table");
a0d0e21e 1051 return FALSE;
1052 case SVt_PVCV:
8ebc5c01 1053 cv = (CV*)sv;
1054 break;
a0d0e21e 1055 case SVt_PVGV:
8ebc5c01 1056 if (!(cv = GvCVu((GV*)sv)))
1057 cv = sv_2cv(sv, &stash, &gv, TRUE);
1058 break;
a0d0e21e 1059 }
1060 if (cv) filled=1;
1061 else {
a6006777 1062 croak("Method for operation %s not found in package %.256s during blessing\n",
a0d0e21e 1063 cp,HvNAME(stash));
1064 return FALSE;
1065 }
1066 }
a6006777 1067#else
1068 {
1069 int filled = 0;
1070 int i;
9607fc9c 1071 const char *cp;
a6006777 1072 SV* sv = NULL;
1073 SV** svp;
1074
1075 /* Work with "fallback" key, which we assume to be first in AMG_names */
1076
9607fc9c 1077 if ( cp = AMG_names[0] ) {
a6006777 1078 /* Try to find via inheritance. */
774d564b 1079 gv = gv_fetchmeth(stash, "()", 2, -1); /* A cookie: "()". */
a6006777 1080 if (gv) sv = GvSV(gv);
1081
774d564b 1082 if (!gv) goto no_table;
a6006777 1083 else if (SvTRUE(sv)) amt.fallback=AMGfallYES;
1084 else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
1085 }
1086
1087 for (i = 1; i < NofAMmeth; i++) {
46fc3d4c 1088 SV *cookie = sv_2mortal(newSVpvf("(%s", cp = AMG_names[i]));
44a8e56a 1089 DEBUG_o( deb("Checking overloading of `%s' in package `%.256s'\n",
1090 cp, HvNAME(stash)) );
46fc3d4c 1091 /* don't fill the cache while looking up! */
1092 gv = gv_fetchmeth(stash, SvPVX(cookie), SvCUR(cookie), -1);
1093 cv = 0;
44a8e56a 1094 if(gv && (cv = GvCV(gv))) {
44a8e56a 1095 if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
1096 && strEQ(HvNAME(GvSTASH(CvGV(cv))), "overload")) {
1097 /* GvSV contains the name of the method. */
1098 GV *ngv;
1099
1100 DEBUG_o( deb("Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n",
1101 SvPV(GvSV(gv), na), cp, HvNAME(stash)) );
dc848c6f 1102 if (!SvPOK(GvSV(gv))
1103 || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
1104 FALSE)))
1105 {
44a8e56a 1106 /* Can be an import stub (created by `can'). */
1107 if (GvCVGEN(gv)) {
1108 croak("Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'",
1109 (SvPOK(GvSV(gv)) ? SvPVX(GvSV(gv)) : "???" ),
1110 cp, HvNAME(stash));
1111 } else
1112 croak("Cannot resolve method `%.256s' overloading `%s' in package `%.256s'",
1113 (SvPOK(GvSV(gv)) ? SvPVX(GvSV(gv)) : "???" ),
1114 cp, HvNAME(stash));
1115 }
dc848c6f 1116 cv = GvCV(gv = ngv);
44a8e56a 1117 }
1118 DEBUG_o( deb("Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
1119 cp, HvNAME(stash), HvNAME(GvSTASH(CvGV(cv))),
1120 GvNAME(CvGV(cv))) );
1121 filled = 1;
1122 }
a6006777 1123#endif
1124 amt.table[i]=(CV*)SvREFCNT_inc(cv);
a0d0e21e 1125 }
a0d0e21e 1126 if (filled) {
a6006777 1127 AMT_AMAGIC_on(&amt);
1128 sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMT));
a0d0e21e 1129 return TRUE;
1130 }
1131 }
a6006777 1132 /* Here we have no table: */
774d564b 1133 no_table:
a6006777 1134 AMT_AMAGIC_off(&amt);
1135 sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMTS));
a0d0e21e 1136 return FALSE;
1137}
1138
a0d0e21e 1139SV*
8ac85365 1140amagic_call(SV *left, SV *right, int method, int flags)
a0d0e21e 1141{
11343788 1142 dTHR;
a0d0e21e 1143 MAGIC *mg;
1144 CV *cv;
1145 CV **cvp=NULL, **ocvp=NULL;
1146 AMT *amtp, *oamtp;
1147 int fl=0, off, off1, lr=0, assign=AMGf_assign & flags, notfound=0;
748a9306 1148 int postpr=0, inc_dec_ass=0, assignshift=assign?1:0;
a0d0e21e 1149 HV* stash;
1150 if (!(AMGf_noleft & flags) && SvAMAGIC(left)
1151 && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c'))
a6006777 1152 && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1153 ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
8ac85365 1154 : (CV **) NULL))
748a9306 1155 && ((cv = cvp[off=method+assignshift])
1156 || (assign && amtp->fallback > AMGfallNEVER && /* fallback to
1157 * usual method */
1158 (fl = 1, cv = cvp[off=method])))) {
a0d0e21e 1159 lr = -1; /* Call method for left argument */
1160 } else {
1161 if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
1162 int logic;
1163
1164 /* look for substituted methods */
1165 switch (method) {
1166 case inc_amg:
748a9306 1167 if (((cv = cvp[off=add_ass_amg]) && (inc_dec_ass=1))
a0d0e21e 1168 || ((cv = cvp[off=add_amg]) && (postpr=1))) {
1169 right = &sv_yes; lr = -1; assign = 1;
1170 }
1171 break;
1172 case dec_amg:
748a9306 1173 if (((cv = cvp[off=subtr_ass_amg]) && (inc_dec_ass=1))
a0d0e21e 1174 || ((cv = cvp[off=subtr_amg]) && (postpr=1))) {
1175 right = &sv_yes; lr = -1; assign = 1;
1176 }
1177 break;
1178 case bool__amg:
1179 (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]));
1180 break;
1181 case numer_amg:
1182 (void)((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]));
1183 break;
1184 case string_amg:
1185 (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
1186 break;
dc437b57 1187 case not_amg:
1188 (void)((cv = cvp[off=bool__amg])
1189 || (cv = cvp[off=numer_amg])
1190 || (cv = cvp[off=string_amg]));
1191 postpr = 1;
1192 break;
748a9306 1193 case copy_amg:
1194 {
1195 SV* ref=SvRV(left);
fc36a67e 1196 if (!SvROK(ref) && SvTYPE(ref) <= SVt_PVMG) {
1197 /*
1198 * Just to be extra cautious. Maybe in some
1199 * additional cases sv_setsv is safe, too.
1200 */
748a9306 1201 SV* newref = newSVsv(ref);
1202 SvOBJECT_on(newref);
1203 SvSTASH(newref) = (HV*)SvREFCNT_inc(SvSTASH(ref));
1204 return newref;
1205 }
1206 }
1207 break;
a0d0e21e 1208 case abs_amg:
748a9306 1209 if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
a0d0e21e 1210 && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
748a9306 1211 SV* nullsv=sv_2mortal(newSViv(0));
a0d0e21e 1212 if (off1==lt_amg) {
748a9306 1213 SV* lessp = amagic_call(left,nullsv,
a0d0e21e 1214 lt_amg,AMGf_noright);
1215 logic = SvTRUE(lessp);
1216 } else {
748a9306 1217 SV* lessp = amagic_call(left,nullsv,
a0d0e21e 1218 ncmp_amg,AMGf_noright);
1219 logic = (SvNV(lessp) < 0);
1220 }
1221 if (logic) {
1222 if (off==subtr_amg) {
1223 right = left;
748a9306 1224 left = nullsv;
a0d0e21e 1225 lr = 1;
1226 }
1227 } else {
1228 return left;
1229 }
1230 }
1231 break;
1232 case neg_amg:
1233 if (cv = cvp[off=subtr_amg]) {
1234 right = left;
1235 left = sv_2mortal(newSViv(0));
1236 lr = 1;
1237 }
1238 break;
1239 default:
1240 goto not_found;
1241 }
1242 if (!cv) goto not_found;
1243 } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
1244 && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(right))),'c'))
a6006777 1245 && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1246 ? (amtp = (AMT*)mg->mg_ptr)->table
8ac85365 1247 : (CV **) NULL))
a0d0e21e 1248 && (cv = cvp[off=method])) { /* Method for right
1249 * argument found */
1250 lr=1;
748a9306 1251 } else if (((ocvp && oamtp->fallback > AMGfallNEVER
4633a7c4 1252 && (cvp=ocvp) && (lr = -1))
a0d0e21e 1253 || (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
1254 && !(flags & AMGf_unary)) {
1255 /* We look for substitution for
1256 * comparison operations and
fc36a67e 1257 * concatenation */
a0d0e21e 1258 if (method==concat_amg || method==concat_ass_amg
1259 || method==repeat_amg || method==repeat_ass_amg) {
1260 return NULL; /* Delegate operation to string conversion */
1261 }
1262 off = -1;
1263 switch (method) {
1264 case lt_amg:
1265 case le_amg:
1266 case gt_amg:
1267 case ge_amg:
1268 case eq_amg:
1269 case ne_amg:
1270 postpr = 1; off=ncmp_amg; break;
1271 case slt_amg:
1272 case sle_amg:
1273 case sgt_amg:
1274 case sge_amg:
1275 case seq_amg:
1276 case sne_amg:
1277 postpr = 1; off=scmp_amg; break;
1278 }
1279 if (off != -1) cv = cvp[off];
1280 if (!cv) {
1281 goto not_found;
1282 }
1283 } else {
a6006777 1284 not_found: /* No method found, either report or croak */
a0d0e21e 1285 if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
1286 notfound = 1; lr = -1;
1287 } else if (cvp && (cv=cvp[nomethod_amg])) {
1288 notfound = 1; lr = 1;
1289 } else {
46fc3d4c 1290 SV *msg;
774d564b 1291 if (off==-1) off=method;
46fc3d4c 1292 msg = sv_2mortal(newSVpvf(
1293 "Operation `%s': no method found,%sargument %s%s%s%s",
a6006777 1294 AMG_names[method + assignshift],
e7ea3e70 1295 (flags & AMGf_unary ? " " : "\n\tleft "),
a0d0e21e 1296 SvAMAGIC(left)?
1297 "in overloaded package ":
1298 "has no overloaded magic",
1299 SvAMAGIC(left)?
1300 HvNAME(SvSTASH(SvRV(left))):
1301 "",
1302 SvAMAGIC(right)?
e7ea3e70 1303 ",\n\tright argument in overloaded package ":
1304 (flags & AMGf_unary
1305 ? ""
1306 : ",\n\tright argument has no overloaded magic"),
a0d0e21e 1307 SvAMAGIC(right)?
1308 HvNAME(SvSTASH(SvRV(right))):
46fc3d4c 1309 ""));
a0d0e21e 1310 if (amtp && amtp->fallback >= AMGfallYES) {
46fc3d4c 1311 DEBUG_o( deb("%s", SvPVX(msg)) );
a0d0e21e 1312 } else {
fc36a67e 1313 croak("%_", msg);
a0d0e21e 1314 }
1315 return NULL;
1316 }
1317 }
1318 }
1319 if (!notfound) {
774d564b 1320 DEBUG_o( deb(
46fc3d4c 1321 "Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
a6006777 1322 AMG_names[off],
748a9306 1323 method+assignshift==off? "" :
1324 " (initially `",
1325 method+assignshift==off? "" :
a6006777 1326 AMG_names[method+assignshift],
748a9306 1327 method+assignshift==off? "" : "')",
1328 flags & AMGf_unary? "" :
1329 lr==1 ? " for right argument": " for left argument",
1330 flags & AMGf_unary? " for argument" : "",
a0d0e21e 1331 HvNAME(stash),
1332 fl? ",\n\tassignment variant used": "") );
748a9306 1333 /* Since we use shallow copy during assignment, we need
1334 * to dublicate the contents, probably calling user-supplied
1335 * version of copy operator
1336 */
c07a80fd 1337 if ((method + assignshift==off
748a9306 1338 && (assign || method==inc_amg || method==dec_amg))
1339 || inc_dec_ass) RvDEEPCP(left);
a0d0e21e 1340 }
1341 {
1342 dSP;
1343 BINOP myop;
1344 SV* res;
54310121 1345 bool oldcatch = CATCH_GET;
a0d0e21e 1346
54310121 1347 CATCH_SET(TRUE);
a0d0e21e 1348 Zero(&myop, 1, BINOP);
1349 myop.op_last = (OP *) &myop;
1350 myop.op_next = Nullop;
54310121 1351 myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
a0d0e21e 1352
e336de0d 1353 PUSHSTACK(SI_OVERLOAD);
a0d0e21e 1354 ENTER;
462e5cf6 1355 SAVEOP();
a0d0e21e 1356 op = (OP *) &myop;
84902520 1357 if (PERLDB_SUB && curstash != debstash)
dc437b57 1358 op->op_private |= OPpENTERSUB_DB;
a0d0e21e 1359 PUTBACK;
11343788 1360 pp_pushmark(ARGS);
a0d0e21e 1361
924508f0 1362 EXTEND(SP, notfound + 5);
a0d0e21e 1363 PUSHs(lr>0? right: left);
1364 PUSHs(lr>0? left: right);
5167a5b1 1365 PUSHs( lr > 0 ? &sv_yes : ( assign ? &sv_undef : &sv_no ));
a0d0e21e 1366 if (notfound) {
a6006777 1367 PUSHs( sv_2mortal(newSVpv((char *)AMG_names[method + assignshift],0)) );
a0d0e21e 1368 }
1369 PUSHs((SV*)cv);
1370 PUTBACK;
1371
11343788 1372 if (op = pp_entersub(ARGS))
ad8898e0 1373 runops();
a0d0e21e 1374 LEAVE;
1375 SPAGAIN;
1376
1377 res=POPs;
e336de0d 1378 POPSTACK();
54310121 1379 CATCH_SET(oldcatch);
a0d0e21e 1380
a0d0e21e 1381 if (postpr) {
1382 int ans;
1383 switch (method) {
1384 case le_amg:
1385 case sle_amg:
1386 ans=SvIV(res)<=0; break;
1387 case lt_amg:
1388 case slt_amg:
1389 ans=SvIV(res)<0; break;
1390 case ge_amg:
1391 case sge_amg:
1392 ans=SvIV(res)>=0; break;
1393 case gt_amg:
1394 case sgt_amg:
1395 ans=SvIV(res)>0; break;
1396 case eq_amg:
1397 case seq_amg:
1398 ans=SvIV(res)==0; break;
1399 case ne_amg:
1400 case sne_amg:
1401 ans=SvIV(res)!=0; break;
1402 case inc_amg:
1403 case dec_amg:
bbce6d69 1404 SvSetSV(left,res); return left;
dc437b57 1405 case not_amg:
44a8e56a 1406 ans=!SvOK(res); break;
a0d0e21e 1407 }
54310121 1408 return boolSV(ans);
748a9306 1409 } else if (method==copy_amg) {
1410 if (!SvROK(res)) {
a6006777 1411 croak("Copy method did not return a reference");
748a9306 1412 }
1413 return SvREFCNT_inc(SvRV(res));
a0d0e21e 1414 } else {
1415 return res;
1416 }
1417 }
1418}
1419#endif /* OVERLOAD */
4e35701f 1420