1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#include "EXTERN.h"
34#define PERL_IN_GV_C
35#include "perl.h"
36
37static const char S_autoload[] = "AUTOLOAD";
38static const STRLEN S_autolen = sizeof(S_autoload)-1;
39
40
41#ifdef PERL_DONT_CREATE_GVSV
42GV *
43Perl_gv_SVadd(pTHX_ GV *gv)
44{
45 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
46 Perl_croak(aTHX_ "Bad symbol for scalar");
47 if (!GvSV(gv))
48 GvSV(gv) = newSV(0);
49 return gv;
50}
51#endif
52
53GV *
54Perl_gv_AVadd(pTHX_ register GV *gv)
55{
56 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
57 Perl_croak(aTHX_ "Bad symbol for array");
58 if (!GvAV(gv))
59 GvAV(gv) = newAV();
60 return gv;
61}
62
63GV *
64Perl_gv_HVadd(pTHX_ register GV *gv)
65{
66 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
67 Perl_croak(aTHX_ "Bad symbol for hash");
68 if (!GvHV(gv))
69 GvHV(gv) = newHV();
70 return gv;
71}
72
73GV *
74Perl_gv_IOadd(pTHX_ register GV *gv)
75{
76 dVAR;
77 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV) {
78
79
80
81
82
83 const char * const fh =
84 PL_op->op_type == OP_READDIR ||
85 PL_op->op_type == OP_TELLDIR ||
86 PL_op->op_type == OP_SEEKDIR ||
87 PL_op->op_type == OP_REWINDDIR ||
88 PL_op->op_type == OP_CLOSEDIR ?
89 "dirhandle" : "filehandle";
90 Perl_croak(aTHX_ "Bad symbol for %s", fh);
91 }
92
93 if (!GvIOp(gv)) {
94#ifdef GV_UNIQUE_CHECK
95 if (GvUNIQUE(gv)) {
96 Perl_croak(aTHX_ "Bad symbol for filehandle (GV is unique)");
97 }
98#endif
99 GvIOp(gv) = newIO();
100 }
101 return gv;
102}
103
104GV *
105Perl_gv_fetchfile(pTHX_ const char *name)
106{
107 return gv_fetchfile_flags(name, strlen(name), 0);
108}
109
110GV *
111Perl_gv_fetchfile_flags(pTHX_ const char *const name, const STRLEN namelen,
112 const U32 flags)
113{
114 dVAR;
115 char smallbuf[128];
116 char *tmpbuf;
117 const STRLEN tmplen = namelen + 2;
118 GV *gv;
119
120 PERL_UNUSED_ARG(flags);
121
122 if (!PL_defstash)
123 return NULL;
124
125 if (tmplen <= sizeof smallbuf)
126 tmpbuf = smallbuf;
127 else
128 Newx(tmpbuf, tmplen, char);
129
130 tmpbuf[0] = '_';
131 tmpbuf[1] = '<';
132 memcpy(tmpbuf + 2, name, namelen);
133 gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE);
134 if (!isGV(gv)) {
135 gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE);
136#ifdef PERL_DONT_CREATE_GVSV
137 GvSV(gv) = newSVpvn(name, namelen);
138#else
139 sv_setpvn(GvSV(gv), name, namelen);
140#endif
141 if (PERLDB_LINE)
142 hv_magic(GvHVn(gv_AVadd(gv)), NULL, PERL_MAGIC_dbfile);
143 }
144 if (tmpbuf != smallbuf)
145 Safefree(tmpbuf);
146 return gv;
147}
148
149
150
151
152
153
154
155
156
157
158
159
160SV *
161Perl_gv_const_sv(pTHX_ GV *gv)
162{
163 if (SvTYPE(gv) == SVt_PVGV)
164 return cv_const_sv(GvCVu(gv));
165 return SvROK(gv) ? SvRV(gv) : NULL;
166}
167
168GP *
169Perl_newGP(pTHX_ GV *const gv)
170{
171 GP *gp;
172 const char *const file
173 = (PL_curcop && CopFILE(PL_curcop)) ? CopFILE(PL_curcop) : "";
174 STRLEN len = strlen(file);
175 U32 hash;
176
177 PERL_HASH(hash, file, len);
178
179 Newxz(gp, 1, GP);
180
181#ifndef PERL_DONT_CREATE_GVSV
182 gp->gp_sv = newSV(0);
183#endif
184
185 gp->gp_line = PL_curcop ? CopLINE(PL_curcop) : 0;
186
187
188 gp->gp_file_hek = share_hek(file, len, hash);
189 gp->gp_egv = gv;
190 gp->gp_refcnt = 1;
191
192 return gp;
193}
194
195void
196Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
197{
198 dVAR;
199 const U32 old_type = SvTYPE(gv);
200 const bool doproto = old_type > SVt_NULL;
201 const char * const proto = (doproto && SvPOK(gv)) ? SvPVX_const(gv) : NULL;
202 SV *const has_constant = doproto && SvROK(gv) ? SvRV(gv) : NULL;
203 const U32 exported_constant = has_constant ? SvPCS_IMPORTED(gv) : 0;
204
205 assert (!(proto && has_constant));
206
207 if (has_constant) {
208
209 switch (SvTYPE(has_constant)) {
210 case SVt_PVAV:
211 case SVt_PVHV:
212 case SVt_PVCV:
213 case SVt_PVFM:
214 case SVt_PVIO:
215 Perl_croak(aTHX_ "Cannot convert a reference to %s to typeglob",
216 sv_reftype(has_constant, 0));
217 default: NOOP;
218 }
219 SvRV_set(gv, NULL);
220 SvROK_off(gv);
221 }
222
223
224 if (old_type < SVt_PVGV) {
225 if (old_type >= SVt_PV)
226 SvCUR_set(gv, 0);
227 sv_upgrade((SV*)gv, SVt_PVGV);
228 }
229 if (SvLEN(gv)) {
230 if (proto) {
231 SvPV_set(gv, NULL);
232 SvLEN_set(gv, 0);
233 SvPOK_off(gv);
234 } else
235 Safefree(SvPVX_mutable(gv));
236 }
237 SvIOK_off(gv);
238 isGV_with_GP_on(gv);
239
240 GvGP(gv) = Perl_newGP(aTHX_ gv);
241 GvSTASH(gv) = stash;
242 if (stash)
243 Perl_sv_add_backref(aTHX_ (SV*)stash, (SV*)gv);
244 gv_name_set(gv, name, len, GV_ADD);
245 if (multi || doproto)
246 GvMULTI_on(gv);
247 if (doproto) {
248 ENTER;
249 if (has_constant) {
250
251 GvCV(gv) = newCONSTSUB(stash, name, has_constant);
252
253
254
255 if (exported_constant)
256 GvIMPORTED_CV_on(gv);
257 } else {
258 (void) start_subparse(0,0);
259 GvCV(gv) = PL_compcv;
260 }
261 LEAVE;
262
263 mro_method_changed_in(GvSTASH(gv));
264 CvGV(GvCV(gv)) = gv;
265 CvFILE_set_from_cop(GvCV(gv), PL_curcop);
266 CvSTASH(GvCV(gv)) = PL_curstash;
267 if (proto) {
268 sv_setpv((SV*)GvCV(gv), proto);
269 Safefree(proto);
270 }
271 }
272}
273
274STATIC void
275S_gv_init_sv(pTHX_ GV *gv, I32 sv_type)
276{
277 switch (sv_type) {
278 case SVt_PVIO:
279 (void)GvIOn(gv);
280 break;
281 case SVt_PVAV:
282 (void)GvAVn(gv);
283 break;
284 case SVt_PVHV:
285 (void)GvHVn(gv);
286 break;
287#ifdef PERL_DONT_CREATE_GVSV
288 case SVt_NULL:
289 case SVt_PVCV:
290 case SVt_PVFM:
291 case SVt_PVGV:
292 break;
293 default:
294 if(GvSVn(gv)) {
295
296
297
298 }
299#endif
300 }
301}
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326GV *
327Perl_gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level)
328{
329 dVAR;
330 GV** gvp;
331 AV* linear_av;
332 SV** linear_svp;
333 SV* linear_sv;
334 HV* cstash;
335 GV* candidate = NULL;
336 CV* cand_cv = NULL;
337 CV* old_cv;
338 GV* topgv = NULL;
339 const char *hvname;
340 I32 create = (level >= 0) ? 1 : 0;
341 I32 items;
342 STRLEN packlen;
343 U32 topgen_cmp;
344
345
346 if (!stash) {
347 create = 0;
348 if(!(stash = gv_stashpvs("UNIVERSAL", 0)))
349 return 0;
350 }
351
352 assert(stash);
353
354 hvname = HvNAME_get(stash);
355 if (!hvname)
356 Perl_croak(aTHX_ "Can't use anonymous symbol table for method lookup");
357
358 assert(hvname);
359 assert(name);
360
361 DEBUG_o( Perl_deb(aTHX_ "Looking for method %s in package %s\n",name,hvname) );
362
363 topgen_cmp = HvMROMETA(stash)->cache_gen + PL_sub_generation;
364
365
366 gvp = (GV**)hv_fetch(stash, name, len, create);
367 if(gvp) {
368 topgv = *gvp;
369 assert(topgv);
370 if (SvTYPE(topgv) != SVt_PVGV)
371 gv_init(topgv, stash, name, len, TRUE);
372 if ((cand_cv = GvCV(topgv))) {
373
374 if (!GvCVGEN(topgv) || GvCVGEN(topgv) == topgen_cmp) {
375 return topgv;
376 }
377 else {
378
379 SvREFCNT_dec(cand_cv);
380 GvCV(topgv) = cand_cv = NULL;
381 GvCVGEN(topgv) = 0;
382 }
383 }
384 else if (GvCVGEN(topgv) == topgen_cmp) {
385
386 return 0;
387 }
388 }
389
390 packlen = HvNAMELEN_get(stash);
391 if (packlen >= 7 && strEQ(hvname + packlen - 7, "::SUPER")) {
392 HV* basestash;
393 packlen -= 7;
394 basestash = gv_stashpvn(hvname, packlen, GV_ADD);
395 linear_av = mro_get_linear_isa(basestash);
396 }
397 else {
398 linear_av = mro_get_linear_isa(stash);
399 }
400
401 linear_svp = AvARRAY(linear_av) + 1;
402 items = AvFILLp(linear_av);
403 while (items--) {
404 linear_sv = *linear_svp++;
405 assert(linear_sv);
406 cstash = gv_stashsv(linear_sv, 0);
407
408 if (!cstash) {
409 if (ckWARN(WARN_SYNTAX))
410 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Can't locate package %"SVf" for @%s::ISA",
411 SVfARG(linear_sv), hvname);
412 continue;
413 }
414
415 assert(cstash);
416
417 gvp = (GV**)hv_fetch(cstash, name, len, 0);
418 if (!gvp) continue;
419 candidate = *gvp;
420 assert(candidate);
421 if (SvTYPE(candidate) != SVt_PVGV) gv_init(candidate, cstash, name, len, TRUE);
422 if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
423
424
425
426
427
428 if (topgv && (GvREFCNT(topgv) == 1) && (CvROOT(cand_cv) || CvXSUB(cand_cv))) {
429 if ((old_cv = GvCV(topgv))) SvREFCNT_dec(old_cv);
430 SvREFCNT_inc_simple_void_NN(cand_cv);
431 GvCV(topgv) = cand_cv;
432 GvCVGEN(topgv) = topgen_cmp;
433 }
434 return candidate;
435 }
436 }
437
438
439 if(level == 0 || level == -1) {
440 candidate = gv_fetchmeth(NULL, name, len, 1);
441 if(candidate) {
442 cand_cv = GvCV(candidate);
443 if (topgv && (GvREFCNT(topgv) == 1) && (CvROOT(cand_cv) || CvXSUB(cand_cv))) {
444 if ((old_cv = GvCV(topgv))) SvREFCNT_dec(old_cv);
445 SvREFCNT_inc_simple_void_NN(cand_cv);
446 GvCV(topgv) = cand_cv;
447 GvCVGEN(topgv) = topgen_cmp;
448 }
449 return candidate;
450 }
451 }
452
453 if (topgv && GvREFCNT(topgv) == 1) {
454
455 GvCVGEN(topgv) = topgen_cmp;
456 }
457
458 return 0;
459}
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474GV *
475Perl_gv_fetchmeth_autoload(pTHX_ HV *stash, const char *name, STRLEN len, I32 level)
476{
477 GV *gv = gv_fetchmeth(stash, name, len, level);
478
479 if (!gv) {
480 CV *cv;
481 GV **gvp;
482
483 if (!stash)
484 return NULL;
485 if (len == S_autolen && strnEQ(name, S_autoload, S_autolen))
486 return NULL;
487 if (!(gv = gv_fetchmeth(stash, S_autoload, S_autolen, FALSE)))
488 return NULL;
489 cv = GvCV(gv);
490 if (!(CvROOT(cv) || CvXSUB(cv)))
491 return NULL;
492
493 if (level < 0)
494 gv_fetchmeth(stash, name, len, 0);
495 gvp = (GV**)hv_fetch(stash, name, len, (level >= 0));
496 if (!gvp)
497 return NULL;
498 return *gvp;
499 }
500 return gv;
501}
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531GV *
532Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload)
533{
534 dVAR;
535 register const char *nend;
536 const char *nsplit = NULL;
537 GV* gv;
538 HV* ostash = stash;
539
540 if (stash && SvTYPE(stash) < SVt_PVHV)
541 stash = NULL;
542
543 for (nend = name; *nend; nend++) {
544 if (*nend == '\'')
545 nsplit = nend;
546 else if (*nend == ':' && *(nend + 1) == ':')
547 nsplit = ++nend;
548 }
549 if (nsplit) {
550 const char * const origname = name;
551 name = nsplit + 1;
552 if (*nsplit == ':')
553 --nsplit;
554 if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) {
555
556 SV * const tmpstr = sv_2mortal(Perl_newSVpvf(aTHX_ "%s::SUPER",
557 CopSTASHPV(PL_curcop)));
558
559 stash = gv_stashpvn(SvPVX_const(tmpstr), SvCUR(tmpstr), GV_ADD);
560 DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n",
561 origname, HvNAME_get(stash), name) );
562 }
563 else {
564
565 stash = gv_stashpvn(origname, nsplit - origname, 0);
566
567
568
569 if (!stash && (nsplit - origname) >= 7 &&
570 strnEQ(nsplit - 7, "::SUPER", 7) &&
571 gv_stashpvn(origname, nsplit - origname - 7, 0))
572 stash = gv_stashpvn(origname, nsplit - origname, GV_ADD);
573 }
574 ostash = stash;
575 }
576
577 gv = gv_fetchmeth(stash, name, nend - name, 0);
578 if (!gv) {
579 if (strEQ(name,"import") || strEQ(name,"unimport"))
580 gv = (GV*)&PL_sv_yes;
581 else if (autoload)
582 gv = gv_autoload4(ostash, name, nend - name, TRUE);
583 }
584 else if (autoload) {
585 CV* const cv = GvCV(gv);
586 if (!CvROOT(cv) && !CvXSUB(cv)) {
587 GV* stubgv;
588 GV* autogv;
589
590 if (CvANON(cv))
591 stubgv = gv;
592 else {
593 stubgv = CvGV(cv);
594 if (GvCV(stubgv) != cv)
595 stubgv = gv;
596 }
597 autogv = gv_autoload4(GvSTASH(stubgv),
598 GvNAME(stubgv), GvNAMELEN(stubgv), TRUE);
599 if (autogv)
600 gv = autogv;
601 }
602 }
603
604 return gv;
605}
606
607GV*
608Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
609{
610 dVAR;
611 GV* gv;
612 CV* cv;
613 HV* varstash;
614 GV* vargv;
615 SV* varsv;
616 const char *packname = "";
617 STRLEN packname_len = 0;
618
619 if (len == S_autolen && strnEQ(name, S_autoload, S_autolen))
620 return NULL;
621 if (stash) {
622 if (SvTYPE(stash) < SVt_PVHV) {
623 packname = SvPV_const((SV*)stash, packname_len);
624 stash = NULL;
625 }
626 else {
627 packname = HvNAME_get(stash);
628 packname_len = HvNAMELEN_get(stash);
629 }
630 }
631 if (!(gv = gv_fetchmeth(stash, S_autoload, S_autolen, FALSE)))
632 return NULL;
633 cv = GvCV(gv);
634
635 if (!(CvROOT(cv) || CvXSUB(cv)))
636 return NULL;
637
638
639
640
641 if (!method && (GvCVGEN(gv) || GvSTASH(gv) != stash)
642 && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)
643 )
644 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
645 "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
646 packname, (int)len, name);
647
648 if (CvISXSUB(cv)) {
649
650
651
652
653
654 CvSTASH(cv) = stash;
655 SvPV_set(cv, (char *)name);
656 SvCUR_set(cv, len);
657 return gv;
658 }
659
660
661
662
663
664
665
666 varstash = GvSTASH(CvGV(cv));
667 vargv = *(GV**)hv_fetch(varstash, S_autoload, S_autolen, TRUE);
668 ENTER;
669
670 if (!isGV(vargv)) {
671 gv_init(vargv, varstash, S_autoload, S_autolen, FALSE);
672#ifdef PERL_DONT_CREATE_GVSV
673 GvSV(vargv) = newSV(0);
674#endif
675 }
676 LEAVE;
677 varsv = GvSVn(vargv);
678 sv_setpvn(varsv, packname, packname_len);
679 sv_catpvs(varsv, "::");
680 sv_catpvn(varsv, name, len);
681 return gv;
682}
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697STATIC HV*
698S_require_tie_mod(pTHX_ GV *gv, const char *varpv, SV* namesv, const char *methpv,const U32 flags)
699{
700 dVAR;
701 HV* stash = gv_stashsv(namesv, 0);
702
703 if (!stash || !(gv_fetchmethod(stash, methpv))) {
704 SV *module = newSVsv(namesv);
705 char varname = *varpv;
706
707
708 dSP;
709 ENTER;
710 if ( flags & 1 )
711 save_scalar(gv);
712 PUSHSTACKi(PERLSI_MAGIC);
713 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, module, NULL);
714 POPSTACK;
715 LEAVE;
716 SPAGAIN;
717 stash = gv_stashsv(namesv, 0);
718 if (!stash)
719 Perl_croak(aTHX_ "panic: Can't use %%%c because %"SVf" is not available",
720 varname, SVfARG(namesv));
721 else if (!gv_fetchmethod(stash, methpv))
722 Perl_croak(aTHX_ "panic: Can't use %%%c because %"SVf" does not support method %s",
723 varname, SVfARG(namesv), methpv);
724 }
725 SvREFCNT_dec(namesv);
726 return stash;
727}
728
729
730
731
732
733
734
735
736
737
738HV*
739Perl_gv_stashpv(pTHX_ const char *name, I32 create)
740{
741 return gv_stashpvn(name, strlen(name), create);
742}
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758HV*
759Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 flags)
760{
761 char smallbuf[128];
762 char *tmpbuf;
763 HV *stash;
764 GV *tmpgv;
765
766 if (namelen + 2 <= sizeof smallbuf)
767 tmpbuf = smallbuf;
768 else
769 Newx(tmpbuf, namelen + 2, char);
770 Copy(name,tmpbuf,namelen,char);
771 tmpbuf[namelen++] = ':';
772 tmpbuf[namelen++] = ':';
773 tmpgv = gv_fetchpvn_flags(tmpbuf, namelen, flags, SVt_PVHV);
774 if (tmpbuf != smallbuf)
775 Safefree(tmpbuf);
776 if (!tmpgv)
777 return NULL;
778 if (!GvHV(tmpgv))
779 GvHV(tmpgv) = newHV();
780 stash = GvHV(tmpgv);
781 if (!HvNAME_get(stash))
782 hv_name_set(stash, name, namelen, 0);
783 return stash;
784}
785
786
787
788
789
790
791
792
793
794HV*
795Perl_gv_stashsv(pTHX_ SV *sv, I32 flags)
796{
797 STRLEN len;
798 const char * const ptr = SvPV_const(sv,len);
799 return gv_stashpvn(ptr, len, flags);
800}
801
802
803GV *
804Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type) {
805 return gv_fetchpvn_flags(nambeg, strlen(nambeg), add, sv_type);
806}
807
808GV *
809Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, I32 sv_type) {
810 STRLEN len;
811 const char * const nambeg = SvPV_const(name, len);
812 return gv_fetchpvn_flags(nambeg, len, flags | SvUTF8(name), sv_type);
813}
814
815GV *
816Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
817 I32 sv_type)
818{
819 dVAR;
820 register const char *name = nambeg;
821 register GV *gv = NULL;
822 GV**gvp;
823 I32 len;
824 register const char *name_cursor;
825 HV *stash = NULL;
826 const I32 no_init = flags & (GV_NOADD_NOINIT | GV_NOINIT);
827 const I32 no_expand = flags & GV_NOEXPAND;
828 const I32 add = flags & ~GV_NOADD_MASK;
829 const char *const name_end = nambeg + full_len;
830 const char *const name_em1 = name_end - 1;
831
832 if (flags & GV_NOTQUAL) {
833
834 len = full_len;
835 goto no_stash;
836 }
837
838 if (full_len > 2 && *name == '*' && isALPHA(name[1])) {
839
840 name++;
841 }
842
843 for (name_cursor = name; name_cursor < name_end; name_cursor++) {
844 if ((*name_cursor == ':' && name_cursor < name_em1
845 && name_cursor[1] == ':')
846 || (*name_cursor == '\'' && name_cursor[1]))
847 {
848 if (!stash)
849 stash = PL_defstash;
850 if (!stash || !SvREFCNT(stash))
851 return NULL;
852
853 len = name_cursor - name;
854 if (len > 0) {
855 char smallbuf[128];
856 char *tmpbuf;
857
858 if (len + 2 <= (I32)sizeof (smallbuf))
859 tmpbuf = smallbuf;
860 else
861 Newx(tmpbuf, len+2, char);
862 Copy(name, tmpbuf, len, char);
863 tmpbuf[len++] = ':';
864 tmpbuf[len++] = ':';
865 gvp = (GV**)hv_fetch(stash,tmpbuf,len,add);
866 gv = gvp ? *gvp : NULL;
867 if (gv && gv != (GV*)&PL_sv_undef) {
868 if (SvTYPE(gv) != SVt_PVGV)
869 gv_init(gv, stash, tmpbuf, len, (add & GV_ADDMULTI));
870 else
871 GvMULTI_on(gv);
872 }
873 if (tmpbuf != smallbuf)
874 Safefree(tmpbuf);
875 if (!gv || gv == (GV*)&PL_sv_undef)
876 return NULL;
877
878 if (!(stash = GvHV(gv)))
879 stash = GvHV(gv) = newHV();
880
881 if (!HvNAME_get(stash))
882 hv_name_set(stash, nambeg, name_cursor - nambeg, 0);
883 }
884
885 if (*name_cursor == ':')
886 name_cursor++;
887 name_cursor++;
888 name = name_cursor;
889 if (name == name_end)
890 return gv ? gv : (GV*)*hv_fetchs(PL_defstash, "main::", TRUE);
891 }
892 }
893 len = name_cursor - name;
894
895
896
897 if (!stash) {
898 no_stash:
899 if (len && isIDFIRST_lazy(name)) {
900 bool global = FALSE;
901
902 switch (len) {
903 case 1:
904 if (*name == '_')
905 global = TRUE;
906 break;
907 case 3:
908 if ((name[0] == 'I' && name[1] == 'N' && name[2] == 'C')
909 || (name[0] == 'E' && name[1] == 'N' && name[2] == 'V')
910 || (name[0] == 'S' && name[1] == 'I' && name[2] == 'G'))
911 global = TRUE;
912 break;
913 case 4:
914 if (name[0] == 'A' && name[1] == 'R' && name[2] == 'G'
915 && name[3] == 'V')
916 global = TRUE;
917 break;
918 case 5:
919 if (name[0] == 'S' && name[1] == 'T' && name[2] == 'D'
920 && name[3] == 'I' && name[4] == 'N')
921 global = TRUE;
922 break;
923 case 6:
924 if ((name[0] == 'S' && name[1] == 'T' && name[2] == 'D')
925 &&((name[3] == 'O' && name[4] == 'U' && name[5] == 'T')
926 ||(name[3] == 'E' && name[4] == 'R' && name[5] == 'R')))
927 global = TRUE;
928 break;
929 case 7:
930 if (name[0] == 'A' && name[1] == 'R' && name[2] == 'G'
931 && name[3] == 'V' && name[4] == 'O' && name[5] == 'U'
932 && name[6] == 'T')
933 global = TRUE;
934 break;
935 }
936
937 if (global)
938 stash = PL_defstash;
939 else if (IN_PERL_COMPILETIME) {
940 stash = PL_curstash;
941 if (add && (PL_hints & HINT_STRICT_VARS) &&
942 sv_type != SVt_PVCV &&
943 sv_type != SVt_PVGV &&
944 sv_type != SVt_PVFM &&
945 sv_type != SVt_PVIO &&
946 !(len == 1 && sv_type == SVt_PV &&
947 (*name == 'a' || *name == 'b')) )
948 {
949 gvp = (GV**)hv_fetch(stash,name,len,0);
950 if (!gvp ||
951 *gvp == (GV*)&PL_sv_undef ||
952 SvTYPE(*gvp) != SVt_PVGV)
953 {
954 stash = NULL;
955 }
956 else if ((sv_type == SVt_PV && !GvIMPORTED_SV(*gvp)) ||
957 (sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp)) ||
958 (sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp)) )
959 {
960 Perl_warn(aTHX_ "Variable \"%c%s\" is not imported",
961 sv_type == SVt_PVAV ? '@' :
962 sv_type == SVt_PVHV ? '%' : '$',
963 name);
964 if (GvCVu(*gvp))
965 Perl_warn(aTHX_ "\t(Did you mean &%s instead?)\n", name);
966 stash = NULL;
967 }
968 }
969 }
970 else
971 stash = CopSTASH(PL_curcop);
972 }
973 else
974 stash = PL_defstash;
975 }
976
977
978
979 if (!stash) {
980 if (add) {
981 SV * const err = Perl_mess(aTHX_
982 "Global symbol \"%s%s\" requires explicit package name",
983 (sv_type == SVt_PV ? "$"
984 : sv_type == SVt_PVAV ? "@"
985 : sv_type == SVt_PVHV ? "%"
986 : ""), name);
987 GV *gv;
988 if (USE_UTF8_IN_NAMES)
989 SvUTF8_on(err);
990 qerror(err);
991 gv = gv_fetchpvn_flags("<none>::", 8, GV_ADDMULTI, SVt_PVHV);
992 if(!gv) {
993
994 return NULL;
995 }
996 stash = GvHV(gv);
997 }
998 else
999 return NULL;
1000 }
1001
1002 if (!SvREFCNT(stash))
1003 return NULL;
1004
1005 gvp = (GV**)hv_fetch(stash,name,len,add);
1006 if (!gvp || *gvp == (GV*)&PL_sv_undef)
1007 return NULL;
1008 gv = *gvp;
1009 if (SvTYPE(gv) == SVt_PVGV) {
1010 if (add) {
1011 GvMULTI_on(gv);
1012 gv_init_sv(gv, sv_type);
1013 if (len == 1 && (sv_type == SVt_PVHV || sv_type == SVt_PVGV)) {
1014 if (*name == '!')
1015 require_tie_mod(gv, "!", newSVpvs("Errno"), "TIEHASH", 1);
1016 else if (*name == '-' || *name == '+')
1017 require_tie_mod(gv, name, newSVpvs("Tie::Hash::NamedCapture"), "TIEHASH", 0);
1018 }
1019 }
1020 return gv;
1021 } else if (no_init) {
1022 return gv;
1023 } else if (no_expand && SvROK(gv)) {
1024 return gv;
1025 }
1026
1027
1028
1029 if (add & GV_ADDWARN && ckWARN_d(WARN_INTERNAL))
1030 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Had to create %s unexpectedly", nambeg);
1031 gv_init(gv, stash, name, len, add & GV_ADDMULTI);
1032 gv_init_sv(gv, sv_type);
1033
1034 if (isALPHA(name[0]) && ! (isLEXWARN_on ? ckWARN(WARN_ONCE)
1035 : (PL_dowarn & G_WARN_ON ) ) )
1036 GvMULTI_on(gv) ;
1037
1038
1039 if (len > 1) {
1040#ifndef EBCDIC
1041 if (*name > 'V' ) {
1042 NOOP;
1043
1044
1045
1046
1047 } else
1048#endif
1049 {
1050 const char * const name2 = name + 1;
1051 switch (*name) {
1052 case 'A':
1053 if (strEQ(name2, "RGV")) {
1054 IoFLAGS(GvIOn(gv)) |= IOf_ARGV|IOf_START;
1055 }
1056 else if (strEQ(name2, "RGVOUT")) {
1057 GvMULTI_on(gv);
1058 }
1059 break;
1060 case 'E':
1061 if (strnEQ(name2, "XPORT", 5))
1062 GvMULTI_on(gv);
1063 break;
1064 case 'I':
1065 if (strEQ(name2, "SA")) {
1066 AV* const av = GvAVn(gv);
1067 GvMULTI_on(gv);
1068 sv_magic((SV*)av, (SV*)gv, PERL_MAGIC_isa, NULL, 0);
1069
1070 if ((add & GV_ADDMULTI) && strEQ(nambeg,"AnyDBM_File::ISA")
1071 && AvFILLp(av) == -1)
1072 {
1073 const char *pname;
1074 av_push(av, newSVpvn(pname = "NDBM_File",9));
1075 gv_stashpvn(pname, 9, GV_ADD);
1076 av_push(av, newSVpvn(pname = "DB_File",7));
1077 gv_stashpvn(pname, 7, GV_ADD);
1078 av_push(av, newSVpvn(pname = "GDBM_File",9));
1079 gv_stashpvn(pname, 9, GV_ADD);
1080 av_push(av, newSVpvn(pname = "SDBM_File",9));
1081 gv_stashpvn(pname, 9, GV_ADD);
1082 av_push(av, newSVpvn(pname = "ODBM_File",9));
1083 gv_stashpvn(pname, 9, GV_ADD);
1084 }
1085 }
1086 break;
1087 case 'O':
1088 if (strEQ(name2, "VERLOAD")) {
1089 HV* const hv = GvHVn(gv);
1090 GvMULTI_on(gv);
1091 hv_magic(hv, NULL, PERL_MAGIC_overload);
1092 }
1093 break;
1094 case 'S':
1095 if (strEQ(name2, "IG")) {
1096 HV *hv;
1097 I32 i;
1098 if (!PL_psig_ptr) {
1099 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
1100 Newxz(PL_psig_name, SIG_SIZE, SV*);
1101 Newxz(PL_psig_pend, SIG_SIZE, int);
1102 }
1103 GvMULTI_on(gv);
1104 hv = GvHVn(gv);
1105 hv_magic(hv, NULL, PERL_MAGIC_sig);
1106 for (i = 1; i < SIG_SIZE; i++) {
1107 SV * const * const init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1);
1108 if (init)
1109 sv_setsv(*init, &PL_sv_undef);
1110 PL_psig_ptr[i] = 0;
1111 PL_psig_name[i] = 0;
1112 PL_psig_pend[i] = 0;
1113 }
1114 }
1115 break;
1116 case 'V':
1117 if (strEQ(name2, "ERSION"))
1118 GvMULTI_on(gv);
1119 break;
1120 case '\003':
1121 if (strEQ(name2, "HILD_ERROR_NATIVE"))
1122 goto magicalize;
1123 break;
1124 case '\005':
1125 if (strEQ(name2, "NCODING"))
1126 goto magicalize;
1127 break;
1128 case '\015':
1129 if (strEQ(name2, "ATCH"))
1130 goto magicalize;
1131 case '\017':
1132 if (strEQ(name2, "PEN"))
1133 goto magicalize;
1134 break;
1135 case '\020':
1136 if (strEQ(name2, "REMATCH") || strEQ(name2, "OSTMATCH"))
1137 goto magicalize;
1138 case '\024':
1139 if (strEQ(name2, "AINT"))
1140 goto ro_magicalize;
1141 break;
1142 case '\025':
1143 if (strEQ(name2, "NICODE"))
1144 goto ro_magicalize;
1145 if (strEQ(name2, "TF8LOCALE"))
1146 goto ro_magicalize;
1147 if (strEQ(name2, "TF8CACHE"))
1148 goto magicalize;
1149 break;
1150 case '\027':
1151 if (strEQ(name2, "ARNING_BITS"))
1152 goto magicalize;
1153 break;
1154 case '1':
1155 case '2':
1156 case '3':
1157 case '4':
1158 case '5':
1159 case '6':
1160 case '7':
1161 case '8':
1162 case '9':
1163 {
1164
1165
1166
1167 const char *end = name + len;
1168 while (--end > name) {
1169 if (!isDIGIT(*end)) return gv;
1170 }
1171 goto magicalize;
1172 }
1173 }
1174 }
1175 } else {
1176
1177
1178 switch (*name) {
1179 case '&':
1180 case '`':
1181 case '\'':
1182 if (
1183 sv_type == SVt_PVAV ||
1184 sv_type == SVt_PVHV ||
1185 sv_type == SVt_PVCV ||
1186 sv_type == SVt_PVFM ||
1187 sv_type == SVt_PVIO
1188 ) { break; }
1189 PL_sawampersand = TRUE;
1190 goto magicalize;
1191
1192 case ':':
1193 sv_setpv(GvSVn(gv),PL_chopset);
1194 goto magicalize;
1195
1196 case '?':
1197#ifdef COMPLEX_STATUS
1198 SvUPGRADE(GvSVn(gv), SVt_PVLV);
1199#endif
1200 goto magicalize;
1201
1202 case '!':
1203 GvMULTI_on(gv);
1204
1205
1206 sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
1207
1208
1209 if (sv_type == SVt_PVHV || sv_type == SVt_PVGV)
1210 require_tie_mod(gv, "!", newSVpvs("Errno"), "TIEHASH", 1);
1211
1212 break;
1213 case '-':
1214 case '+':
1215 GvMULTI_on(gv);
1216 {
1217 AV* const av = GvAVn(gv);
1218 SV* const avc = (*name == '+') ? (SV*)av : NULL;
1219
1220 sv_magic((SV*)av, avc, PERL_MAGIC_regdata, NULL, 0);
1221 sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
1222 if (avc)
1223 SvREADONLY_on(GvSVn(gv));
1224 SvREADONLY_on(av);
1225
1226 if (sv_type == SVt_PVHV || sv_type == SVt_PVGV)
1227 require_tie_mod(gv, name, newSVpvs("Tie::Hash::NamedCapture"), "TIEHASH", 0);
1228
1229 break;
1230 }
1231 case '*':
1232 case '#':
1233 if (sv_type == SVt_PV && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
1234 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
1235 "$%c is no longer supported", *name);
1236 break;
1237 case '|':
1238 sv_setiv(GvSVn(gv), (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0);
1239 goto magicalize;
1240
1241 case '\010':
1242 {
1243 HV *const hv = GvHVn(gv);
1244 hv_magic(hv, NULL, PERL_MAGIC_hints);
1245 }
1246 goto magicalize;
1247 case '\023':
1248 ro_magicalize:
1249 SvREADONLY_on(GvSVn(gv));
1250
1251 case '1':
1252 case '2':
1253 case '3':
1254 case '4':
1255 case '5':
1256 case '6':
1257 case '7':
1258 case '8':
1259 case '9':
1260 case '[':
1261 case '^':
1262 case '~':
1263 case '=':
1264 case '%':
1265 case '.':
1266 case '(':
1267 case ')':
1268 case '<':
1269 case '>':
1270 case ',':
1271 case '\\':
1272 case '/':
1273 case '\001':
1274 case '\003':
1275 case '\004':
1276 case '\005':
1277 case '\006':
1278 case '\011':
1279 case '\016':
1280 case '\017':
1281 case '\020':
1282 case '\024':
1283 case '\027':
1284 magicalize:
1285 sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
1286 break;
1287
1288 case '\014':
1289 sv_setpvn(GvSVn(gv),"\f",1);
1290 PL_formfeed = GvSVn(gv);
1291 break;
1292 case ';':
1293 sv_setpvn(GvSVn(gv),"\034",1);
1294 break;
1295 case ']':
1296 {
1297 SV * const sv = GvSVn(gv);
1298 if (!sv_derived_from(PL_patchlevel, "version"))
1299 upg_version(PL_patchlevel, TRUE);
1300 GvSV(gv) = vnumify(PL_patchlevel);
1301 SvREADONLY_on(GvSV(gv));
1302 SvREFCNT_dec(sv);
1303 }
1304 break;
1305 case '\026':
1306 {
1307 SV * const sv = GvSVn(gv);
1308 GvSV(gv) = new_version(PL_patchlevel);
1309 SvREADONLY_on(GvSV(gv));
1310 SvREFCNT_dec(sv);
1311 }
1312 break;
1313 }
1314 }
1315 return gv;
1316}
1317
1318void
1319Perl_gv_fullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain)
1320{
1321 const char *name;
1322 STRLEN namelen;
1323 const HV * const hv = GvSTASH(gv);
1324 if (!hv) {
1325 SvOK_off(sv);
1326 return;
1327 }
1328 sv_setpv(sv, prefix ? prefix : "");
1329
1330 name = HvNAME_get(hv);
1331 if (name) {
1332 namelen = HvNAMELEN_get(hv);
1333 } else {
1334 name = "__ANON__";
1335 namelen = 8;
1336 }
1337
1338 if (keepmain || strNE(name, "main")) {
1339 sv_catpvn(sv,name,namelen);
1340 sv_catpvs(sv,"::");
1341 }
1342 sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
1343}
1344
1345void
1346Perl_gv_efullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain)
1347{
1348 const GV * const egv = GvEGV(gv);
1349 gv_fullname4(sv, egv ? egv : gv, prefix, keepmain);
1350}
1351
1352IO *
1353Perl_newIO(pTHX)
1354{
1355 dVAR;
1356 GV *iogv;
1357 IO * const io = (IO*)newSV_type(SVt_PVIO);
1358
1359
1360
1361 assert (SvREFCNT(io) == 1);
1362 SvOBJECT_on(io);
1363
1364 hv_clear(PL_stashcache);
1365 iogv = gv_fetchpvs("FileHandle::", 0, SVt_PVHV);
1366
1367 if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv))))
1368 iogv = gv_fetchpvs("IO::Handle::", GV_ADD, SVt_PVHV);
1369 SvSTASH_set(io, (HV*)SvREFCNT_inc(GvHV(iogv)));
1370 return io;
1371}
1372
1373void
1374Perl_gv_check(pTHX_ const HV *stash)
1375{
1376 dVAR;
1377 register I32 i;
1378
1379 if (!HvARRAY(stash))
1380 return;
1381 for (i = 0; i <= (I32) HvMAX(stash); i++) {
1382 const HE *entry;
1383 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
1384 register GV *gv;
1385 HV *hv;
1386 if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
1387 (gv = (GV*)HeVAL(entry)) && isGV(gv) && (hv = GvHV(gv)))
1388 {
1389 if (hv != PL_defstash && hv != stash)
1390 gv_check(hv);
1391 }
1392 else if (isALPHA(*HeKEY(entry))) {
1393 const char *file;
1394 gv = (GV*)HeVAL(entry);
1395 if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
1396 continue;
1397 file = GvFILE(gv);
1398 CopLINE_set(PL_curcop, GvLINE(gv));
1399#ifdef USE_ITHREADS
1400 CopFILE(PL_curcop) = (char *)file;
1401#else
1402 CopFILEGV(PL_curcop) = gv_fetchfile(file);
1403#endif
1404 Perl_warner(aTHX_ packWARN(WARN_ONCE),
1405 "Name \"%s::%s\" used only once: possible typo",
1406 HvNAME_get(stash), GvNAME(gv));
1407 }
1408 }
1409 }
1410}
1411
1412GV *
1413Perl_newGVgen(pTHX_ const char *pack)
1414{
1415 dVAR;
1416 return gv_fetchpv(Perl_form(aTHX_ "%s::_GEN_%ld", pack, (long)PL_gensym++),
1417 GV_ADD, SVt_PVGV);
1418}
1419
1420
1421
1422GP*
1423Perl_gp_ref(pTHX_ GP *gp)
1424{
1425 dVAR;
1426 if (!gp)
1427 return NULL;
1428 gp->gp_refcnt++;
1429 if (gp->gp_cv) {
1430 if (gp->gp_cvgen) {
1431
1432
1433
1434 SvREFCNT_dec(gp->gp_cv);
1435 gp->gp_cv = NULL;
1436 gp->gp_cvgen = 0;
1437 }
1438 }
1439 return gp;
1440}
1441
1442void
1443Perl_gp_free(pTHX_ GV *gv)
1444{
1445 dVAR;
1446 GP* gp;
1447
1448 if (!gv || !isGV_with_GP(gv) || !(gp = GvGP(gv)))
1449 return;
1450 if (gp->gp_refcnt == 0) {
1451 if (ckWARN_d(WARN_INTERNAL))
1452 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1453 "Attempt to free unreferenced glob pointers"
1454 pTHX__FORMAT pTHX__VALUE);
1455 return;
1456 }
1457 if (--gp->gp_refcnt > 0) {
1458 if (gp->gp_egv == gv)
1459 gp->gp_egv = 0;
1460 GvGP(gv) = 0;
1461 return;
1462 }
1463
1464 if (gp->gp_file_hek)
1465 unshare_hek(gp->gp_file_hek);
1466 SvREFCNT_dec(gp->gp_sv);
1467 SvREFCNT_dec(gp->gp_av);
1468
1469
1470 if (gp->gp_hv && SvTYPE(gp->gp_hv) == SVt_PVHV) {
1471 const char *hvname = HvNAME_get(gp->gp_hv);
1472 if (PL_stashcache && hvname)
1473 hv_delete(PL_stashcache, hvname, HvNAMELEN_get(gp->gp_hv),
1474 G_DISCARD);
1475 SvREFCNT_dec(gp->gp_hv);
1476 }
1477 SvREFCNT_dec(gp->gp_io);
1478 SvREFCNT_dec(gp->gp_cv);
1479 SvREFCNT_dec(gp->gp_form);
1480
1481 Safefree(gp);
1482 GvGP(gv) = 0;
1483}
1484
1485int
1486Perl_magic_freeovrld(pTHX_ SV *sv, MAGIC *mg)
1487{
1488 AMT * const amtp = (AMT*)mg->mg_ptr;
1489 PERL_UNUSED_ARG(sv);
1490
1491 if (amtp && AMT_AMAGIC(amtp)) {
1492 int i;
1493 for (i = 1; i < NofAMmeth; i++) {
1494 CV * const cv = amtp->table[i];
1495 if (cv) {
1496 SvREFCNT_dec((SV *) cv);
1497 amtp->table[i] = NULL;
1498 }
1499 }
1500 }
1501 return 0;
1502}
1503
1504
1505
1506bool
1507Perl_Gv_AMupdate(pTHX_ HV *stash)
1508{
1509 dVAR;
1510 MAGIC* const mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
1511 AMT amt;
1512 const struct mro_meta* stash_meta = HvMROMETA(stash);
1513 U32 newgen;
1514
1515 newgen = PL_sub_generation + stash_meta->pkg_gen + stash_meta->cache_gen;
1516 if (mg) {
1517 const AMT * const amtp = (AMT*)mg->mg_ptr;
1518 if (amtp->was_ok_am == PL_amagic_generation
1519 && amtp->was_ok_sub == newgen) {
1520 return (bool)AMT_OVERLOADED(amtp);
1521 }
1522 sv_unmagic((SV*)stash, PERL_MAGIC_overload_table);
1523 }
1524
1525 DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME_get(stash)) );
1526
1527 Zero(&amt,1,AMT);
1528 amt.was_ok_am = PL_amagic_generation;
1529 amt.was_ok_sub = newgen;
1530 amt.fallback = AMGfallNO;
1531 amt.flags = 0;
1532
1533 {
1534 int filled = 0, have_ovl = 0;
1535 int i, lim = 1;
1536
1537
1538
1539
1540 GV *gv = gv_fetchmeth(stash, PL_AMG_names[0], 2, -1);
1541 SV * const sv = gv ? GvSV(gv) : NULL;
1542 CV* cv;
1543
1544 if (!gv)
1545 lim = DESTROY_amg;
1546#ifdef PERL_DONT_CREATE_GVSV
1547 else if (!sv) {
1548 NOOP;
1549 }
1550#endif
1551 else if (SvTRUE(sv))
1552 amt.fallback=AMGfallYES;
1553 else if (SvOK(sv))
1554 amt.fallback=AMGfallNEVER;
1555
1556 for (i = 1; i < lim; i++)
1557 amt.table[i] = NULL;
1558 for (; i < NofAMmeth; i++) {
1559 const char * const cooky = PL_AMG_names[i];
1560
1561 const char * const cp = (i >= DESTROY_amg ? cooky : AMG_id2name(i));
1562 const STRLEN l = strlen(cooky);
1563
1564 DEBUG_o( Perl_deb(aTHX_ "Checking overloading of \"%s\" in package \"%.256s\"\n",
1565 cp, HvNAME_get(stash)) );
1566
1567
1568
1569
1570
1571
1572
1573 if (i >= DESTROY_amg)
1574 gv = Perl_gv_fetchmeth_autoload(aTHX_ stash, cooky, l, 0);
1575 else
1576 gv = Perl_gv_fetchmeth(aTHX_ stash, cooky, l, -1);
1577 cv = 0;
1578 if (gv && (cv = GvCV(gv))) {
1579 const char *hvname;
1580 if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
1581 && strEQ(hvname = HvNAME_get(GvSTASH(CvGV(cv))), "overload")) {
1582
1583
1584
1585 GV *ngv = NULL;
1586 SV *gvsv = GvSV(gv);
1587
1588 DEBUG_o( Perl_deb(aTHX_ "Resolving method \"%"SVf256\
1589 "\" for overloaded \"%s\" in package \"%.256s\"\n",
1590 (void*)GvSV(gv), cp, hvname) );
1591 if (!gvsv || !SvPOK(gvsv)
1592 || !(ngv = gv_fetchmethod_autoload(stash, SvPVX_const(gvsv),
1593 FALSE)))
1594 {
1595
1596 const char * const name = (gvsv && SvPOK(gvsv)) ? SvPVX_const(gvsv) : "???";
1597 Perl_croak(aTHX_ "%s method \"%.256s\" overloading \"%s\" "\
1598 "in package \"%.256s\"",
1599 (GvCVGEN(gv) ? "Stub found while resolving"
1600 : "Can't resolve"),
1601 name, cp, hvname);
1602 }
1603 cv = GvCV(gv = ngv);
1604 }
1605 DEBUG_o( Perl_deb(aTHX_ "Overloading \"%s\" in package \"%.256s\" via \"%.256s::%.256s\"\n",
1606 cp, HvNAME_get(stash), HvNAME_get(GvSTASH(CvGV(cv))),
1607 GvNAME(CvGV(cv))) );
1608 filled = 1;
1609 if (i < DESTROY_amg)
1610 have_ovl = 1;
1611 } else if (gv) {
1612 cv = (CV*)gv;
1613 filled = 1;
1614 }
1615 amt.table[i]=(CV*)SvREFCNT_inc_simple(cv);
1616 }
1617 if (filled) {
1618 AMT_AMAGIC_on(&amt);
1619 if (have_ovl)
1620 AMT_OVERLOADED_on(&amt);
1621 sv_magic((SV*)stash, 0, PERL_MAGIC_overload_table,
1622 (char*)&amt, sizeof(AMT));
1623 return have_ovl;
1624 }
1625 }
1626
1627
1628 AMT_AMAGIC_off(&amt);
1629 sv_magic((SV*)stash, 0, PERL_MAGIC_overload_table,
1630 (char*)&amt, sizeof(AMTS));
1631 return FALSE;
1632}
1633
1634
1635CV*
1636Perl_gv_handler(pTHX_ HV *stash, I32 id)
1637{
1638 dVAR;
1639 MAGIC *mg;
1640 AMT *amtp;
1641 U32 newgen;
1642 struct mro_meta* stash_meta;
1643
1644 if (!stash || !HvNAME_get(stash))
1645 return NULL;
1646
1647 stash_meta = HvMROMETA(stash);
1648 newgen = PL_sub_generation + stash_meta->pkg_gen + stash_meta->cache_gen;
1649
1650 mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
1651 if (!mg) {
1652 do_update:
1653 Gv_AMupdate(stash);
1654 mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
1655 }
1656 assert(mg);
1657 amtp = (AMT*)mg->mg_ptr;
1658 if ( amtp->was_ok_am != PL_amagic_generation
1659 || amtp->was_ok_sub != newgen )
1660 goto do_update;
1661 if (AMT_AMAGIC(amtp)) {
1662 CV * const ret = amtp->table[id];
1663 if (ret && isGV(ret)) {
1664
1665
1666
1667
1668 GV * const gv = gv_fetchmethod(stash, PL_AMG_names[id]);
1669
1670 if (gv && GvCV(gv))
1671 return GvCV(gv);
1672 }
1673 return ret;
1674 }
1675
1676 return NULL;
1677}
1678
1679
1680SV*
1681Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
1682{
1683 dVAR;
1684 MAGIC *mg;
1685 CV *cv=NULL;
1686 CV **cvp=NULL, **ocvp=NULL;
1687 AMT *amtp=NULL, *oamtp=NULL;
1688 int off = 0, off1, lr = 0, notfound = 0;
1689 int postpr = 0, force_cpy = 0;
1690 int assign = AMGf_assign & flags;
1691 const int assignshift = assign ? 1 : 0;
1692#ifdef DEBUGGING
1693 int fl=0;
1694#endif
1695 HV* stash=NULL;
1696 if (!(AMGf_noleft & flags) && SvAMAGIC(left)
1697 && (stash = SvSTASH(SvRV(left)))
1698 && (mg = mg_find((SV*)stash, PERL_MAGIC_overload_table))
1699 && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1700 ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
1701 : NULL))
1702 && ((cv = cvp[off=method+assignshift])
1703 || (assign && amtp->fallback > AMGfallNEVER &&
1704
1705 (
1706#ifdef DEBUGGING
1707 fl = 1,
1708#endif
1709 cv = cvp[off=method])))) {
1710 lr = -1;
1711 } else {
1712 if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
1713 int logic;
1714
1715
1716
1717 switch (method) {
1718 case inc_amg:
1719 force_cpy = 1;
1720 if ((cv = cvp[off=add_ass_amg])
1721 || ((cv = cvp[off = add_amg]) && (force_cpy = 0, postpr = 1))) {
1722 right = &PL_sv_yes; lr = -1; assign = 1;
1723 }
1724 break;
1725 case dec_amg:
1726 force_cpy = 1;
1727 if ((cv = cvp[off = subtr_ass_amg])
1728 || ((cv = cvp[off = subtr_amg]) && (force_cpy = 0, postpr=1))) {
1729 right = &PL_sv_yes; lr = -1; assign = 1;
1730 }
1731 break;
1732 case bool__amg:
1733 (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]));
1734 break;
1735 case numer_amg:
1736 (void)((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]));
1737 break;
1738 case string_amg:
1739 (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
1740 break;
1741 case not_amg:
1742 (void)((cv = cvp[off=bool__amg])
1743 || (cv = cvp[off=numer_amg])
1744 || (cv = cvp[off=string_amg]));
1745 postpr = 1;
1746 break;
1747 case copy_amg:
1748 {
1749
1750
1751
1752
1753 SV* const tmpRef=SvRV(left);
1754 if (!SvROK(tmpRef) && SvTYPE(tmpRef) <= SVt_PVMG) {
1755
1756
1757
1758
1759 SV* const newref = newSVsv(tmpRef);
1760 SvOBJECT_on(newref);
1761
1762
1763
1764
1765
1766 SvFLAGS(newref) |= SVf_AMAGIC;
1767 SvSTASH_set(newref, (HV*)SvREFCNT_inc(SvSTASH(tmpRef)));
1768 return newref;
1769 }
1770 }
1771 break;
1772 case abs_amg:
1773 if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
1774 && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
1775 SV* const nullsv=sv_2mortal(newSViv(0));
1776 if (off1==lt_amg) {
1777 SV* const lessp = amagic_call(left,nullsv,
1778 lt_amg,AMGf_noright);
1779 logic = SvTRUE(lessp);
1780 } else {
1781 SV* const lessp = amagic_call(left,nullsv,
1782 ncmp_amg,AMGf_noright);
1783 logic = (SvNV(lessp) < 0);
1784 }
1785 if (logic) {
1786 if (off==subtr_amg) {
1787 right = left;
1788 left = nullsv;
1789 lr = 1;
1790 }
1791 } else {
1792 return left;
1793 }
1794 }
1795 break;
1796 case neg_amg:
1797 if ((cv = cvp[off=subtr_amg])) {
1798 right = left;
1799 left = sv_2mortal(newSViv(0));
1800 lr = 1;
1801 }
1802 break;
1803 case int_amg:
1804 case iter_amg:
1805
1806 return NULL;
1807 break;
1808 case to_sv_amg:
1809 case to_av_amg:
1810 case to_hv_amg:
1811 case to_gv_amg:
1812 case to_cv_amg:
1813
1814 return left;
1815 break;
1816 default:
1817 goto not_found;
1818 }
1819 if (!cv) goto not_found;
1820 } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
1821 && (stash = SvSTASH(SvRV(right)))
1822 && (mg = mg_find((SV*)stash, PERL_MAGIC_overload_table))
1823 && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
1824 ? (amtp = (AMT*)mg->mg_ptr)->table
1825 : NULL))
1826 && (cv = cvp[off=method])) {
1827
1828 lr=1;
1829 } else if (((ocvp && oamtp->fallback > AMGfallNEVER
1830 && (cvp=ocvp) && (lr = -1))
1831 || (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
1832 && !(flags & AMGf_unary)) {
1833
1834
1835
1836 if (method==concat_amg || method==concat_ass_amg
1837 || method==repeat_amg || method==repeat_ass_amg) {
1838 return NULL;
1839 }
1840 off = -1;
1841 switch (method) {
1842 case lt_amg:
1843 case le_amg:
1844 case gt_amg:
1845 case ge_amg:
1846 case eq_amg:
1847 case ne_amg:
1848 postpr = 1; off=ncmp_amg; break;
1849 case slt_amg:
1850 case sle_amg:
1851 case sgt_amg:
1852 case sge_amg:
1853 case seq_amg:
1854 case sne_amg:
1855 postpr = 1; off=scmp_amg; break;
1856 }
1857 if (off != -1) cv = cvp[off];
1858 if (!cv) {
1859 goto not_found;
1860 }
1861 } else {
1862 not_found:
1863 switch (method) {
1864 case lt_amg:
1865 case le_amg:
1866 case gt_amg:
1867 case ge_amg:
1868 case eq_amg:
1869 case ne_amg:
1870 case slt_amg:
1871 case sle_amg:
1872 case sgt_amg:
1873 case sge_amg:
1874 case seq_amg:
1875 case sne_amg:
1876 postpr = 0; break;
1877 case to_sv_amg:
1878 case to_av_amg:
1879 case to_hv_amg:
1880 case to_gv_amg:
1881 case to_cv_amg:
1882
1883 return left;
1884 break;
1885 }
1886 if (ocvp && (cv=ocvp[nomethod_amg])) {
1887 notfound = 1; lr = -1;
1888 } else if (cvp && (cv=cvp[nomethod_amg])) {
1889 notfound = 1; lr = 1;
1890 } else if ((amtp && amtp->fallback >= AMGfallYES) && !DEBUG_o_TEST) {
1891
1892 return NULL;
1893 } else {
1894 SV *msg;
1895 if (off==-1) off=method;
1896 msg = sv_2mortal(Perl_newSVpvf(aTHX_
1897 "Operation \"%s\": no method found,%sargument %s%s%s%s",
1898 AMG_id2name(method + assignshift),
1899 (flags & AMGf_unary ? " " : "\n\tleft "),
1900 SvAMAGIC(left)?
1901 "in overloaded package ":
1902 "has no overloaded magic",
1903 SvAMAGIC(left)?
1904 HvNAME_get(SvSTASH(SvRV(left))):
1905 "",
1906 SvAMAGIC(right)?
1907 ",\n\tright argument in overloaded package ":
1908 (flags & AMGf_unary
1909 ? ""
1910 : ",\n\tright argument has no overloaded magic"),
1911 SvAMAGIC(right)?
1912 HvNAME_get(SvSTASH(SvRV(right))):
1913 ""));
1914 if (amtp && amtp->fallback >= AMGfallYES) {
1915 DEBUG_o( Perl_deb(aTHX_ "%s", SvPVX_const(msg)) );
1916 } else {
1917 Perl_croak(aTHX_ "%"SVf, SVfARG(msg));
1918 }
1919 return NULL;
1920 }
1921 force_cpy = force_cpy || assign;
1922 }
1923 }
1924#ifdef DEBUGGING
1925 if (!notfound) {
1926 DEBUG_o(Perl_deb(aTHX_
1927 "Overloaded operator \"%s\"%s%s%s:\n\tmethod%s found%s in package %s%s\n",
1928 AMG_id2name(off),
1929 method+assignshift==off? "" :
1930 " (initially \"",
1931 method+assignshift==off? "" :
1932 AMG_id2name(method+assignshift),
1933 method+assignshift==off? "" : "\")",
1934 flags & AMGf_unary? "" :
1935 lr==1 ? " for right argument": " for left argument",
1936 flags & AMGf_unary? " for argument" : "",
1937 stash ? HvNAME_get(stash) : "null",
1938 fl? ",\n\tassignment variant used": "") );
1939 }
1940#endif
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963 if (( (method + assignshift == off)
1964 && (assign || (method == inc_amg) || (method == dec_amg)))
1965 || force_cpy)
1966 RvDEEPCP(left);
1967 {
1968 dSP;
1969 BINOP myop;
1970 SV* res;
1971 const bool oldcatch = CATCH_GET;
1972
1973 CATCH_SET(TRUE);
1974 Zero(&myop, 1, BINOP);
1975 myop.op_last = (OP *) &myop;
1976 myop.op_next = NULL;
1977 myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
1978
1979 PUSHSTACKi(PERLSI_OVERLOAD);
1980 ENTER;
1981 SAVEOP();
1982 PL_op = (OP *) &myop;
1983 if (PERLDB_SUB && PL_curstash != PL_debstash)
1984 PL_op->op_private |= OPpENTERSUB_DB;
1985 PUTBACK;
1986 pp_pushmark();
1987
1988 EXTEND(SP, notfound + 5);
1989 PUSHs(lr>0? right: left);
1990 PUSHs(lr>0? left: right);
1991 PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no ));
1992 if (notfound) {
1993 PUSHs( sv_2mortal(newSVpv(AMG_id2name(method + assignshift),0)));
1994 }
1995 PUSHs((SV*)cv);
1996 PUTBACK;
1997
1998 if ((PL_op = Perl_pp_entersub(aTHX)))
1999 CALLRUNOPS(aTHX);
2000 LEAVE;
2001 SPAGAIN;
2002
2003 res=POPs;
2004 PUTBACK;
2005 POPSTACK;
2006 CATCH_SET(oldcatch);
2007
2008 if (postpr) {
2009 int ans;
2010 switch (method) {
2011 case le_amg:
2012 case sle_amg:
2013 ans=SvIV(res)<=0; break;
2014 case lt_amg:
2015 case slt_amg:
2016 ans=SvIV(res)<0; break;
2017 case ge_amg:
2018 case sge_amg:
2019 ans=SvIV(res)>=0; break;
2020 case gt_amg:
2021 case sgt_amg:
2022 ans=SvIV(res)>0; break;
2023 case eq_amg:
2024 case seq_amg:
2025 ans=SvIV(res)==0; break;
2026 case ne_amg:
2027 case sne_amg:
2028 ans=SvIV(res)!=0; break;
2029 case inc_amg:
2030 case dec_amg:
2031 SvSetSV(left,res); return left;
2032 case not_amg:
2033 ans=!SvTRUE(res); break;
2034 default:
2035 ans=0; break;
2036 }
2037 return boolSV(ans);
2038 } else if (method==copy_amg) {
2039 if (!SvROK(res)) {
2040 Perl_croak(aTHX_ "Copy method did not return a reference");
2041 }
2042 return SvREFCNT_inc(SvRV(res));
2043 } else {
2044 return res;
2045 }
2046 }
2047}
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057bool
2058Perl_is_gv_magical_sv(pTHX_ SV *name, U32 flags)
2059{
2060 STRLEN len;
2061 const char * const temp = SvPV_const(name, len);
2062 return is_gv_magical(temp, len, flags);
2063}
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082bool
2083Perl_is_gv_magical(pTHX_ const char *name, STRLEN len, U32 flags)
2084{
2085 PERL_UNUSED_CONTEXT;
2086 PERL_UNUSED_ARG(flags);
2087
2088 if (len > 1) {
2089 const char * const name1 = name + 1;
2090 switch (*name) {
2091 case 'I':
2092 if (len == 3 && name1[1] == 'S' && name[2] == 'A')
2093 goto yes;
2094 break;
2095 case 'O':
2096 if (len == 8 && strEQ(name1, "VERLOAD"))
2097 goto yes;
2098 break;
2099 case 'S':
2100 if (len == 3 && name[1] == 'I' && name[2] == 'G')
2101 goto yes;
2102 break;
2103
2104
2105
2106 case '\017':
2107 if (strEQ(name1, "PEN"))
2108 goto yes;
2109 break;
2110 case '\024':
2111 if (strEQ(name1, "AINT"))
2112 goto yes;
2113 break;
2114 case '\025':
2115 if (strEQ(name1, "NICODE"))
2116 goto yes;
2117 if (strEQ(name1, "TF8LOCALE"))
2118 goto yes;
2119 break;
2120 case '\027':
2121 if (strEQ(name1, "ARNING_BITS"))
2122 goto yes;
2123 break;
2124 case '1':
2125 case '2':
2126 case '3':
2127 case '4':
2128 case '5':
2129 case '6':
2130 case '7':
2131 case '8':
2132 case '9':
2133 {
2134 const char *end = name + len;
2135 while (--end > name) {
2136 if (!isDIGIT(*end))
2137 return FALSE;
2138 }
2139 goto yes;
2140 }
2141 }
2142 } else {
2143
2144
2145 switch (*name) {
2146 case '&':
2147 case '`':
2148 case '\'':
2149 case ':':
2150 case '?':
2151 case '!':
2152 case '-':
2153 case '#':
2154 case '[':
2155 case '^':
2156 case '~':
2157 case '=':
2158 case '%':
2159 case '.':
2160 case '(':
2161 case ')':
2162 case '<':
2163 case '>':
2164 case ',':
2165 case '\\':
2166 case '/':
2167 case '|':
2168 case '+':
2169 case ';':
2170 case ']':
2171 case '\001':
2172 case '\003':
2173 case '\004':
2174 case '\005':
2175 case '\006':
2176 case '\010':
2177 case '\011':
2178 case '\014':
2179 case '\016':
2180 case '\017':
2181 case '\020':
2182 case '\023':
2183 case '\024':
2184 case '\026':
2185 case '\027':
2186 case '1':
2187 case '2':
2188 case '3':
2189 case '4':
2190 case '5':
2191 case '6':
2192 case '7':
2193 case '8':
2194 case '9':
2195 yes:
2196 return TRUE;
2197 default:
2198 break;
2199 }
2200 }
2201 return FALSE;
2202}
2203
2204void
2205Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags)
2206{
2207 dVAR;
2208 U32 hash;
2209
2210 assert(name);
2211 PERL_UNUSED_ARG(flags);
2212
2213 if (len > I32_MAX)
2214 Perl_croak(aTHX_ "panic: gv name too long (%"UVuf")", (UV) len);
2215
2216 if (!(flags & GV_ADD) && GvNAME_HEK(gv)) {
2217 unshare_hek(GvNAME_HEK(gv));
2218 }
2219
2220 PERL_HASH(hash, name, len);
2221 GvNAME_HEK(gv) = share_hek(name, len, hash);
2222}
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233