This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: API Cleanup
[perl5.git] / gv.c
... / ...
CommitLineData
1/* gv.c
2 *
3 * Copyright (c) 1991-2001, Larry Wall
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
8 */
9
10/*
11 * 'Mercy!' cried Gandalf. 'If the giving of information is to be the cure
12 * of your inquisitiveness, I shall spend all the rest of my days answering
13 * you. What more do you want to know?'
14 * 'The names of all the stars, and of all living things, and the whole
15 * history of Middle-earth and Over-heaven and of the Sundering Seas,'
16 * laughed Pippin.
17 */
18
19#include "EXTERN.h"
20#define PERL_IN_GV_C
21#include "perl.h"
22
23GV *
24Perl_gv_AVadd(pTHX_ register GV *gv)
25{
26 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
27 Perl_croak(aTHX_ "Bad symbol for array");
28 if (!GvAV(gv))
29 GvAV(gv) = newAV();
30 return gv;
31}
32
33GV *
34Perl_gv_HVadd(pTHX_ register GV *gv)
35{
36 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
37 Perl_croak(aTHX_ "Bad symbol for hash");
38 if (!GvHV(gv))
39 GvHV(gv) = newHV();
40 return gv;
41}
42
43GV *
44Perl_gv_IOadd(pTHX_ register GV *gv)
45{
46 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
47 Perl_croak(aTHX_ "Bad symbol for filehandle");
48 if (!GvIOp(gv))
49 GvIOp(gv) = newIO();
50 return gv;
51}
52
53GV *
54Perl_gv_fetchfile(pTHX_ const char *name)
55{
56 char smallbuf[256];
57 char *tmpbuf;
58 STRLEN tmplen;
59 GV *gv;
60
61 if (!PL_defstash)
62 return Nullgv;
63
64 tmplen = strlen(name) + 2;
65 if (tmplen < sizeof smallbuf)
66 tmpbuf = smallbuf;
67 else
68 New(603, tmpbuf, tmplen + 1, char);
69 tmpbuf[0] = '_';
70 tmpbuf[1] = '<';
71 strcpy(tmpbuf + 2, name);
72 gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE);
73 if (!isGV(gv)) {
74 gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE);
75 sv_setpv(GvSV(gv), name);
76 if (PERLDB_LINE)
77 hv_magic(GvHVn(gv_AVadd(gv)), Nullgv, 'L');
78 }
79 if (tmpbuf != smallbuf)
80 Safefree(tmpbuf);
81 return gv;
82}
83
84void
85Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
86{
87 register GP *gp;
88 bool doproto = SvTYPE(gv) > SVt_NULL;
89 char *proto = (doproto && SvPOK(gv)) ? SvPVX(gv) : NULL;
90
91 sv_upgrade((SV*)gv, SVt_PVGV);
92 if (SvLEN(gv)) {
93 if (proto) {
94 SvPVX(gv) = NULL;
95 SvLEN(gv) = 0;
96 SvPOK_off(gv);
97 } else
98 Safefree(SvPVX(gv));
99 }
100 Newz(602, gp, 1, GP);
101 GvGP(gv) = gp_ref(gp);
102 GvSV(gv) = NEWSV(72,0);
103 GvLINE(gv) = CopLINE(PL_curcop);
104 GvFILE(gv) = CopFILE(PL_curcop) ? CopFILE(PL_curcop) : "";
105 GvCVGEN(gv) = 0;
106 GvEGV(gv) = gv;
107 sv_magic((SV*)gv, (SV*)gv, '*', Nullch, 0);
108 GvSTASH(gv) = (HV*)SvREFCNT_inc(stash);
109 GvNAME(gv) = savepvn(name, len);
110 GvNAMELEN(gv) = len;
111 if (multi || doproto) /* doproto means it _was_ mentioned */
112 GvMULTI_on(gv);
113 if (doproto) { /* Replicate part of newSUB here. */
114 SvIOK_off(gv);
115 ENTER;
116 /* XXX unsafe for threads if eval_owner isn't held */
117 start_subparse(0,0); /* Create CV in compcv. */
118 GvCV(gv) = PL_compcv;
119 LEAVE;
120
121 PL_sub_generation++;
122 CvGV(GvCV(gv)) = (GV*)SvREFCNT_inc(gv);
123 CvFILE(GvCV(gv)) = CopFILE(PL_curcop);
124 CvSTASH(GvCV(gv)) = PL_curstash;
125#ifdef USE_THREADS
126 CvOWNER(GvCV(gv)) = 0;
127 if (!CvMUTEXP(GvCV(gv))) {
128 New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex);
129 MUTEX_INIT(CvMUTEXP(GvCV(gv)));
130 }
131#endif /* USE_THREADS */
132 if (proto) {
133 sv_setpv((SV*)GvCV(gv), proto);
134 Safefree(proto);
135 }
136 }
137}
138
139STATIC void
140S_gv_init_sv(pTHX_ GV *gv, I32 sv_type)
141{
142 switch (sv_type) {
143 case SVt_PVIO:
144 (void)GvIOn(gv);
145 break;
146 case SVt_PVAV:
147 (void)GvAVn(gv);
148 break;
149 case SVt_PVHV:
150 (void)GvHVn(gv);
151 break;
152 }
153}
154
155/*
156=for apidoc gv_fetchmeth
157
158Returns the glob with the given C<name> and a defined subroutine or
159C<NULL>. The glob lives in the given C<stash>, or in the stashes
160accessible via @ISA and @UNIVERSAL.
161
162The argument C<level> should be either 0 or -1. If C<level==0>, as a
163side-effect creates a glob with the given C<name> in the given C<stash>
164which in the case of success contains an alias for the subroutine, and sets
165up caching info for this glob. Similarly for all the searched stashes.
166
167This function grants C<"SUPER"> token as a postfix of the stash name. The
168GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
169visible to Perl code. So when calling C<call_sv>, you should not use
170the GV directly; instead, you should use the method's CV, which can be
171obtained from the GV with the C<GvCV> macro.
172
173=cut
174*/
175
176GV *
177Perl_gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level)
178{
179 AV* av;
180 GV* topgv;
181 GV* gv;
182 GV** gvp;
183 CV* cv;
184
185 if (!stash)
186 return 0;
187 if ((level > 100) || (level < -100))
188 Perl_croak(aTHX_ "Recursive inheritance detected while looking for method '%s' in package '%s'",
189 name, HvNAME(stash));
190
191 DEBUG_o( Perl_deb(aTHX_ "Looking for method %s in package %s\n",name,HvNAME(stash)) );
192
193 gvp = (GV**)hv_fetch(stash, name, len, (level >= 0));
194 if (!gvp)
195 topgv = Nullgv;
196 else {
197 topgv = *gvp;
198 if (SvTYPE(topgv) != SVt_PVGV)
199 gv_init(topgv, stash, name, len, TRUE);
200 if ((cv = GvCV(topgv))) {
201 /* If genuine method or valid cache entry, use it */
202 if (!GvCVGEN(topgv) || GvCVGEN(topgv) == PL_sub_generation)
203 return topgv;
204 /* Stale cached entry: junk it */
205 SvREFCNT_dec(cv);
206 GvCV(topgv) = cv = Nullcv;
207 GvCVGEN(topgv) = 0;
208 }
209 else if (GvCVGEN(topgv) == PL_sub_generation)
210 return 0; /* cache indicates sub doesn't exist */
211 }
212
213 gvp = (GV**)hv_fetch(stash, "ISA", 3, FALSE);
214 av = (gvp && (gv = *gvp) && gv != (GV*)&PL_sv_undef) ? GvAV(gv) : Nullav;
215
216 /* create and re-create @.*::SUPER::ISA on demand */
217 if (!av || !SvMAGIC(av)) {
218 char* packname = HvNAME(stash);
219 STRLEN packlen = strlen(packname);
220
221 if (packlen >= 7 && strEQ(packname + packlen - 7, "::SUPER")) {
222 HV* basestash;
223
224 packlen -= 7;
225 basestash = gv_stashpvn(packname, packlen, TRUE);
226 gvp = (GV**)hv_fetch(basestash, "ISA", 3, FALSE);
227 if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (av = GvAV(gv))) {
228 gvp = (GV**)hv_fetch(stash, "ISA", 3, TRUE);
229 if (!gvp || !(gv = *gvp))
230 Perl_croak(aTHX_ "Cannot create %s::ISA", HvNAME(stash));
231 if (SvTYPE(gv) != SVt_PVGV)
232 gv_init(gv, stash, "ISA", 3, TRUE);
233 SvREFCNT_dec(GvAV(gv));
234 GvAV(gv) = (AV*)SvREFCNT_inc(av);
235 }
236 }
237 }
238
239 if (av) {
240 SV** svp = AvARRAY(av);
241 /* NOTE: No support for tied ISA */
242 I32 items = AvFILLp(av) + 1;
243 while (items--) {
244 SV* sv = *svp++;
245 HV* basestash = gv_stashsv(sv, FALSE);
246 if (!basestash) {
247 if (ckWARN(WARN_MISC))
248 Perl_warner(aTHX_ WARN_MISC, "Can't locate package %s for @%s::ISA",
249 SvPVX(sv), HvNAME(stash));
250 continue;
251 }
252 gv = gv_fetchmeth(basestash, name, len,
253 (level >= 0) ? level + 1 : level - 1);
254 if (gv)
255 goto gotcha;
256 }
257 }
258
259 /* if at top level, try UNIVERSAL */
260
261 if (level == 0 || level == -1) {
262 HV* lastchance;
263
264 if ((lastchance = gv_stashpvn("UNIVERSAL", 9, FALSE))) {
265 if ((gv = gv_fetchmeth(lastchance, name, len,
266 (level >= 0) ? level + 1 : level - 1)))
267 {
268 gotcha:
269 /*
270 * Cache method in topgv if:
271 * 1. topgv has no synonyms (else inheritance crosses wires)
272 * 2. method isn't a stub (else AUTOLOAD fails spectacularly)
273 */
274 if (topgv &&
275 GvREFCNT(topgv) == 1 &&
276 (cv = GvCV(gv)) &&
277 (CvROOT(cv) || CvXSUB(cv)))
278 {
279 if ((cv = GvCV(topgv)))
280 SvREFCNT_dec(cv);
281 GvCV(topgv) = (CV*)SvREFCNT_inc(GvCV(gv));
282 GvCVGEN(topgv) = PL_sub_generation;
283 }
284 return gv;
285 }
286 else if (topgv && GvREFCNT(topgv) == 1) {
287 /* cache the fact that the method is not defined */
288 GvCVGEN(topgv) = PL_sub_generation;
289 }
290 }
291 }
292
293 return 0;
294}
295
296/*
297=for apidoc gv_fetchmethod
298
299See L<gv_fetchmethod_autoload>.
300
301=cut
302*/
303
304GV *
305Perl_gv_fetchmethod(pTHX_ HV *stash, const char *name)
306{
307 return gv_fetchmethod_autoload(stash, name, TRUE);
308}
309
310/*
311=for apidoc gv_fetchmethod_autoload
312
313Returns the glob which contains the subroutine to call to invoke the method
314on the C<stash>. In fact in the presence of autoloading this may be the
315glob for "AUTOLOAD". In this case the corresponding variable $AUTOLOAD is
316already setup.
317
318The third parameter of C<gv_fetchmethod_autoload> determines whether
319AUTOLOAD lookup is performed if the given method is not present: non-zero
320means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
321Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
322with a non-zero C<autoload> parameter.
323
324These functions grant C<"SUPER"> token as a prefix of the method name. Note
325that if you want to keep the returned glob for a long time, you need to
326check for it being "AUTOLOAD", since at the later time the call may load a
327different subroutine due to $AUTOLOAD changing its value. Use the glob
328created via a side effect to do this.
329
330These functions have the same side-effects and as C<gv_fetchmeth> with
331C<level==0>. C<name> should be writable if contains C<':'> or C<'
332''>. The warning against passing the GV returned by C<gv_fetchmeth> to
333C<call_sv> apply equally to these functions.
334
335=cut
336*/
337
338GV *
339Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload)
340{
341 register const char *nend;
342 const char *nsplit = 0;
343 GV* gv;
344
345 for (nend = name; *nend; nend++) {
346 if (*nend == '\'')
347 nsplit = nend;
348 else if (*nend == ':' && *(nend + 1) == ':')
349 nsplit = ++nend;
350 }
351 if (nsplit) {
352 const char *origname = name;
353 name = nsplit + 1;
354 if (*nsplit == ':')
355 --nsplit;
356 if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) {
357 /* ->SUPER::method should really be looked up in original stash */
358 SV *tmpstr = sv_2mortal(Perl_newSVpvf(aTHX_ "%s::SUPER",
359 CopSTASHPV(PL_curcop)));
360 stash = gv_stashpvn(SvPVX(tmpstr), SvCUR(tmpstr), TRUE);
361 DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n",
362 origname, HvNAME(stash), name) );
363 }
364 else
365 stash = gv_stashpvn(origname, nsplit - origname, TRUE);
366 }
367
368 gv = gv_fetchmeth(stash, name, nend - name, 0);
369 if (!gv) {
370 if (strEQ(name,"import") || strEQ(name,"unimport"))
371 gv = (GV*)&PL_sv_yes;
372 else if (autoload)
373 gv = gv_autoload4(stash, name, nend - name, TRUE);
374 }
375 else if (autoload) {
376 CV* cv = GvCV(gv);
377 if (!CvROOT(cv) && !CvXSUB(cv)) {
378 GV* stubgv;
379 GV* autogv;
380
381 if (CvANON(cv))
382 stubgv = gv;
383 else {
384 stubgv = CvGV(cv);
385 if (GvCV(stubgv) != cv) /* orphaned import */
386 stubgv = gv;
387 }
388 autogv = gv_autoload4(GvSTASH(stubgv),
389 GvNAME(stubgv), GvNAMELEN(stubgv), TRUE);
390 if (autogv)
391 gv = autogv;
392 }
393 }
394
395 return gv;
396}
397
398GV*
399Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
400{
401 static char autoload[] = "AUTOLOAD";
402 static STRLEN autolen = 8;
403 GV* gv;
404 CV* cv;
405 HV* varstash;
406 GV* vargv;
407 SV* varsv;
408
409 if (len == autolen && strnEQ(name, autoload, autolen))
410 return Nullgv;
411 if (!(gv = gv_fetchmeth(stash, autoload, autolen, FALSE)))
412 return Nullgv;
413 cv = GvCV(gv);
414
415 if (!(CvROOT(cv) || CvXSUB(cv)))
416 return Nullgv;
417
418 /*
419 * Inheriting AUTOLOAD for non-methods works ... for now.
420 */
421 if (ckWARN(WARN_DEPRECATED) && !method &&
422 (GvCVGEN(gv) || GvSTASH(gv) != stash))
423 Perl_warner(aTHX_ WARN_DEPRECATED,
424 "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
425 HvNAME(stash), (int)len, name);
426
427#ifndef USE_THREADS
428 if (CvXSUB(cv)) {
429 /* rather than lookup/init $AUTOLOAD here
430 * only to have the XSUB do another lookup for $AUTOLOAD
431 * and split that value on the last '::',
432 * pass along the same data via some unused fields in the CV
433 */
434 CvSTASH(cv) = stash;
435 SvPVX(cv) = (char *)name; /* cast to loose constness warning */
436 SvCUR(cv) = len;
437 return gv;
438 }
439#endif
440
441 /*
442 * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name.
443 * The subroutine's original name may not be "AUTOLOAD", so we don't
444 * use that, but for lack of anything better we will use the sub's
445 * original package to look up $AUTOLOAD.
446 */
447 varstash = GvSTASH(CvGV(cv));
448 vargv = *(GV**)hv_fetch(varstash, autoload, autolen, TRUE);
449 ENTER;
450
451#ifdef USE_THREADS
452 sv_lock((SV *)varstash);
453#endif
454 if (!isGV(vargv))
455 gv_init(vargv, varstash, autoload, autolen, FALSE);
456 LEAVE;
457 varsv = GvSV(vargv);
458#ifdef USE_THREADS
459 sv_lock(varsv);
460#endif
461 sv_setpv(varsv, HvNAME(stash));
462 sv_catpvn(varsv, "::", 2);
463 sv_catpvn(varsv, name, len);
464 SvTAINTED_off(varsv);
465 return gv;
466}
467
468/*
469=for apidoc gv_stashpv
470
471Returns a pointer to the stash for a specified package. C<name> should
472be a valid UTF-8 string. If C<create> is set then the package will be
473created if it does not already exist. If C<create> is not set and the
474package does not exist then NULL is returned.
475
476=cut
477*/
478
479HV*
480Perl_gv_stashpv(pTHX_ const char *name, I32 create)
481{
482 return gv_stashpvn(name, strlen(name), create);
483}
484
485HV*
486Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 create)
487{
488 char smallbuf[256];
489 char *tmpbuf;
490 HV *stash;
491 GV *tmpgv;
492
493 if (namelen + 3 < sizeof smallbuf)
494 tmpbuf = smallbuf;
495 else
496 New(606, tmpbuf, namelen + 3, char);
497 Copy(name,tmpbuf,namelen,char);
498 tmpbuf[namelen++] = ':';
499 tmpbuf[namelen++] = ':';
500 tmpbuf[namelen] = '\0';
501 tmpgv = gv_fetchpv(tmpbuf, create, SVt_PVHV);
502 if (tmpbuf != smallbuf)
503 Safefree(tmpbuf);
504 if (!tmpgv)
505 return 0;
506 if (!GvHV(tmpgv))
507 GvHV(tmpgv) = newHV();
508 stash = GvHV(tmpgv);
509 if (!HvNAME(stash))
510 HvNAME(stash) = savepv(name);
511 return stash;
512}
513
514/*
515=for apidoc gv_stashsv
516
517Returns a pointer to the stash for a specified package, which must be a
518valid UTF-8 string. See C<gv_stashpv>.
519
520=cut
521*/
522
523HV*
524Perl_gv_stashsv(pTHX_ SV *sv, I32 create)
525{
526 register char *ptr;
527 STRLEN len;
528 ptr = SvPV(sv,len);
529 return gv_stashpvn(ptr, len, create);
530}
531
532
533GV *
534Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
535{
536 register const char *name = nambeg;
537 register GV *gv = 0;
538 GV**gvp;
539 I32 len;
540 register const char *namend;
541 HV *stash = 0;
542
543 if (*name == '*' && isALPHA(name[1])) /* accidental stringify on a GV? */
544 name++;
545
546 for (namend = name; *namend; namend++) {
547 if ((*namend == ':' && namend[1] == ':')
548 || (*namend == '\'' && namend[1]))
549 {
550 if (!stash)
551 stash = PL_defstash;
552 if (!stash || !SvREFCNT(stash)) /* symbol table under destruction */
553 return Nullgv;
554
555 len = namend - name;
556 if (len > 0) {
557 char smallbuf[256];
558 char *tmpbuf;
559
560 if (len + 3 < sizeof smallbuf)
561 tmpbuf = smallbuf;
562 else
563 New(601, tmpbuf, len+3, char);
564 Copy(name, tmpbuf, len, char);
565 tmpbuf[len++] = ':';
566 tmpbuf[len++] = ':';
567 tmpbuf[len] = '\0';
568 gvp = (GV**)hv_fetch(stash,tmpbuf,len,add);
569 gv = gvp ? *gvp : Nullgv;
570 if (gv && gv != (GV*)&PL_sv_undef) {
571 if (SvTYPE(gv) != SVt_PVGV)
572 gv_init(gv, stash, tmpbuf, len, (add & GV_ADDMULTI));
573 else
574 GvMULTI_on(gv);
575 }
576 if (tmpbuf != smallbuf)
577 Safefree(tmpbuf);
578 if (!gv || gv == (GV*)&PL_sv_undef)
579 return Nullgv;
580
581 if (!(stash = GvHV(gv)))
582 stash = GvHV(gv) = newHV();
583
584 if (!HvNAME(stash))
585 HvNAME(stash) = savepvn(nambeg, namend - nambeg);
586 }
587
588 if (*namend == ':')
589 namend++;
590 namend++;
591 name = namend;
592 if (!*name)
593 return gv ? gv : (GV*)*hv_fetch(PL_defstash, "main::", 6, TRUE);
594 }
595 }
596 len = namend - name;
597 if (!len)
598 len = 1;
599
600 /* No stash in name, so see how we can default */
601
602 if (!stash) {
603 if (isIDFIRST_lazy(name)) {
604 bool global = FALSE;
605
606 if (isUPPER(*name)) {
607 if (*name == 'S' && (
608 strEQ(name, "SIG") ||
609 strEQ(name, "STDIN") ||
610 strEQ(name, "STDOUT") ||
611 strEQ(name, "STDERR")))
612 global = TRUE;
613 else if (*name == 'I' && strEQ(name, "INC"))
614 global = TRUE;
615 else if (*name == 'E' && strEQ(name, "ENV"))
616 global = TRUE;
617 else if (*name == 'A' && (
618 strEQ(name, "ARGV") ||
619 strEQ(name, "ARGVOUT")))
620 global = TRUE;
621 }
622 else if (*name == '_' && !name[1])
623 global = TRUE;
624
625 if (global)
626 stash = PL_defstash;
627 else if ((COP*)PL_curcop == &PL_compiling) {
628 stash = PL_curstash;
629 if (add && (PL_hints & HINT_STRICT_VARS) &&
630 sv_type != SVt_PVCV &&
631 sv_type != SVt_PVGV &&
632 sv_type != SVt_PVFM &&
633 sv_type != SVt_PVIO &&
634 !(len == 1 && sv_type == SVt_PV && strchr("ab",*name)) )
635 {
636 gvp = (GV**)hv_fetch(stash,name,len,0);
637 if (!gvp ||
638 *gvp == (GV*)&PL_sv_undef ||
639 SvTYPE(*gvp) != SVt_PVGV)
640 {
641 stash = 0;
642 }
643 else if ((sv_type == SVt_PV && !GvIMPORTED_SV(*gvp)) ||
644 (sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp)) ||
645 (sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp)) )
646 {
647 Perl_warn(aTHX_ "Variable \"%c%s\" is not imported",
648 sv_type == SVt_PVAV ? '@' :
649 sv_type == SVt_PVHV ? '%' : '$',
650 name);
651 if (GvCVu(*gvp))
652 Perl_warn(aTHX_ "\t(Did you mean &%s instead?)\n", name);
653 stash = 0;
654 }
655 }
656 }
657 else
658 stash = CopSTASH(PL_curcop);
659 }
660 else
661 stash = PL_defstash;
662 }
663
664 /* By this point we should have a stash and a name */
665
666 if (!stash) {
667 if (add) {
668 qerror(Perl_mess(aTHX_
669 "Global symbol \"%s%s\" requires explicit package name",
670 (sv_type == SVt_PV ? "$"
671 : sv_type == SVt_PVAV ? "@"
672 : sv_type == SVt_PVHV ? "%"
673 : ""), name));
674 stash = PL_nullstash;
675 }
676 else
677 return Nullgv;
678 }
679
680 if (!SvREFCNT(stash)) /* symbol table under destruction */
681 return Nullgv;
682
683 gvp = (GV**)hv_fetch(stash,name,len,add);
684 if (!gvp || *gvp == (GV*)&PL_sv_undef)
685 return Nullgv;
686 gv = *gvp;
687 if (SvTYPE(gv) == SVt_PVGV) {
688 if (add) {
689 GvMULTI_on(gv);
690 gv_init_sv(gv, sv_type);
691 }
692 return gv;
693 } else if (add & GV_NOINIT) {
694 return gv;
695 }
696
697 /* Adding a new symbol */
698
699 if (add & GV_ADDWARN && ckWARN_d(WARN_INTERNAL))
700 Perl_warner(aTHX_ WARN_INTERNAL, "Had to create %s unexpectedly", nambeg);
701 gv_init(gv, stash, name, len, add & GV_ADDMULTI);
702 gv_init_sv(gv, sv_type);
703
704 if (isLEXWARN_on && isALPHA(name[0]) && ! ckWARN(WARN_ONCE))
705 GvMULTI_on(gv) ;
706
707 /* set up magic where warranted */
708 switch (*name) {
709 case 'A':
710 if (strEQ(name, "ARGV")) {
711 IoFLAGS(GvIOn(gv)) |= IOf_ARGV|IOf_START;
712 }
713 break;
714 case 'E':
715 if (strnEQ(name, "EXPORT", 6))
716 GvMULTI_on(gv);
717 break;
718 case 'I':
719 if (strEQ(name, "ISA")) {
720 AV* av = GvAVn(gv);
721 GvMULTI_on(gv);
722 sv_magic((SV*)av, (SV*)gv, 'I', Nullch, 0);
723 /* NOTE: No support for tied ISA */
724 if ((add & GV_ADDMULTI) && strEQ(nambeg,"AnyDBM_File::ISA")
725 && AvFILLp(av) == -1)
726 {
727 char *pname;
728 av_push(av, newSVpvn(pname = "NDBM_File",9));
729 gv_stashpvn(pname, 9, TRUE);
730 av_push(av, newSVpvn(pname = "DB_File",7));
731 gv_stashpvn(pname, 7, TRUE);
732 av_push(av, newSVpvn(pname = "GDBM_File",9));
733 gv_stashpvn(pname, 9, TRUE);
734 av_push(av, newSVpvn(pname = "SDBM_File",9));
735 gv_stashpvn(pname, 9, TRUE);
736 av_push(av, newSVpvn(pname = "ODBM_File",9));
737 gv_stashpvn(pname, 9, TRUE);
738 }
739 }
740 break;
741 case 'O':
742 if (strEQ(name, "OVERLOAD")) {
743 HV* hv = GvHVn(gv);
744 GvMULTI_on(gv);
745 hv_magic(hv, Nullgv, 'A');
746 }
747 break;
748 case 'S':
749 if (strEQ(name, "SIG")) {
750 HV *hv;
751 I32 i;
752 if (!PL_psig_ptr) {
753 int sig_num[] = { SIG_NUM };
754 New(73, PL_psig_ptr, sizeof(sig_num)/sizeof(*sig_num), SV*);
755 New(73, PL_psig_name, sizeof(sig_num)/sizeof(*sig_num), SV*);
756 }
757 GvMULTI_on(gv);
758 hv = GvHVn(gv);
759 hv_magic(hv, Nullgv, 'S');
760 for (i = 1; PL_sig_name[i]; i++) {
761 SV ** init;
762 init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1);
763 if (init)
764 sv_setsv(*init, &PL_sv_undef);
765 PL_psig_ptr[i] = 0;
766 PL_psig_name[i] = 0;
767 }
768 }
769 break;
770 case 'V':
771 if (strEQ(name, "VERSION"))
772 GvMULTI_on(gv);
773 break;
774
775 case '&':
776 if (len > 1)
777 break;
778 PL_sawampersand = TRUE;
779 goto ro_magicalize;
780
781 case '`':
782 if (len > 1)
783 break;
784 PL_sawampersand = TRUE;
785 goto ro_magicalize;
786
787 case '\'':
788 if (len > 1)
789 break;
790 PL_sawampersand = TRUE;
791 goto ro_magicalize;
792
793 case ':':
794 if (len > 1)
795 break;
796 sv_setpv(GvSV(gv),PL_chopset);
797 goto magicalize;
798
799 case '?':
800 if (len > 1)
801 break;
802#ifdef COMPLEX_STATUS
803 (void)SvUPGRADE(GvSV(gv), SVt_PVLV);
804#endif
805 goto magicalize;
806
807 case '!':
808 if (len > 1)
809 break;
810 if (sv_type > SVt_PV && PL_curcop != &PL_compiling) {
811 HV* stash = gv_stashpvn("Errno",5,FALSE);
812 if (!stash || !(gv_fetchmethod(stash, "TIEHASH"))) {
813 dSP;
814 PUTBACK;
815 require_pv("Errno.pm");
816 SPAGAIN;
817 stash = gv_stashpvn("Errno",5,FALSE);
818 if (!stash || !(gv_fetchmethod(stash, "TIEHASH")))
819 Perl_croak(aTHX_ "Can't use %%! because Errno.pm is not available");
820 }
821 }
822 goto magicalize;
823 case '-':
824 if (len > 1)
825 break;
826 else {
827 AV* av = GvAVn(gv);
828 sv_magic((SV*)av, Nullsv, 'D', Nullch, 0);
829 SvREADONLY_on(av);
830 }
831 goto magicalize;
832 case '#':
833 case '*':
834 if (ckWARN(WARN_DEPRECATED) && len == 1 && sv_type == SVt_PV)
835 Perl_warner(aTHX_ WARN_DEPRECATED, "Use of $%s is deprecated", name);
836 /* FALL THROUGH */
837 case '[':
838 case '^':
839 case '~':
840 case '=':
841 case '%':
842 case '.':
843 case '(':
844 case ')':
845 case '<':
846 case '>':
847 case ',':
848 case '\\':
849 case '/':
850 case '\001': /* $^A */
851 case '\003': /* $^C */
852 case '\004': /* $^D */
853 case '\005': /* $^E */
854 case '\006': /* $^F */
855 case '\010': /* $^H */
856 case '\011': /* $^I, NOT \t in EBCDIC */
857 case '\020': /* $^P */
858 case '\024': /* $^T */
859 if (len > 1)
860 break;
861 goto magicalize;
862 case '|':
863 if (len > 1)
864 break;
865 sv_setiv(GvSV(gv), (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0);
866 goto magicalize;
867 case '\017': /* $^O & $^OPEN */
868 if (len > 1 && strNE(name, "\017PEN"))
869 break;
870 goto magicalize;
871 case '\023': /* $^S */
872 if (len > 1)
873 break;
874 goto ro_magicalize;
875 case '\027': /* $^W & $^WARNING_BITS */
876 if (len > 1 && strNE(name, "\027ARNING_BITS")
877 && strNE(name, "\027IDE_SYSTEM_CALLS"))
878 break;
879 goto magicalize;
880
881 case '+':
882 if (len > 1)
883 break;
884 else {
885 AV* av = GvAVn(gv);
886 sv_magic((SV*)av, (SV*)av, 'D', Nullch, 0);
887 SvREADONLY_on(av);
888 }
889 /* FALL THROUGH */
890 case '1':
891 case '2':
892 case '3':
893 case '4':
894 case '5':
895 case '6':
896 case '7':
897 case '8':
898 case '9':
899 ro_magicalize:
900 SvREADONLY_on(GvSV(gv));
901 magicalize:
902 sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
903 break;
904
905 case '\014': /* $^L */
906 if (len > 1)
907 break;
908 sv_setpv(GvSV(gv),"\f");
909 PL_formfeed = GvSV(gv);
910 break;
911 case ';':
912 if (len > 1)
913 break;
914 sv_setpv(GvSV(gv),"\034");
915 break;
916 case ']':
917 if (len == 1) {
918 SV *sv = GvSV(gv);
919 (void)SvUPGRADE(sv, SVt_PVNV);
920 Perl_sv_setpvf(aTHX_ sv,
921#if defined(PERL_SUBVERSION) && (PERL_SUBVERSION > 0)
922 "%8.6"
923#else
924 "%5.3"
925#endif
926 NVff,
927 SvNVX(PL_patchlevel));
928 SvNVX(sv) = SvNVX(PL_patchlevel);
929 SvNOK_on(sv);
930 SvREADONLY_on(sv);
931 }
932 break;
933 case '\026': /* $^V */
934 if (len == 1) {
935 SV *sv = GvSV(gv);
936 GvSV(gv) = SvREFCNT_inc(PL_patchlevel);
937 SvREFCNT_dec(sv);
938 }
939 break;
940 }
941 return gv;
942}
943
944void
945Perl_gv_fullname4(pTHX_ SV *sv, GV *gv, const char *prefix, bool keepmain)
946{
947 HV *hv = GvSTASH(gv);
948 if (!hv) {
949 (void)SvOK_off(sv);
950 return;
951 }
952 sv_setpv(sv, prefix ? prefix : "");
953 if (keepmain || strNE(HvNAME(hv), "main")) {
954 sv_catpv(sv,HvNAME(hv));
955 sv_catpvn(sv,"::", 2);
956 }
957 sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
958}
959
960void
961Perl_gv_fullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
962{
963 HV *hv = GvSTASH(gv);
964 if (!hv) {
965 (void)SvOK_off(sv);
966 return;
967 }
968 sv_setpv(sv, prefix ? prefix : "");
969 sv_catpv(sv,HvNAME(hv));
970 sv_catpvn(sv,"::", 2);
971 sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
972}
973
974void
975Perl_gv_efullname4(pTHX_ SV *sv, GV *gv, const char *prefix, bool keepmain)
976{
977 GV *egv = GvEGV(gv);
978 if (!egv)
979 egv = gv;
980 gv_fullname4(sv, egv, prefix, keepmain);
981}
982
983void
984Perl_gv_efullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
985{
986 GV *egv = GvEGV(gv);
987 if (!egv)
988 egv = gv;
989 gv_fullname3(sv, egv, prefix);
990}
991
992/* XXX compatibility with versions <= 5.003. */
993void
994Perl_gv_fullname(pTHX_ SV *sv, GV *gv)
995{
996 gv_fullname3(sv, gv, sv == (SV*)gv ? "*" : "");
997}
998
999/* XXX compatibility with versions <= 5.003. */
1000void
1001Perl_gv_efullname(pTHX_ SV *sv, GV *gv)
1002{
1003 gv_efullname3(sv, gv, sv == (SV*)gv ? "*" : "");
1004}
1005
1006IO *
1007Perl_newIO(pTHX)
1008{
1009 IO *io;
1010 GV *iogv;
1011
1012 io = (IO*)NEWSV(0,0);
1013 sv_upgrade((SV *)io,SVt_PVIO);
1014 SvREFCNT(io) = 1;
1015 SvOBJECT_on(io);
1016 iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV);
1017 /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */
1018 if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv))))
1019 iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV);
1020 SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv));
1021 return io;
1022}
1023
1024void
1025Perl_gv_check(pTHX_ HV *stash)
1026{
1027 register HE *entry;
1028 register I32 i;
1029 register GV *gv;
1030 HV *hv;
1031
1032 if (!HvARRAY(stash))
1033 return;
1034 for (i = 0; i <= (I32) HvMAX(stash); i++) {
1035 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
1036 if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
1037 (gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)) && HvNAME(hv))
1038 {
1039 if (hv != PL_defstash && hv != stash)
1040 gv_check(hv); /* nested package */
1041 }
1042 else if (isALPHA(*HeKEY(entry))) {
1043 char *file;
1044 gv = (GV*)HeVAL(entry);
1045 if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
1046 continue;
1047 file = GvFILE(gv);
1048 /* performance hack: if filename is absolute and it's a standard
1049 * module, don't bother warning */
1050 if (file
1051 && PERL_FILE_IS_ABSOLUTE(file)
1052 && (instr(file, "/lib/") || instr(file, ".pm")))
1053 {
1054 continue;
1055 }
1056 CopLINE_set(PL_curcop, GvLINE(gv));
1057#ifdef USE_ITHREADS
1058 CopFILE(PL_curcop) = file; /* set for warning */
1059#else
1060 CopFILEGV(PL_curcop) = gv_fetchfile(file);
1061#endif
1062 Perl_warner(aTHX_ WARN_ONCE,
1063 "Name \"%s::%s\" used only once: possible typo",
1064 HvNAME(stash), GvNAME(gv));
1065 }
1066 }
1067 }
1068}
1069
1070GV *
1071Perl_newGVgen(pTHX_ char *pack)
1072{
1073 return gv_fetchpv(Perl_form(aTHX_ "%s::_GEN_%ld", pack, (long)PL_gensym++),
1074 TRUE, SVt_PVGV);
1075}
1076
1077/* hopefully this is only called on local symbol table entries */
1078
1079GP*
1080Perl_gp_ref(pTHX_ GP *gp)
1081{
1082 if (!gp)
1083 return (GP*)NULL;
1084 gp->gp_refcnt++;
1085 if (gp->gp_cv) {
1086 if (gp->gp_cvgen) {
1087 /* multi-named GPs cannot be used for method cache */
1088 SvREFCNT_dec(gp->gp_cv);
1089 gp->gp_cv = Nullcv;
1090 gp->gp_cvgen = 0;
1091 }
1092 else {
1093 /* Adding a new name to a subroutine invalidates method cache */
1094 PL_sub_generation++;
1095 }
1096 }
1097 return gp;
1098}
1099
1100void
1101Perl_gp_free(pTHX_ GV *gv)
1102{
1103 GP* gp;
1104
1105 if (!gv || !(gp = GvGP(gv)))
1106 return;
1107 if (gp->gp_refcnt == 0) {
1108 if (ckWARN_d(WARN_INTERNAL))
1109 Perl_warner(aTHX_ WARN_INTERNAL,
1110 "Attempt to free unreferenced glob pointers");
1111 return;
1112 }
1113 if (gp->gp_cv) {
1114 /* Deleting the name of a subroutine invalidates method cache */
1115 PL_sub_generation++;
1116 }
1117 if (--gp->gp_refcnt > 0) {
1118 if (gp->gp_egv == gv)
1119 gp->gp_egv = 0;
1120 return;
1121 }
1122
1123 SvREFCNT_dec(gp->gp_sv);
1124 SvREFCNT_dec(gp->gp_av);
1125 SvREFCNT_dec(gp->gp_hv);
1126 SvREFCNT_dec(gp->gp_io);
1127 SvREFCNT_dec(gp->gp_cv);
1128 SvREFCNT_dec(gp->gp_form);
1129
1130 Safefree(gp);
1131 GvGP(gv) = 0;
1132}
1133
1134#if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
1135#define MICROPORT
1136#endif
1137
1138#ifdef MICROPORT /* Microport 2.4 hack */
1139AV *GvAVn(gv)
1140register GV *gv;
1141{
1142 if (GvGP(gv)->gp_av)
1143 return GvGP(gv)->gp_av;
1144 else
1145 return GvGP(gv_AVadd(gv))->gp_av;
1146}
1147
1148HV *GvHVn(gv)
1149register GV *gv;
1150{
1151 if (GvGP(gv)->gp_hv)
1152 return GvGP(gv)->gp_hv;
1153 else
1154 return GvGP(gv_HVadd(gv))->gp_hv;
1155}
1156#endif /* Microport 2.4 hack */
1157
1158int
1159Perl_magic_freeovrld(pTHX_ SV *sv, MAGIC *mg)
1160{
1161 AMT *amtp = (AMT*)mg->mg_ptr;
1162 if (amtp && AMT_AMAGIC(amtp)) {
1163 int i;
1164 for (i = 1; i < NofAMmeth; i++) {
1165 CV *cv = amtp->table[i];
1166 if (cv != Nullcv) {
1167 SvREFCNT_dec((SV *) cv);
1168 amtp->table[i] = Nullcv;
1169 }
1170 }
1171 }
1172 return 0;
1173}
1174
1175/* Updates and caches the CV's */
1176
1177bool
1178Perl_Gv_AMupdate(pTHX_ HV *stash)
1179{
1180 GV* gv;
1181 CV* cv;
1182 MAGIC* mg=mg_find((SV*)stash,'c');
1183 AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL;
1184 AMT amt;
1185 STRLEN n_a;
1186
1187 if (mg && amtp->was_ok_am == PL_amagic_generation
1188 && amtp->was_ok_sub == PL_sub_generation)
1189 return AMT_OVERLOADED(amtp);
1190 sv_unmagic((SV*)stash, 'c');
1191
1192 DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME(stash)) );
1193
1194 Zero(&amt,1,AMT);
1195 amt.was_ok_am = PL_amagic_generation;
1196 amt.was_ok_sub = PL_sub_generation;
1197 amt.fallback = AMGfallNO;
1198 amt.flags = 0;
1199
1200 {
1201 int filled = 0, have_ovl = 0;
1202 int i, lim = 1;
1203 const char *cp;
1204 SV* sv = NULL;
1205
1206 /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
1207
1208 /* Try to find via inheritance. */
1209 gv = gv_fetchmeth(stash, PL_AMG_names[0], 2, -1);
1210 if (gv)
1211 sv = GvSV(gv);
1212
1213 if (!gv)
1214 lim = DESTROY_amg; /* Skip overloading entries. */
1215 else if (SvTRUE(sv))
1216 amt.fallback=AMGfallYES;
1217 else if (SvOK(sv))
1218 amt.fallback=AMGfallNEVER;
1219
1220 for (i = 1; i < lim; i++)
1221 amt.table[i] = Nullcv;
1222 for (; i < NofAMmeth; i++) {
1223 char *cooky = (char*)PL_AMG_names[i];
1224 /* Human-readable form, for debugging: */
1225 char *cp = (i >= DESTROY_amg ? cooky : AMG_id2name(i));
1226 STRLEN l = strlen(cooky);
1227
1228 DEBUG_o( Perl_deb(aTHX_ "Checking overloading of `%s' in package `%.256s'\n",
1229 cp, HvNAME(stash)) );
1230 /* don't fill the cache while looking up! */
1231 gv = gv_fetchmeth(stash, cooky, l, -1);
1232 cv = 0;
1233 if (gv && (cv = GvCV(gv))) {
1234 if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
1235 && strEQ(HvNAME(GvSTASH(CvGV(cv))), "overload")) {
1236 /* GvSV contains the name of the method. */
1237 GV *ngv;
1238
1239 DEBUG_o( Perl_deb(aTHX_ "Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n",
1240 SvPV(GvSV(gv), n_a), cp, HvNAME(stash)) );
1241 if (!SvPOK(GvSV(gv))
1242 || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
1243 FALSE)))
1244 {
1245 /* Can be an import stub (created by `can'). */
1246 if (GvCVGEN(gv)) {
1247 Perl_croak(aTHX_ "Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'",
1248 (SvPOK(GvSV(gv)) ? SvPVX(GvSV(gv)) : "???" ),
1249 cp, HvNAME(stash));
1250 } else
1251 Perl_croak(aTHX_ "Can't resolve method `%.256s' overloading `%s' in package `%.256s'",
1252 (SvPOK(GvSV(gv)) ? SvPVX(GvSV(gv)) : "???" ),
1253 cp, HvNAME(stash));
1254 }
1255 cv = GvCV(gv = ngv);
1256 }
1257 DEBUG_o( Perl_deb(aTHX_ "Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
1258 cp, HvNAME(stash), HvNAME(GvSTASH(CvGV(cv))),
1259 GvNAME(CvGV(cv))) );
1260 filled = 1;
1261 if (i < DESTROY_amg)
1262 have_ovl = 1;
1263 }
1264 amt.table[i]=(CV*)SvREFCNT_inc(cv);
1265 }
1266 if (filled) {
1267 AMT_AMAGIC_on(&amt);
1268 if (have_ovl)
1269 AMT_OVERLOADED_on(&amt);
1270 sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMT));
1271 return have_ovl;
1272 }
1273 }
1274 /* Here we have no table: */
1275 no_table:
1276 AMT_AMAGIC_off(&amt);
1277 sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMTS));
1278 return FALSE;
1279}
1280
1281
1282CV*
1283Perl_gv_handler(pTHX_ HV *stash, I32 id)
1284{
1285 dTHR;
1286 MAGIC *mg;
1287 AMT *amtp;
1288
1289 if (!stash)
1290 return Nullcv;
1291 mg = mg_find((SV*)stash,'c');
1292 if (!mg) {
1293 do_update:
1294 Gv_AMupdate(stash);
1295 mg = mg_find((SV*)stash,'c');
1296 }
1297 amtp = (AMT*)mg->mg_ptr;
1298 if ( amtp->was_ok_am != PL_amagic_generation
1299 || amtp->was_ok_sub != PL_sub_generation )
1300 goto do_update;
1301 if (AMT_AMAGIC(amtp))
1302 return amtp->table[id];
1303 return Nullcv;
1304}
1305
1306
1307SV*
1308Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
1309{
1310 MAGIC *mg;
1311 CV *cv;
1312 CV **cvp=NULL, **ocvp=NULL;
1313 AMT *amtp, *oamtp;
1314 int fl=0, off, off1, lr=0, assign=AMGf_assign & flags, notfound=0;
1315 int postpr = 0, force_cpy = 0, assignshift = assign ? 1 : 0;
1316 HV* stash;
1317 if (!(AMGf_noleft & flags) && SvAMAGIC(left)
1318 && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c'))
1319 && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1320 ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
1321 : (CV **) NULL))
1322 && ((cv = cvp[off=method+assignshift])
1323 || (assign && amtp->fallback > AMGfallNEVER && /* fallback to
1324 * usual method */
1325 (fl = 1, cv = cvp[off=method])))) {
1326 lr = -1; /* Call method for left argument */
1327 } else {
1328 if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
1329 int logic;
1330
1331 /* look for substituted methods */
1332 /* In all the covered cases we should be called with assign==0. */
1333 switch (method) {
1334 case inc_amg:
1335 force_cpy = 1;
1336 if ((cv = cvp[off=add_ass_amg])
1337 || ((cv = cvp[off = add_amg]) && (force_cpy = 0, postpr = 1))) {
1338 right = &PL_sv_yes; lr = -1; assign = 1;
1339 }
1340 break;
1341 case dec_amg:
1342 force_cpy = 1;
1343 if ((cv = cvp[off = subtr_ass_amg])
1344 || ((cv = cvp[off = subtr_amg]) && (force_cpy = 0, postpr=1))) {
1345 right = &PL_sv_yes; lr = -1; assign = 1;
1346 }
1347 break;
1348 case bool__amg:
1349 (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]));
1350 break;
1351 case numer_amg:
1352 (void)((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]));
1353 break;
1354 case string_amg:
1355 (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
1356 break;
1357 case not_amg:
1358 (void)((cv = cvp[off=bool__amg])
1359 || (cv = cvp[off=numer_amg])
1360 || (cv = cvp[off=string_amg]));
1361 postpr = 1;
1362 break;
1363 case copy_amg:
1364 {
1365 /*
1366 * SV* ref causes confusion with the interpreter variable of
1367 * the same name
1368 */
1369 SV* tmpRef=SvRV(left);
1370 if (!SvROK(tmpRef) && SvTYPE(tmpRef) <= SVt_PVMG) {
1371 /*
1372 * Just to be extra cautious. Maybe in some
1373 * additional cases sv_setsv is safe, too.
1374 */
1375 SV* newref = newSVsv(tmpRef);
1376 SvOBJECT_on(newref);
1377 SvSTASH(newref) = (HV*)SvREFCNT_inc(SvSTASH(tmpRef));
1378 return newref;
1379 }
1380 }
1381 break;
1382 case abs_amg:
1383 if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
1384 && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
1385 SV* nullsv=sv_2mortal(newSViv(0));
1386 if (off1==lt_amg) {
1387 SV* lessp = amagic_call(left,nullsv,
1388 lt_amg,AMGf_noright);
1389 logic = SvTRUE(lessp);
1390 } else {
1391 SV* lessp = amagic_call(left,nullsv,
1392 ncmp_amg,AMGf_noright);
1393 logic = (SvNV(lessp) < 0);
1394 }
1395 if (logic) {
1396 if (off==subtr_amg) {
1397 right = left;
1398 left = nullsv;
1399 lr = 1;
1400 }
1401 } else {
1402 return left;
1403 }
1404 }
1405 break;
1406 case neg_amg:
1407 if ((cv = cvp[off=subtr_amg])) {
1408 right = left;
1409 left = sv_2mortal(newSViv(0));
1410 lr = 1;
1411 }
1412 break;
1413 case iter_amg: /* XXXX Eventually should do to_gv. */
1414 /* FAIL safe */
1415 return NULL; /* Delegate operation to standard mechanisms. */
1416 break;
1417 case to_sv_amg:
1418 case to_av_amg:
1419 case to_hv_amg:
1420 case to_gv_amg:
1421 case to_cv_amg:
1422 /* FAIL safe */
1423 return left; /* Delegate operation to standard mechanisms. */
1424 break;
1425 default:
1426 goto not_found;
1427 }
1428 if (!cv) goto not_found;
1429 } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
1430 && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(right))),'c'))
1431 && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1432 ? (amtp = (AMT*)mg->mg_ptr)->table
1433 : (CV **) NULL))
1434 && (cv = cvp[off=method])) { /* Method for right
1435 * argument found */
1436 lr=1;
1437 } else if (((ocvp && oamtp->fallback > AMGfallNEVER
1438 && (cvp=ocvp) && (lr = -1))
1439 || (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
1440 && !(flags & AMGf_unary)) {
1441 /* We look for substitution for
1442 * comparison operations and
1443 * concatenation */
1444 if (method==concat_amg || method==concat_ass_amg
1445 || method==repeat_amg || method==repeat_ass_amg) {
1446 return NULL; /* Delegate operation to string conversion */
1447 }
1448 off = -1;
1449 switch (method) {
1450 case lt_amg:
1451 case le_amg:
1452 case gt_amg:
1453 case ge_amg:
1454 case eq_amg:
1455 case ne_amg:
1456 postpr = 1; off=ncmp_amg; break;
1457 case slt_amg:
1458 case sle_amg:
1459 case sgt_amg:
1460 case sge_amg:
1461 case seq_amg:
1462 case sne_amg:
1463 postpr = 1; off=scmp_amg; break;
1464 }
1465 if (off != -1) cv = cvp[off];
1466 if (!cv) {
1467 goto not_found;
1468 }
1469 } else {
1470 not_found: /* No method found, either report or croak */
1471 switch (method) {
1472 case to_sv_amg:
1473 case to_av_amg:
1474 case to_hv_amg:
1475 case to_gv_amg:
1476 case to_cv_amg:
1477 /* FAIL safe */
1478 return left; /* Delegate operation to standard mechanisms. */
1479 break;
1480 }
1481 if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
1482 notfound = 1; lr = -1;
1483 } else if (cvp && (cv=cvp[nomethod_amg])) {
1484 notfound = 1; lr = 1;
1485 } else {
1486 SV *msg;
1487 if (off==-1) off=method;
1488 msg = sv_2mortal(Perl_newSVpvf(aTHX_
1489 "Operation `%s': no method found,%sargument %s%s%s%s",
1490 AMG_id2name(method + assignshift),
1491 (flags & AMGf_unary ? " " : "\n\tleft "),
1492 SvAMAGIC(left)?
1493 "in overloaded package ":
1494 "has no overloaded magic",
1495 SvAMAGIC(left)?
1496 HvNAME(SvSTASH(SvRV(left))):
1497 "",
1498 SvAMAGIC(right)?
1499 ",\n\tright argument in overloaded package ":
1500 (flags & AMGf_unary
1501 ? ""
1502 : ",\n\tright argument has no overloaded magic"),
1503 SvAMAGIC(right)?
1504 HvNAME(SvSTASH(SvRV(right))):
1505 ""));
1506 if (amtp && amtp->fallback >= AMGfallYES) {
1507 DEBUG_o( Perl_deb(aTHX_ "%s", SvPVX(msg)) );
1508 } else {
1509 Perl_croak(aTHX_ "%"SVf, msg);
1510 }
1511 return NULL;
1512 }
1513 force_cpy = force_cpy || assign;
1514 }
1515 }
1516 if (!notfound) {
1517 DEBUG_o( Perl_deb(aTHX_
1518 "Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
1519 AMG_id2name(off),
1520 method+assignshift==off? "" :
1521 " (initially `",
1522 method+assignshift==off? "" :
1523 AMG_id2name(method+assignshift),
1524 method+assignshift==off? "" : "')",
1525 flags & AMGf_unary? "" :
1526 lr==1 ? " for right argument": " for left argument",
1527 flags & AMGf_unary? " for argument" : "",
1528 HvNAME(stash),
1529 fl? ",\n\tassignment variant used": "") );
1530 }
1531 /* Since we use shallow copy during assignment, we need
1532 * to dublicate the contents, probably calling user-supplied
1533 * version of copy operator
1534 */
1535 /* We need to copy in following cases:
1536 * a) Assignment form was called.
1537 * assignshift==1, assign==T, method + 1 == off
1538 * b) Increment or decrement, called directly.
1539 * assignshift==0, assign==0, method + 0 == off
1540 * c) Increment or decrement, translated to assignment add/subtr.
1541 * assignshift==0, assign==T,
1542 * force_cpy == T
1543 * d) Increment or decrement, translated to nomethod.
1544 * assignshift==0, assign==0,
1545 * force_cpy == T
1546 * e) Assignment form translated to nomethod.
1547 * assignshift==1, assign==T, method + 1 != off
1548 * force_cpy == T
1549 */
1550 /* off is method, method+assignshift, or a result of opcode substitution.
1551 * In the latter case assignshift==0, so only notfound case is important.
1552 */
1553 if (( (method + assignshift == off)
1554 && (assign || (method == inc_amg) || (method == dec_amg)))
1555 || force_cpy)
1556 RvDEEPCP(left);
1557 {
1558 dSP;
1559 BINOP myop;
1560 SV* res;
1561 bool oldcatch = CATCH_GET;
1562
1563 CATCH_SET(TRUE);
1564 Zero(&myop, 1, BINOP);
1565 myop.op_last = (OP *) &myop;
1566 myop.op_next = Nullop;
1567 myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
1568
1569 PUSHSTACKi(PERLSI_OVERLOAD);
1570 ENTER;
1571 SAVEOP();
1572 PL_op = (OP *) &myop;
1573 if (PERLDB_SUB && PL_curstash != PL_debstash)
1574 PL_op->op_private |= OPpENTERSUB_DB;
1575 PUTBACK;
1576 pp_pushmark();
1577
1578 EXTEND(SP, notfound + 5);
1579 PUSHs(lr>0? right: left);
1580 PUSHs(lr>0? left: right);
1581 PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no ));
1582 if (notfound) {
1583 PUSHs( sv_2mortal(newSVpv(AMG_id2name(method + assignshift),0)));
1584 }
1585 PUSHs((SV*)cv);
1586 PUTBACK;
1587
1588 if ((PL_op = Perl_pp_entersub(aTHX)))
1589 CALLRUNOPS(aTHX);
1590 LEAVE;
1591 SPAGAIN;
1592
1593 res=POPs;
1594 PUTBACK;
1595 POPSTACK;
1596 CATCH_SET(oldcatch);
1597
1598 if (postpr) {
1599 int ans;
1600 switch (method) {
1601 case le_amg:
1602 case sle_amg:
1603 ans=SvIV(res)<=0; break;
1604 case lt_amg:
1605 case slt_amg:
1606 ans=SvIV(res)<0; break;
1607 case ge_amg:
1608 case sge_amg:
1609 ans=SvIV(res)>=0; break;
1610 case gt_amg:
1611 case sgt_amg:
1612 ans=SvIV(res)>0; break;
1613 case eq_amg:
1614 case seq_amg:
1615 ans=SvIV(res)==0; break;
1616 case ne_amg:
1617 case sne_amg:
1618 ans=SvIV(res)!=0; break;
1619 case inc_amg:
1620 case dec_amg:
1621 SvSetSV(left,res); return left;
1622 case not_amg:
1623 ans=!SvTRUE(res); break;
1624 }
1625 return boolSV(ans);
1626 } else if (method==copy_amg) {
1627 if (!SvROK(res)) {
1628 Perl_croak(aTHX_ "Copy method did not return a reference");
1629 }
1630 return SvREFCNT_inc(SvRV(res));
1631 } else {
1632 return res;
1633 }
1634 }
1635}
1636
1637/*
1638=for apidoc is_gv_magical
1639
1640Returns C<TRUE> if given the name of a magical GV.
1641
1642Currently only useful internally when determining if a GV should be
1643created even in rvalue contexts.
1644
1645C<flags> is not used at present but available for future extension to
1646allow selecting particular classes of magical variable.
1647
1648=cut
1649*/
1650bool
1651Perl_is_gv_magical(pTHX_ char *name, STRLEN len, U32 flags)
1652{
1653 if (!len)
1654 return FALSE;
1655
1656 switch (*name) {
1657 case 'I':
1658 if (len == 3 && strEQ(name, "ISA"))
1659 goto yes;
1660 break;
1661 case 'O':
1662 if (len == 8 && strEQ(name, "OVERLOAD"))
1663 goto yes;
1664 break;
1665 case 'S':
1666 if (len == 3 && strEQ(name, "SIG"))
1667 goto yes;
1668 break;
1669 case '\017': /* $^O & $^OPEN */
1670 if (len == 1
1671 || (len == 4 && strEQ(name, "\027PEN")))
1672 {
1673 goto yes;
1674 }
1675 break;
1676 case '\027': /* $^W & $^WARNING_BITS */
1677 if (len == 1
1678 || (len == 12 && strEQ(name, "\027ARNING_BITS"))
1679 || (len == 17 && strEQ(name, "\027IDE_SYSTEM_CALLS")))
1680 {
1681 goto yes;
1682 }
1683 break;
1684
1685 case '&':
1686 case '`':
1687 case '\'':
1688 case ':':
1689 case '?':
1690 case '!':
1691 case '-':
1692 case '#':
1693 case '*':
1694 case '[':
1695 case '^':
1696 case '~':
1697 case '=':
1698 case '%':
1699 case '.':
1700 case '(':
1701 case ')':
1702 case '<':
1703 case '>':
1704 case ',':
1705 case '\\':
1706 case '/':
1707 case '|':
1708 case '+':
1709 case ';':
1710 case ']':
1711 case '\001': /* $^A */
1712 case '\003': /* $^C */
1713 case '\004': /* $^D */
1714 case '\005': /* $^E */
1715 case '\006': /* $^F */
1716 case '\010': /* $^H */
1717 case '\011': /* $^I, NOT \t in EBCDIC */
1718 case '\014': /* $^L */
1719 case '\020': /* $^P */
1720 case '\023': /* $^S */
1721 case '\024': /* $^T */
1722 case '\026': /* $^V */
1723 if (len == 1)
1724 goto yes;
1725 break;
1726 case '1':
1727 case '2':
1728 case '3':
1729 case '4':
1730 case '5':
1731 case '6':
1732 case '7':
1733 case '8':
1734 case '9':
1735 if (len > 1) {
1736 char *end = name + len;
1737 while (--end > name) {
1738 if (!isDIGIT(*end))
1739 return FALSE;
1740 }
1741 }
1742 yes:
1743 return TRUE;
1744 default:
1745 break;
1746 }
1747 return FALSE;
1748}