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