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