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