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