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