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