Silence a gcc warning, spotted by Tels
[p5sagit/p5-mst-13.2.git] / gv.c
CommitLineData
a0d0e21e 1/* gv.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
fdf8c088 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, by Larry Wall and others
79072805 5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e 9 */
10
11/*
12 * 'Mercy!' cried Gandalf. 'If the giving of information is to be the cure
13 * of your inquisitiveness, I shall spend all the rest of my days answering
14 * you. What more do you want to know?'
15 * 'The names of all the stars, and of all living things, and the whole
16 * history of Middle-earth and Over-heaven and of the Sundering Seas,'
17 * laughed Pippin.
79072805 18 */
19
ccfc67b7 20/*
21=head1 GV Functions
166f8a29 22
23A GV is a structure which corresponds to to a Perl typeglob, ie *foo.
24It is a structure that holds a pointer to a scalar, an array, a hash etc,
25corresponding to $foo, @foo, %foo.
26
27GVs are usually found as values in stashes (symbol table hashes) where
28Perl stores its global variables.
29
30=cut
ccfc67b7 31*/
32
79072805 33#include "EXTERN.h"
864dbfa3 34#define PERL_IN_GV_C
79072805 35#include "perl.h"
36
f54cb97a 37static const char S_autoload[] = "AUTOLOAD";
38static const STRLEN S_autolen = sizeof(S_autoload)-1;
5c7983e5 39
c69033f2 40
41#ifdef PERL_DONT_CREATE_GVSV
42GV *
43Perl_gv_SVadd(pTHX_ GV *gv)
44{
45 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
46 Perl_croak(aTHX_ "Bad symbol for scalar");
47 if (!GvSV(gv))
561b68a9 48 GvSV(gv) = newSV(0);
c69033f2 49 return gv;
50}
51#endif
52
79072805 53GV *
864dbfa3 54Perl_gv_AVadd(pTHX_ register GV *gv)
79072805 55{
a0d0e21e 56 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
cea2e8a9 57 Perl_croak(aTHX_ "Bad symbol for array");
79072805 58 if (!GvAV(gv))
59 GvAV(gv) = newAV();
60 return gv;
61}
62
63GV *
864dbfa3 64Perl_gv_HVadd(pTHX_ register GV *gv)
79072805 65{
a0d0e21e 66 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
cea2e8a9 67 Perl_croak(aTHX_ "Bad symbol for hash");
79072805 68 if (!GvHV(gv))
463ee0b2 69 GvHV(gv) = newHV();
79072805 70 return gv;
71}
72
73GV *
864dbfa3 74Perl_gv_IOadd(pTHX_ register GV *gv)
a0d0e21e 75{
97aff369 76 dVAR;
8b5be85c 77 if (!gv || SvTYPE((SV*)gv) != SVt_PVGV) {
78
79 /*
80 * if it walks like a dirhandle, then let's assume that
81 * this is a dirhandle.
82 */
b37c2d43 83 const char * const fh =
666ea192 84 PL_op->op_type == OP_READDIR ||
85 PL_op->op_type == OP_TELLDIR ||
86 PL_op->op_type == OP_SEEKDIR ||
87 PL_op->op_type == OP_REWINDDIR ||
88 PL_op->op_type == OP_CLOSEDIR ?
89 "dirhandle" : "filehandle";
8b5be85c 90 Perl_croak(aTHX_ "Bad symbol for %s", fh);
91 }
92
5bd07a3d 93 if (!GvIOp(gv)) {
7fb37951 94#ifdef GV_UNIQUE_CHECK
95 if (GvUNIQUE(gv)) {
96 Perl_croak(aTHX_ "Bad symbol for filehandle (GV is unique)");
5bd07a3d 97 }
98#endif
a0d0e21e 99 GvIOp(gv) = newIO();
5bd07a3d 100 }
a0d0e21e 101 return gv;
102}
103
104GV *
864dbfa3 105Perl_gv_fetchfile(pTHX_ const char *name)
79072805 106{
97aff369 107 dVAR;
eacec437 108 char smallbuf[256];
53d95988 109 char *tmpbuf;
8ebc5c01 110 STRLEN tmplen;
79072805 111 GV *gv;
112
1d7c1841 113 if (!PL_defstash)
a0714e2c 114 return NULL;
1d7c1841 115
53d95988 116 tmplen = strlen(name) + 2;
117 if (tmplen < sizeof smallbuf)
118 tmpbuf = smallbuf;
119 else
a02a5408 120 Newx(tmpbuf, tmplen + 1, char);
0ac0412a 121 /* This is where the debugger's %{"::_<$filename"} hash is created */
53d95988 122 tmpbuf[0] = '_';
123 tmpbuf[1] = '<';
490a0e98 124 memcpy(tmpbuf + 2, name, tmplen - 1);
3280af22 125 gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE);
1d7c1841 126 if (!isGV(gv)) {
3280af22 127 gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE);
c69033f2 128#ifdef PERL_DONT_CREATE_GVSV
129 GvSV(gv) = newSVpvn(name, tmplen - 2);
130#else
131 sv_setpvn(GvSV(gv), name, tmplen - 2);
132#endif
1d7c1841 133 if (PERLDB_LINE)
a0714e2c 134 hv_magic(GvHVn(gv_AVadd(gv)), NULL, PERL_MAGIC_dbfile);
1d7c1841 135 }
53d95988 136 if (tmpbuf != smallbuf)
137 Safefree(tmpbuf);
79072805 138 return gv;
139}
140
62d55b22 141/*
142=for apidoc gv_const_sv
143
144If C<gv> is a typeglob whose subroutine entry is a constant sub eligible for
145inlining, or C<gv> is a placeholder reference that would be promoted to such
146a typeglob, then returns the value returned by the sub. Otherwise, returns
147NULL.
148
149=cut
150*/
151
152SV *
153Perl_gv_const_sv(pTHX_ GV *gv)
154{
155 if (SvTYPE(gv) == SVt_PVGV)
156 return cv_const_sv(GvCVu(gv));
157 return SvROK(gv) ? SvRV(gv) : NULL;
158}
159
12816592 160GP *
161Perl_newGP(pTHX_ GV *const gv)
162{
163 GP *gp;
666ea192 164 const char *const file = CopFILE(PL_curcop) ? CopFILE(PL_curcop) : "";
f4890806 165 STRLEN len = strlen(file);
166 U32 hash;
167
168 PERL_HASH(hash, file, len);
169
12816592 170 Newxz(gp, 1, GP);
171
172#ifndef PERL_DONT_CREATE_GVSV
173 gp->gv_sv = newSV(0);
174#endif
175
176 gp->gp_line = CopLINE(PL_curcop);
177 /* XXX Ideally this cast would be replaced with a change to const char*
178 in the struct. */
f4890806 179 gp->gp_file_hek = share_hek(file, len, hash);
12816592 180 gp->gp_egv = gv;
181 gp->gp_refcnt = 1;
182
183 return gp;
184}
185
463ee0b2 186void
864dbfa3 187Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
463ee0b2 188{
27da23d5 189 dVAR;
3b6733bf 190 const U32 old_type = SvTYPE(gv);
191 const bool doproto = old_type > SVt_NULL;
b15aece3 192 const char * const proto = (doproto && SvPOK(gv)) ? SvPVX_const(gv) : NULL;
756cb477 193 SV *const has_constant = doproto && SvROK(gv) ? SvRV(gv) : NULL;
1ccdb730 194 const U32 exported_constant = has_constant ? SvPCS_IMPORTED(gv) : 0;
756cb477 195
196 assert (!(proto && has_constant));
197
198 if (has_constant) {
5c1f4d79 199 /* The constant has to be a simple scalar type. */
200 switch (SvTYPE(has_constant)) {
201 case SVt_PVAV:
202 case SVt_PVHV:
203 case SVt_PVCV:
204 case SVt_PVFM:
205 case SVt_PVIO:
206 Perl_croak(aTHX_ "Cannot convert a reference to %s to typeglob",
207 sv_reftype(has_constant, 0));
42d0e0b7 208 default: NOOP;
5c1f4d79 209 }
756cb477 210 SvRV_set(gv, NULL);
211 SvROK_off(gv);
212 }
463ee0b2 213
3b6733bf 214
215 if (old_type < SVt_PVGV) {
216 if (old_type >= SVt_PV)
217 SvCUR_set(gv, 0);
218 sv_upgrade((SV*)gv, SVt_PVGV);
219 }
55d729e4 220 if (SvLEN(gv)) {
221 if (proto) {
f880fe2f 222 SvPV_set(gv, NULL);
b162af07 223 SvLEN_set(gv, 0);
55d729e4 224 SvPOK_off(gv);
225 } else
94010e71 226 Safefree(SvPVX_mutable(gv));
55d729e4 227 }
2e5b91de 228 SvIOK_off(gv);
229 isGV_with_GP_on(gv);
12816592 230
231 GvGP(gv) = Perl_newGP(aTHX_ gv);
e15faf7d 232 GvSTASH(gv) = stash;
233 if (stash)
234 Perl_sv_add_backref(aTHX_ (SV*)stash, (SV*)gv);
ae8cc45f 235 gv_name_set(gv, name, len, GV_ADD);
23ad5bf5 236 if (multi || doproto) /* doproto means it _was_ mentioned */
a5f75d66 237 GvMULTI_on(gv);
55d729e4 238 if (doproto) { /* Replicate part of newSUB here. */
239 ENTER;
756cb477 240 if (has_constant) {
241 /* newCONSTSUB takes ownership of the reference from us. */
242 GvCV(gv) = newCONSTSUB(stash, name, has_constant);
1ccdb730 243 /* If this reference was a copy of another, then the subroutine
244 must have been "imported", by a Perl space assignment to a GV
245 from a reference to CV. */
246 if (exported_constant)
247 GvIMPORTED_CV_on(gv);
756cb477 248 } else {
249 /* XXX unsafe for threads if eval_owner isn't held */
250 (void) start_subparse(0,0); /* Create empty CV in compcv. */
251 GvCV(gv) = PL_compcv;
252 }
55d729e4 253 LEAVE;
254
3280af22 255 PL_sub_generation++;
65c50114 256 CvGV(GvCV(gv)) = gv;
e0d088d0 257 CvFILE_set_from_cop(GvCV(gv), PL_curcop);
3280af22 258 CvSTASH(GvCV(gv)) = PL_curstash;
55d729e4 259 if (proto) {
260 sv_setpv((SV*)GvCV(gv), proto);
261 Safefree(proto);
262 }
263 }
463ee0b2 264}
265
76e3520e 266STATIC void
cea2e8a9 267S_gv_init_sv(pTHX_ GV *gv, I32 sv_type)
a0d0e21e 268{
269 switch (sv_type) {
270 case SVt_PVIO:
271 (void)GvIOn(gv);
272 break;
273 case SVt_PVAV:
274 (void)GvAVn(gv);
275 break;
276 case SVt_PVHV:
277 (void)GvHVn(gv);
278 break;
c69033f2 279#ifdef PERL_DONT_CREATE_GVSV
280 case SVt_NULL:
281 case SVt_PVCV:
282 case SVt_PVFM:
e654831b 283 case SVt_PVGV:
c69033f2 284 break;
285 default:
286 (void)GvSVn(gv);
287#endif
a0d0e21e 288 }
289}
290
954c1994 291/*
292=for apidoc gv_fetchmeth
293
294Returns the glob with the given C<name> and a defined subroutine or
295C<NULL>. The glob lives in the given C<stash>, or in the stashes
07766739 296accessible via @ISA and UNIVERSAL::.
954c1994 297
298The argument C<level> should be either 0 or -1. If C<level==0>, as a
299side-effect creates a glob with the given C<name> in the given C<stash>
300which in the case of success contains an alias for the subroutine, and sets
b267980d 301up caching info for this glob. Similarly for all the searched stashes.
954c1994 302
303This function grants C<"SUPER"> token as a postfix of the stash name. The
304GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
4929bf7b 305visible to Perl code. So when calling C<call_sv>, you should not use
954c1994 306the GV directly; instead, you should use the method's CV, which can be
b267980d 307obtained from the GV with the C<GvCV> macro.
954c1994 308
309=cut
310*/
311
79072805 312GV *
864dbfa3 313Perl_gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level)
79072805 314{
97aff369 315 dVAR;
79072805 316 AV* av;
463ee0b2 317 GV* topgv;
79072805 318 GV* gv;
463ee0b2 319 GV** gvp;
748a9306 320 CV* cv;
bfcb3514 321 const char *hvname;
10edeb5d 322 HV* lastchance = NULL;
a0d0e21e 323
af09ea45 324 /* UNIVERSAL methods should be callable without a stash */
325 if (!stash) {
326 level = -1; /* probably appropriate */
89529cee 327 if(!(stash = gv_stashpvs("UNIVERSAL", FALSE)))
af09ea45 328 return 0;
329 }
330
bfcb3514 331 hvname = HvNAME_get(stash);
332 if (!hvname)
e27ad1f2 333 Perl_croak(aTHX_
334 "Can't use anonymous symbol table for method lookup");
335
44a8e56a 336 if ((level > 100) || (level < -100))
cea2e8a9 337 Perl_croak(aTHX_ "Recursive inheritance detected while looking for method '%s' in package '%s'",
bfcb3514 338 name, hvname);
463ee0b2 339
bfcb3514 340 DEBUG_o( Perl_deb(aTHX_ "Looking for method %s in package %s\n",name,hvname) );
44a8e56a 341
342 gvp = (GV**)hv_fetch(stash, name, len, (level >= 0));
343 if (!gvp)
a0714e2c 344 topgv = NULL;
44a8e56a 345 else {
346 topgv = *gvp;
347 if (SvTYPE(topgv) != SVt_PVGV)
348 gv_init(topgv, stash, name, len, TRUE);
155aba94 349 if ((cv = GvCV(topgv))) {
44a8e56a 350 /* If genuine method or valid cache entry, use it */
3280af22 351 if (!GvCVGEN(topgv) || GvCVGEN(topgv) == PL_sub_generation)
7a4c00b4 352 return topgv;
44a8e56a 353 /* Stale cached entry: junk it */
354 SvREFCNT_dec(cv);
601f1833 355 GvCV(topgv) = cv = NULL;
44a8e56a 356 GvCVGEN(topgv) = 0;
748a9306 357 }
3280af22 358 else if (GvCVGEN(topgv) == PL_sub_generation)
005a453c 359 return 0; /* cache indicates sub doesn't exist */
463ee0b2 360 }
79072805 361
017a3ce5 362 gvp = (GV**)hv_fetchs(stash, "ISA", FALSE);
7d49f689 363 av = (gvp && (gv = *gvp) && gv != (GV*)&PL_sv_undef) ? GvAV(gv) : NULL;
9607fc9c 364
fb73857a 365 /* create and re-create @.*::SUPER::ISA on demand */
366 if (!av || !SvMAGIC(av)) {
7423f6db 367 STRLEN packlen = HvNAMELEN_get(stash);
9607fc9c 368
bfcb3514 369 if (packlen >= 7 && strEQ(hvname + packlen - 7, "::SUPER")) {
9607fc9c 370 HV* basestash;
371
372 packlen -= 7;
bfcb3514 373 basestash = gv_stashpvn(hvname, packlen, TRUE);
017a3ce5 374 gvp = (GV**)hv_fetchs(basestash, "ISA", FALSE);
3280af22 375 if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (av = GvAV(gv))) {
017a3ce5 376 gvp = (GV**)hv_fetchs(stash, "ISA", TRUE);
9607fc9c 377 if (!gvp || !(gv = *gvp))
bfcb3514 378 Perl_croak(aTHX_ "Cannot create %s::ISA", hvname);
9607fc9c 379 if (SvTYPE(gv) != SVt_PVGV)
380 gv_init(gv, stash, "ISA", 3, TRUE);
381 SvREFCNT_dec(GvAV(gv));
b37c2d43 382 GvAV(gv) = (AV*)SvREFCNT_inc_simple(av);
9607fc9c 383 }
384 }
385 }
386
387 if (av) {
79072805 388 SV** svp = AvARRAY(av);
93965878 389 /* NOTE: No support for tied ISA */
390 I32 items = AvFILLp(av) + 1;
79072805 391 while (items--) {
823a54a3 392 SV* const sv = *svp++;
393 HV* const basestash = gv_stashsv(sv, FALSE);
9bbf4081 394 if (!basestash) {
599cee73 395 if (ckWARN(WARN_MISC))
35c1215d 396 Perl_warner(aTHX_ packWARN(WARN_MISC), "Can't locate package %"SVf" for @%s::ISA",
be2597df 397 SVfARG(sv), hvname);
79072805 398 continue;
399 }
44a8e56a 400 gv = gv_fetchmeth(basestash, name, len,
401 (level >= 0) ? level + 1 : level - 1);
402 if (gv)
403 goto gotcha;
79072805 404 }
405 }
a0d0e21e 406
9607fc9c 407 /* if at top level, try UNIVERSAL */
408
44a8e56a 409 if (level == 0 || level == -1) {
10edeb5d 410 lastchance = gv_stashpvs("UNIVERSAL", FALSE);
9607fc9c 411
823a54a3 412 if (lastchance) {
155aba94 413 if ((gv = gv_fetchmeth(lastchance, name, len,
414 (level >= 0) ? level + 1 : level - 1)))
415 {
44a8e56a 416 gotcha:
dc848c6f 417 /*
418 * Cache method in topgv if:
419 * 1. topgv has no synonyms (else inheritance crosses wires)
420 * 2. method isn't a stub (else AUTOLOAD fails spectacularly)
421 */
422 if (topgv &&
423 GvREFCNT(topgv) == 1 &&
424 (cv = GvCV(gv)) &&
425 (CvROOT(cv) || CvXSUB(cv)))
426 {
155aba94 427 if ((cv = GvCV(topgv)))
44a8e56a 428 SvREFCNT_dec(cv);
429 GvCV(topgv) = (CV*)SvREFCNT_inc(GvCV(gv));
3280af22 430 GvCVGEN(topgv) = PL_sub_generation;
44a8e56a 431 }
a0d0e21e 432 return gv;
433 }
005a453c 434 else if (topgv && GvREFCNT(topgv) == 1) {
435 /* cache the fact that the method is not defined */
3280af22 436 GvCVGEN(topgv) = PL_sub_generation;
005a453c 437 }
a0d0e21e 438 }
439 }
440
79072805 441 return 0;
442}
443
954c1994 444/*
611c1e95 445=for apidoc gv_fetchmeth_autoload
446
447Same as gv_fetchmeth(), but looks for autoloaded subroutines too.
448Returns a glob for the subroutine.
449
450For an autoloaded subroutine without a GV, will create a GV even
451if C<level < 0>. For an autoloaded subroutine without a stub, GvCV()
452of the result may be zero.
453
454=cut
455*/
456
457GV *
458Perl_gv_fetchmeth_autoload(pTHX_ HV *stash, const char *name, STRLEN len, I32 level)
459{
460 GV *gv = gv_fetchmeth(stash, name, len, level);
461
462 if (!gv) {
611c1e95 463 CV *cv;
464 GV **gvp;
465
466 if (!stash)
6136c704 467 return NULL; /* UNIVERSAL::AUTOLOAD could cause trouble */
5c7983e5 468 if (len == S_autolen && strnEQ(name, S_autoload, S_autolen))
6136c704 469 return NULL;
5c7983e5 470 if (!(gv = gv_fetchmeth(stash, S_autoload, S_autolen, FALSE)))
6136c704 471 return NULL;
611c1e95 472 cv = GvCV(gv);
473 if (!(CvROOT(cv) || CvXSUB(cv)))
6136c704 474 return NULL;
611c1e95 475 /* Have an autoload */
476 if (level < 0) /* Cannot do without a stub */
477 gv_fetchmeth(stash, name, len, 0);
478 gvp = (GV**)hv_fetch(stash, name, len, (level >= 0));
479 if (!gvp)
6136c704 480 return NULL;
611c1e95 481 return *gvp;
482 }
483 return gv;
484}
485
486/*
954c1994 487=for apidoc gv_fetchmethod_autoload
488
489Returns the glob which contains the subroutine to call to invoke the method
490on the C<stash>. In fact in the presence of autoloading this may be the
491glob for "AUTOLOAD". In this case the corresponding variable $AUTOLOAD is
b267980d 492already setup.
954c1994 493
494The third parameter of C<gv_fetchmethod_autoload> determines whether
495AUTOLOAD lookup is performed if the given method is not present: non-zero
b267980d 496means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
954c1994 497Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
b267980d 498with a non-zero C<autoload> parameter.
954c1994 499
500These functions grant C<"SUPER"> token as a prefix of the method name. Note
501that if you want to keep the returned glob for a long time, you need to
502check for it being "AUTOLOAD", since at the later time the call may load a
503different subroutine due to $AUTOLOAD changing its value. Use the glob
b267980d 504created via a side effect to do this.
954c1994 505
506These functions have the same side-effects and as C<gv_fetchmeth> with
507C<level==0>. C<name> should be writable if contains C<':'> or C<'
508''>. The warning against passing the GV returned by C<gv_fetchmeth> to
b267980d 509C<call_sv> apply equally to these functions.
954c1994 510
511=cut
512*/
513
dc848c6f 514GV *
864dbfa3 515Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload)
dc848c6f 516{
97aff369 517 dVAR;
08105a92 518 register const char *nend;
c445ea15 519 const char *nsplit = NULL;
a0d0e21e 520 GV* gv;
0dae17bd 521 HV* ostash = stash;
522
523 if (stash && SvTYPE(stash) < SVt_PVHV)
5c284bb0 524 stash = NULL;
b267980d 525
463ee0b2 526 for (nend = name; *nend; nend++) {
9607fc9c 527 if (*nend == '\'')
a0d0e21e 528 nsplit = nend;
9607fc9c 529 else if (*nend == ':' && *(nend + 1) == ':')
530 nsplit = ++nend;
a0d0e21e 531 }
532 if (nsplit) {
9d4ba2ae 533 const char * const origname = name;
a0d0e21e 534 name = nsplit + 1;
a0d0e21e 535 if (*nsplit == ':')
536 --nsplit;
9607fc9c 537 if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) {
538 /* ->SUPER::method should really be looked up in original stash */
b37c2d43 539 SV * const tmpstr = sv_2mortal(Perl_newSVpvf(aTHX_ "%s::SUPER",
1d7c1841 540 CopSTASHPV(PL_curcop)));
af09ea45 541 /* __PACKAGE__::SUPER stash should be autovivified */
b15aece3 542 stash = gv_stashpvn(SvPVX_const(tmpstr), SvCUR(tmpstr), TRUE);
cea2e8a9 543 DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n",
bfcb3514 544 origname, HvNAME_get(stash), name) );
4633a7c4 545 }
e189a56d 546 else {
af09ea45 547 /* don't autovifify if ->NoSuchStash::method */
548 stash = gv_stashpvn(origname, nsplit - origname, FALSE);
e189a56d 549
550 /* however, explicit calls to Pkg::SUPER::method may
551 happen, and may require autovivification to work */
552 if (!stash && (nsplit - origname) >= 7 &&
553 strnEQ(nsplit - 7, "::SUPER", 7) &&
554 gv_stashpvn(origname, nsplit - origname - 7, FALSE))
555 stash = gv_stashpvn(origname, nsplit - origname, TRUE);
556 }
0dae17bd 557 ostash = stash;
4633a7c4 558 }
559
9607fc9c 560 gv = gv_fetchmeth(stash, name, nend - name, 0);
a0d0e21e 561 if (!gv) {
2f6e0fe7 562 if (strEQ(name,"import") || strEQ(name,"unimport"))
3280af22 563 gv = (GV*)&PL_sv_yes;
dc848c6f 564 else if (autoload)
0dae17bd 565 gv = gv_autoload4(ostash, name, nend - name, TRUE);
463ee0b2 566 }
dc848c6f 567 else if (autoload) {
9d4ba2ae 568 CV* const cv = GvCV(gv);
09280a33 569 if (!CvROOT(cv) && !CvXSUB(cv)) {
570 GV* stubgv;
571 GV* autogv;
572
573 if (CvANON(cv))
574 stubgv = gv;
575 else {
576 stubgv = CvGV(cv);
577 if (GvCV(stubgv) != cv) /* orphaned import */
578 stubgv = gv;
579 }
580 autogv = gv_autoload4(GvSTASH(stubgv),
581 GvNAME(stubgv), GvNAMELEN(stubgv), TRUE);
dc848c6f 582 if (autogv)
583 gv = autogv;
584 }
585 }
44a8e56a 586
587 return gv;
588}
589
590GV*
864dbfa3 591Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
44a8e56a 592{
27da23d5 593 dVAR;
44a8e56a 594 GV* gv;
595 CV* cv;
596 HV* varstash;
597 GV* vargv;
598 SV* varsv;
e1ec3a88 599 const char *packname = "";
eae70eaa 600 STRLEN packname_len = 0;
44a8e56a 601
5c7983e5 602 if (len == S_autolen && strnEQ(name, S_autoload, S_autolen))
a0714e2c 603 return NULL;
0dae17bd 604 if (stash) {
605 if (SvTYPE(stash) < SVt_PVHV) {
e62f0680 606 packname = SvPV_const((SV*)stash, packname_len);
5c284bb0 607 stash = NULL;
0dae17bd 608 }
609 else {
bfcb3514 610 packname = HvNAME_get(stash);
7423f6db 611 packname_len = HvNAMELEN_get(stash);
0dae17bd 612 }
613 }
5c7983e5 614 if (!(gv = gv_fetchmeth(stash, S_autoload, S_autolen, FALSE)))
a0714e2c 615 return NULL;
dc848c6f 616 cv = GvCV(gv);
617
adb5a9ae 618 if (!(CvROOT(cv) || CvXSUB(cv)))
a0714e2c 619 return NULL;
ed850460 620
dc848c6f 621 /*
622 * Inheriting AUTOLOAD for non-methods works ... for now.
623 */
041457d9 624 if (!method && (GvCVGEN(gv) || GvSTASH(gv) != stash)
625 && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)
626 )
12bcd1a6 627 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
dc848c6f 628 "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
0dae17bd 629 packname, (int)len, name);
44a8e56a 630
aed2304a 631 if (CvISXSUB(cv)) {
adb5a9ae 632 /* rather than lookup/init $AUTOLOAD here
633 * only to have the XSUB do another lookup for $AUTOLOAD
634 * and split that value on the last '::',
635 * pass along the same data via some unused fields in the CV
636 */
637 CvSTASH(cv) = stash;
f880fe2f 638 SvPV_set(cv, (char *)name); /* cast to lose constness warning */
b162af07 639 SvCUR_set(cv, len);
adb5a9ae 640 return gv;
641 }
adb5a9ae 642
44a8e56a 643 /*
644 * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name.
645 * The subroutine's original name may not be "AUTOLOAD", so we don't
646 * use that, but for lack of anything better we will use the sub's
647 * original package to look up $AUTOLOAD.
648 */
649 varstash = GvSTASH(CvGV(cv));
5c7983e5 650 vargv = *(GV**)hv_fetch(varstash, S_autoload, S_autolen, TRUE);
3d35f11b 651 ENTER;
652
c69033f2 653 if (!isGV(vargv)) {
5c7983e5 654 gv_init(vargv, varstash, S_autoload, S_autolen, FALSE);
c69033f2 655#ifdef PERL_DONT_CREATE_GVSV
561b68a9 656 GvSV(vargv) = newSV(0);
c69033f2 657#endif
658 }
3d35f11b 659 LEAVE;
e203899d 660 varsv = GvSVn(vargv);
7423f6db 661 sv_setpvn(varsv, packname, packname_len);
396482e1 662 sv_catpvs(varsv, "::");
44a8e56a 663 sv_catpvn(varsv, name, len);
a0d0e21e 664 return gv;
665}
666
44a2ac75 667
668/* require_tie_mod() internal routine for requiring a module
669 * that implements the logic of automatical ties like %! and %-
670 *
671 * The "gv" parameter should be the glob.
672 * "varpv" holds the name of the var, used for error messages
673 * "namesv" holds the module name
674 * "methpv" holds the method name to test for to check that things
675 * are working reasonably close to as expected
676 * "flags" if flag & 1 then save the scalar before loading.
677 * For the protection of $! to work (it is set by this routine)
678 * the sv slot must already be magicalized.
d2c93421 679 */
44a2ac75 680STATIC HV*
681S_require_tie_mod(pTHX_ GV *gv, const char *varpv, SV* namesv, const char *methpv,const U32 flags)
d2c93421 682{
27da23d5 683 dVAR;
44a2ac75 684 HV* stash = gv_stashsv(namesv, FALSE);
685
686 if (!stash || !(gv_fetchmethod(stash, methpv))) {
687 SV *module = newSVsv(namesv);
d2c93421 688 dSP;
689 PUTBACK;
690 ENTER;
44a2ac75 691 if ( flags & 1 )
692 save_scalar(gv);
693 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, module, NULL);
d2c93421 694 LEAVE;
695 SPAGAIN;
44a2ac75 696 stash = gv_stashsv(namesv, FALSE);
697 if (!stash)
698 Perl_croak( aTHX_ "panic: Can't use %%%s because %"SVf" is not available",
699 varpv, module);
700 else if (!gv_fetchmethod(stash, methpv))
701 Perl_croak( aTHX_ "panic: Can't use %%%s because %"SVf" does not support method %s",
702 varpv, module, methpv);
d2c93421 703 }
44a2ac75 704 return stash;
d2c93421 705}
706
954c1994 707/*
708=for apidoc gv_stashpv
709
386d01d6 710Returns a pointer to the stash for a specified package. C<name> should
bc96cb06 711be a valid UTF-8 string and must be null-terminated. If C<create> is set
712then the package will be created if it does not already exist. If C<create>
713is not set and the package does not exist then NULL is returned.
954c1994 714
715=cut
716*/
717
a0d0e21e 718HV*
864dbfa3 719Perl_gv_stashpv(pTHX_ const char *name, I32 create)
a0d0e21e 720{
dc437b57 721 return gv_stashpvn(name, strlen(name), create);
722}
723
bc96cb06 724/*
725=for apidoc gv_stashpvn
726
727Returns a pointer to the stash for a specified package. C<name> should
728be a valid UTF-8 string. The C<namelen> parameter indicates the length of
729the C<name>, in bytes. If C<create> is set then the package will be
730created if it does not already exist. If C<create> is not set and the
731package does not exist then NULL is returned.
732
733=cut
734*/
735
dc437b57 736HV*
864dbfa3 737Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 create)
dc437b57 738{
0cea0058 739 char smallbuf[128];
46fc3d4c 740 char *tmpbuf;
a0d0e21e 741 HV *stash;
742 GV *tmpgv;
dc437b57 743
46fc3d4c 744 if (namelen + 3 < sizeof smallbuf)
745 tmpbuf = smallbuf;
746 else
a02a5408 747 Newx(tmpbuf, namelen + 3, char);
dc437b57 748 Copy(name,tmpbuf,namelen,char);
749 tmpbuf[namelen++] = ':';
750 tmpbuf[namelen++] = ':';
751 tmpbuf[namelen] = '\0';
9fb9dfd8 752 tmpgv = gv_fetchpvn_flags(tmpbuf, namelen, create, SVt_PVHV);
46fc3d4c 753 if (tmpbuf != smallbuf)
754 Safefree(tmpbuf);
a0d0e21e 755 if (!tmpgv)
756 return 0;
757 if (!GvHV(tmpgv))
758 GvHV(tmpgv) = newHV();
759 stash = GvHV(tmpgv);
bfcb3514 760 if (!HvNAME_get(stash))
51a37f80 761 hv_name_set(stash, name, namelen, 0);
a0d0e21e 762 return stash;
463ee0b2 763}
764
954c1994 765/*
766=for apidoc gv_stashsv
767
386d01d6 768Returns a pointer to the stash for a specified package, which must be a
769valid UTF-8 string. See C<gv_stashpv>.
954c1994 770
771=cut
772*/
773
a0d0e21e 774HV*
864dbfa3 775Perl_gv_stashsv(pTHX_ SV *sv, I32 create)
a0d0e21e 776{
dc437b57 777 STRLEN len;
9d4ba2ae 778 const char * const ptr = SvPV_const(sv,len);
dc437b57 779 return gv_stashpvn(ptr, len, create);
a0d0e21e 780}
781
782
463ee0b2 783GV *
7a5fd60d 784Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type) {
b7787f18 785 return gv_fetchpvn_flags(nambeg, strlen(nambeg), add, sv_type);
7a5fd60d 786}
787
788GV *
789Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, I32 sv_type) {
790 STRLEN len;
9d4ba2ae 791 const char * const nambeg = SvPV_const(name, len);
7a5fd60d 792 return gv_fetchpvn_flags(nambeg, len, flags | SvUTF8(name), sv_type);
793}
794
795GV *
796Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
797 I32 sv_type)
79072805 798{
97aff369 799 dVAR;
08105a92 800 register const char *name = nambeg;
c445ea15 801 register GV *gv = NULL;
79072805 802 GV**gvp;
79072805 803 I32 len;
b3d904f3 804 register const char *name_cursor;
c445ea15 805 HV *stash = NULL;
add2581e 806 const I32 no_init = flags & (GV_NOADD_NOINIT | GV_NOINIT);
e26df76a 807 const I32 no_expand = flags & GV_NOEXPAND;
fafc274c 808 const I32 add =
809 flags & ~SVf_UTF8 & ~GV_NOADD_NOINIT & ~GV_NOEXPAND & ~GV_NOTQUAL;
b3d904f3 810 const char *const name_end = nambeg + full_len;
811 const char *const name_em1 = name_end - 1;
79072805 812
fafc274c 813 if (flags & GV_NOTQUAL) {
814 /* Caller promised that there is no stash, so we can skip the check. */
815 len = full_len;
816 goto no_stash;
817 }
818
b208e10c 819 if (full_len > 2 && *name == '*' && isALPHA(name[1])) {
820 /* accidental stringify on a GV? */
c07a80fd 821 name++;
b208e10c 822 }
c07a80fd 823
b3d904f3 824 for (name_cursor = name; name_cursor < name_end; name_cursor++) {
825 if ((*name_cursor == ':' && name_cursor < name_em1
826 && name_cursor[1] == ':')
827 || (*name_cursor == '\'' && name_cursor[1]))
463ee0b2 828 {
463ee0b2 829 if (!stash)
3280af22 830 stash = PL_defstash;
dc437b57 831 if (!stash || !SvREFCNT(stash)) /* symbol table under destruction */
a0714e2c 832 return NULL;
463ee0b2 833
b3d904f3 834 len = name_cursor - name;
85e6fe83 835 if (len > 0) {
0cea0058 836 char smallbuf[128];
62b57502 837 char *tmpbuf;
62b57502 838
bb7a0f54 839 if (len + 3 < (I32)sizeof (smallbuf))
3c78fafa 840 tmpbuf = smallbuf;
62b57502 841 else
a02a5408 842 Newx(tmpbuf, len+3, char);
a0d0e21e 843 Copy(name, tmpbuf, len, char);
844 tmpbuf[len++] = ':';
845 tmpbuf[len++] = ':';
846 tmpbuf[len] = '\0';
463ee0b2 847 gvp = (GV**)hv_fetch(stash,tmpbuf,len,add);
a0714e2c 848 gv = gvp ? *gvp : NULL;
3280af22 849 if (gv && gv != (GV*)&PL_sv_undef) {
6fa846a0 850 if (SvTYPE(gv) != SVt_PVGV)
0f303493 851 gv_init(gv, stash, tmpbuf, len, (add & GV_ADDMULTI));
6fa846a0 852 else
853 GvMULTI_on(gv);
854 }
3c78fafa 855 if (tmpbuf != smallbuf)
62b57502 856 Safefree(tmpbuf);
3280af22 857 if (!gv || gv == (GV*)&PL_sv_undef)
a0714e2c 858 return NULL;
85e6fe83 859
463ee0b2 860 if (!(stash = GvHV(gv)))
861 stash = GvHV(gv) = newHV();
85e6fe83 862
bfcb3514 863 if (!HvNAME_get(stash))
b3d904f3 864 hv_name_set(stash, nambeg, name_cursor - nambeg, 0);
463ee0b2 865 }
866
b3d904f3 867 if (*name_cursor == ':')
868 name_cursor++;
869 name_cursor++;
870 name = name_cursor;
ad6bfa9d 871 if (name == name_end)
017a3ce5 872 return gv ? gv : (GV*)*hv_fetchs(PL_defstash, "main::", TRUE);
79072805 873 }
79072805 874 }
b3d904f3 875 len = name_cursor - name;
463ee0b2 876
877 /* No stash in name, so see how we can default */
878
879 if (!stash) {
fafc274c 880 no_stash:
8ccce9ae 881 if (len && isIDFIRST_lazy(name)) {
9607fc9c 882 bool global = FALSE;
883
8ccce9ae 884 switch (len) {
885 case 1:
18ea00d7 886 if (*name == '_')
9d116dd7 887 global = TRUE;
18ea00d7 888 break;
8ccce9ae 889 case 3:
890 if ((name[0] == 'I' && name[1] == 'N' && name[2] == 'C')
891 || (name[0] == 'E' && name[1] == 'N' && name[2] == 'V')
892 || (name[0] == 'S' && name[1] == 'I' && name[2] == 'G'))
9d116dd7 893 global = TRUE;
18ea00d7 894 break;
8ccce9ae 895 case 4:
896 if (name[0] == 'A' && name[1] == 'R' && name[2] == 'G'
897 && name[3] == 'V')
9d116dd7 898 global = TRUE;
18ea00d7 899 break;
8ccce9ae 900 case 5:
901 if (name[0] == 'S' && name[1] == 'T' && name[2] == 'D'
902 && name[3] == 'I' && name[4] == 'N')
463ee0b2 903 global = TRUE;
18ea00d7 904 break;
8ccce9ae 905 case 6:
906 if ((name[0] == 'S' && name[1] == 'T' && name[2] == 'D')
907 &&((name[3] == 'O' && name[4] == 'U' && name[5] == 'T')
908 ||(name[3] == 'E' && name[4] == 'R' && name[5] == 'R')))
909 global = TRUE;
910 break;
911 case 7:
912 if (name[0] == 'A' && name[1] == 'R' && name[2] == 'G'
913 && name[3] == 'V' && name[4] == 'O' && name[5] == 'U'
914 && name[6] == 'T')
18ea00d7 915 global = TRUE;
916 break;
463ee0b2 917 }
9607fc9c 918
463ee0b2 919 if (global)
3280af22 920 stash = PL_defstash;
923e4eb5 921 else if (IN_PERL_COMPILETIME) {
3280af22 922 stash = PL_curstash;
923 if (add && (PL_hints & HINT_STRICT_VARS) &&
748a9306 924 sv_type != SVt_PVCV &&
925 sv_type != SVt_PVGV &&
4633a7c4 926 sv_type != SVt_PVFM &&
c07a80fd 927 sv_type != SVt_PVIO &&
70ec6265 928 !(len == 1 && sv_type == SVt_PV &&
929 (*name == 'a' || *name == 'b')) )
748a9306 930 {
4633a7c4 931 gvp = (GV**)hv_fetch(stash,name,len,0);
932 if (!gvp ||
3280af22 933 *gvp == (GV*)&PL_sv_undef ||
a5f75d66 934 SvTYPE(*gvp) != SVt_PVGV)
935 {
d4c19fe8 936 stash = NULL;
a5f75d66 937 }
155aba94 938 else if ((sv_type == SVt_PV && !GvIMPORTED_SV(*gvp)) ||
939 (sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp)) ||
940 (sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp)) )
4633a7c4 941 {
cea2e8a9 942 Perl_warn(aTHX_ "Variable \"%c%s\" is not imported",
4633a7c4 943 sv_type == SVt_PVAV ? '@' :
944 sv_type == SVt_PVHV ? '%' : '$',
945 name);
8ebc5c01 946 if (GvCVu(*gvp))
cc507455 947 Perl_warn(aTHX_ "\t(Did you mean &%s instead?)\n", name);
d4c19fe8 948 stash = NULL;
4633a7c4 949 }
a0d0e21e 950 }
85e6fe83 951 }
463ee0b2 952 else
1d7c1841 953 stash = CopSTASH(PL_curcop);
463ee0b2 954 }
955 else
3280af22 956 stash = PL_defstash;
463ee0b2 957 }
958
959 /* By this point we should have a stash and a name */
960
a0d0e21e 961 if (!stash) {
5a844595 962 if (add) {
9d4ba2ae 963 SV * const err = Perl_mess(aTHX_
5a844595 964 "Global symbol \"%s%s\" requires explicit package name",
965 (sv_type == SVt_PV ? "$"
966 : sv_type == SVt_PVAV ? "@"
967 : sv_type == SVt_PVHV ? "%"
608b3986 968 : ""), name);
e7f343b6 969 GV *gv;
608b3986 970 if (USE_UTF8_IN_NAMES)
971 SvUTF8_on(err);
972 qerror(err);
e7f343b6 973 gv = gv_fetchpvn_flags("<none>::", 8, GV_ADDMULTI, SVt_PVHV);
974 if(!gv) {
975 /* symbol table under destruction */
976 return NULL;
977 }
978 stash = GvHV(gv);
a0d0e21e 979 }
d7aacf4e 980 else
a0714e2c 981 return NULL;
a0d0e21e 982 }
983
984 if (!SvREFCNT(stash)) /* symbol table under destruction */
a0714e2c 985 return NULL;
a0d0e21e 986
79072805 987 gvp = (GV**)hv_fetch(stash,name,len,add);
3280af22 988 if (!gvp || *gvp == (GV*)&PL_sv_undef)
a0714e2c 989 return NULL;
79072805 990 gv = *gvp;
991 if (SvTYPE(gv) == SVt_PVGV) {
a0d0e21e 992 if (add) {
a5f75d66 993 GvMULTI_on(gv);
a0d0e21e 994 gv_init_sv(gv, sv_type);
44a2ac75 995 if (sv_type == SVt_PVHV && len == 1 ) {
996 if (*name == '!')
997 require_tie_mod(gv, "!", newSVpvs("Errno"), "TIEHASH", 1);
998 else
999 if (*name == '-' || *name == '+')
1000 require_tie_mod(gv, name, newSVpvs("re::Tie::Hash::NamedCapture"), "FETCH", 0);
1001
1002 }
a0d0e21e 1003 }
79072805 1004 return gv;
add2581e 1005 } else if (no_init) {
55d729e4 1006 return gv;
e26df76a 1007 } else if (no_expand && SvROK(gv)) {
1008 return gv;
79072805 1009 }
93a17b20 1010
1011 /* Adding a new symbol */
1012
0453d815 1013 if (add & GV_ADDWARN && ckWARN_d(WARN_INTERNAL))
9014280d 1014 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Had to create %s unexpectedly", nambeg);
55d729e4 1015 gv_init(gv, stash, name, len, add & GV_ADDMULTI);
a0d0e21e 1016 gv_init_sv(gv, sv_type);
93a17b20 1017
a0288114 1018 if (isALPHA(name[0]) && ! (isLEXWARN_on ? ckWARN(WARN_ONCE)
7272584d 1019 : (PL_dowarn & G_WARN_ON ) ) )
0453d815 1020 GvMULTI_on(gv) ;
1021
93a17b20 1022 /* set up magic where warranted */
cc4c2da6 1023 if (len > 1) {
9431620d 1024#ifndef EBCDIC
cc4c2da6 1025 if (*name > 'V' ) {
6f207bd3 1026 NOOP;
cc4c2da6 1027 /* Nothing else to do.
91f565cb 1028 The compiler will probably turn the switch statement into a
cc4c2da6 1029 branch table. Make sure we avoid even that small overhead for
1030 the common case of lower case variable names. */
9431620d 1031 } else
1032#endif
1033 {
b464bac0 1034 const char * const name2 = name + 1;
cc4c2da6 1035 switch (*name) {
1036 case 'A':
1037 if (strEQ(name2, "RGV")) {
1038 IoFLAGS(GvIOn(gv)) |= IOf_ARGV|IOf_START;
1039 }
7b8203e3 1040 else if (strEQ(name2, "RGVOUT")) {
1041 GvMULTI_on(gv);
1042 }
cc4c2da6 1043 break;
1044 case 'E':
1045 if (strnEQ(name2, "XPORT", 5))
1046 GvMULTI_on(gv);
1047 break;
1048 case 'I':
1049 if (strEQ(name2, "SA")) {
9d4ba2ae 1050 AV* const av = GvAVn(gv);
cc4c2da6 1051 GvMULTI_on(gv);
bd61b366 1052 sv_magic((SV*)av, (SV*)gv, PERL_MAGIC_isa, NULL, 0);
cc4c2da6 1053 /* NOTE: No support for tied ISA */
1054 if ((add & GV_ADDMULTI) && strEQ(nambeg,"AnyDBM_File::ISA")
1055 && AvFILLp(av) == -1)
1056 {
e1ec3a88 1057 const char *pname;
cc4c2da6 1058 av_push(av, newSVpvn(pname = "NDBM_File",9));
1059 gv_stashpvn(pname, 9, TRUE);
1060 av_push(av, newSVpvn(pname = "DB_File",7));
1061 gv_stashpvn(pname, 7, TRUE);
1062 av_push(av, newSVpvn(pname = "GDBM_File",9));
1063 gv_stashpvn(pname, 9, TRUE);
1064 av_push(av, newSVpvn(pname = "SDBM_File",9));
1065 gv_stashpvn(pname, 9, TRUE);
1066 av_push(av, newSVpvn(pname = "ODBM_File",9));
1067 gv_stashpvn(pname, 9, TRUE);
1068 }
1069 }
1070 break;
1071 case 'O':
1072 if (strEQ(name2, "VERLOAD")) {
9d4ba2ae 1073 HV* const hv = GvHVn(gv);
cc4c2da6 1074 GvMULTI_on(gv);
a0714e2c 1075 hv_magic(hv, NULL, PERL_MAGIC_overload);
cc4c2da6 1076 }
1077 break;
1078 case 'S':
1079 if (strEQ(name2, "IG")) {
1080 HV *hv;
1081 I32 i;
1082 if (!PL_psig_ptr) {
a02a5408 1083 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
1084 Newxz(PL_psig_name, SIG_SIZE, SV*);
1085 Newxz(PL_psig_pend, SIG_SIZE, int);
cc4c2da6 1086 }
1087 GvMULTI_on(gv);
1088 hv = GvHVn(gv);
a0714e2c 1089 hv_magic(hv, NULL, PERL_MAGIC_sig);
cc4c2da6 1090 for (i = 1; i < SIG_SIZE; i++) {
551405c4 1091 SV * const * const init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1);
cc4c2da6 1092 if (init)
1093 sv_setsv(*init, &PL_sv_undef);
1094 PL_psig_ptr[i] = 0;
1095 PL_psig_name[i] = 0;
1096 PL_psig_pend[i] = 0;
1097 }
1098 }
1099 break;
1100 case 'V':
1101 if (strEQ(name2, "ERSION"))
1102 GvMULTI_on(gv);
1103 break;
e5218da5 1104 case '\003': /* $^CHILD_ERROR_NATIVE */
1105 if (strEQ(name2, "HILD_ERROR_NATIVE"))
1106 goto magicalize;
1107 break;
cc4c2da6 1108 case '\005': /* $^ENCODING */
1109 if (strEQ(name2, "NCODING"))
1110 goto magicalize;
1111 break;
1112 case '\017': /* $^OPEN */
1113 if (strEQ(name2, "PEN"))
1114 goto magicalize;
1115 break;
1116 case '\024': /* ${^TAINT} */
1117 if (strEQ(name2, "AINT"))
1118 goto ro_magicalize;
1119 break;
7cebcbc0 1120 case '\025': /* ${^UNICODE}, ${^UTF8LOCALE} */
a0288114 1121 if (strEQ(name2, "NICODE"))
cc4c2da6 1122 goto ro_magicalize;
a0288114 1123 if (strEQ(name2, "TF8LOCALE"))
7cebcbc0 1124 goto ro_magicalize;
e07ea26a 1125 if (strEQ(name2, "TF8CACHE"))
1126 goto magicalize;
cc4c2da6 1127 break;
1128 case '\027': /* $^WARNING_BITS */
1129 if (strEQ(name2, "ARNING_BITS"))
1130 goto magicalize;
1131 break;
1132 case '1':
1133 case '2':
1134 case '3':
1135 case '4':
1136 case '5':
1137 case '6':
1138 case '7':
1139 case '8':
1140 case '9':
85e6fe83 1141 {
cc4c2da6 1142 /* ensures variable is only digits */
1143 /* ${"1foo"} fails this test (and is thus writeable) */
1144 /* added by japhy, but borrowed from is_gv_magical */
1145 const char *end = name + len;
1146 while (--end > name) {
1147 if (!isDIGIT(*end)) return gv;
1148 }
1149 goto ro_magicalize;
1d7c1841 1150 }
dc437b57 1151 }
93a17b20 1152 }
392db708 1153 } else {
1154 /* Names of length 1. (Or 0. But name is NUL terminated, so that will
1155 be case '\0' in this switch statement (ie a default case) */
cc4c2da6 1156 switch (*name) {
1157 case '&':
1158 case '`':
1159 case '\'':
1160 if (
1161 sv_type == SVt_PVAV ||
1162 sv_type == SVt_PVHV ||
1163 sv_type == SVt_PVCV ||
1164 sv_type == SVt_PVFM ||
1165 sv_type == SVt_PVIO
1166 ) { break; }
1167 PL_sawampersand = TRUE;
1168 goto ro_magicalize;
1169
1170 case ':':
c69033f2 1171 sv_setpv(GvSVn(gv),PL_chopset);
cc4c2da6 1172 goto magicalize;
1173
1174 case '?':
ff0cee69 1175#ifdef COMPLEX_STATUS
c69033f2 1176 SvUPGRADE(GvSVn(gv), SVt_PVLV);
ff0cee69 1177#endif
cc4c2da6 1178 goto magicalize;
ff0cee69 1179
cc4c2da6 1180 case '!':
44a2ac75 1181 GvMULTI_on(gv);
1182 /* If %! has been used, automatically load Errno.pm. */
d2c93421 1183
c69033f2 1184 sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
d2c93421 1185
44a2ac75 1186 /* magicalization must be done before require_tie_mod is called */
cc4c2da6 1187 if (sv_type == SVt_PVHV)
44a2ac75 1188 require_tie_mod(gv, "!", newSVpvs("Errno"), "TIEHASH", 1);
d2c93421 1189
6cef1e77 1190 break;
cc4c2da6 1191 case '-':
44a2ac75 1192 case '+':
1193 GvMULTI_on(gv); /* no used once warnings here */
1194 {
1195 bool plus = (*name == '+');
1196 SV *stashname = newSVpvs("re::Tie::Hash::NamedCapture");
1197 AV* const av = GvAVn(gv);
1198 HV *const hv = GvHVn(gv);
1199 HV *const hv_tie = newHV();
1200 SV *tie = newRV_noinc((SV*)hv_tie);
1201
1202 sv_bless(tie, gv_stashsv(stashname,1));
1203 hv_magic(hv, (GV*)tie, PERL_MAGIC_tied);
1204 sv_magic((SV*)av, (plus ? (SV*)av : NULL), PERL_MAGIC_regdata, NULL, 0);
1205 sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
1206
1207 if (plus)
1208 SvREADONLY_on(GvSVn(gv));
1209 else
1210 Perl_hv_store(aTHX_ hv_tie, STR_WITH_LEN("all"), newSViv(1), 0);
1211
1212 SvREADONLY_on(hv);
1213 SvREADONLY_on(tie);
1214 SvREADONLY_on(av);
1215
1216 if (sv_type == SVt_PVHV)
1217 require_tie_mod(gv, name, stashname, "FETCH", 0);
1218
1219 break;
cc4c2da6 1220 }
1221 case '*':
cc4c2da6 1222 case '#':
1223 if (sv_type == SVt_PV && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
1224 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
8ae1fe26 1225 "$%c is no longer supported", *name);
1226 break;
cc4c2da6 1227 case '|':
c69033f2 1228 sv_setiv(GvSVn(gv), (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0);
cc4c2da6 1229 goto magicalize;
1230
b3ca2e83 1231 case '\010': /* $^H */
1232 {
1233 HV *const hv = GvHVn(gv);
1234 hv_magic(hv, NULL, PERL_MAGIC_hints);
1235 }
1236 goto magicalize;
cc4c2da6 1237 case '\023': /* $^S */
1238 case '1':
1239 case '2':
1240 case '3':
1241 case '4':
1242 case '5':
1243 case '6':
1244 case '7':
1245 case '8':
1246 case '9':
1247 ro_magicalize:
c69033f2 1248 SvREADONLY_on(GvSVn(gv));
cc4c2da6 1249 /* FALL THROUGH */
1250 case '[':
1251 case '^':
1252 case '~':
1253 case '=':
1254 case '%':
1255 case '.':
1256 case '(':
1257 case ')':
1258 case '<':
1259 case '>':
1260 case ',':
1261 case '\\':
1262 case '/':
1263 case '\001': /* $^A */
1264 case '\003': /* $^C */
1265 case '\004': /* $^D */
1266 case '\005': /* $^E */
1267 case '\006': /* $^F */
cc4c2da6 1268 case '\011': /* $^I, NOT \t in EBCDIC */
1269 case '\016': /* $^N */
1270 case '\017': /* $^O */
1271 case '\020': /* $^P */
1272 case '\024': /* $^T */
1273 case '\027': /* $^W */
1274 magicalize:
c69033f2 1275 sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
cc4c2da6 1276 break;
e521374c 1277
cc4c2da6 1278 case '\014': /* $^L */
c69033f2 1279 sv_setpvn(GvSVn(gv),"\f",1);
1280 PL_formfeed = GvSVn(gv);
463ee0b2 1281 break;
cc4c2da6 1282 case ';':
c69033f2 1283 sv_setpvn(GvSVn(gv),"\034",1);
463ee0b2 1284 break;
cc4c2da6 1285 case ']':
1286 {
c69033f2 1287 SV * const sv = GvSVn(gv);
d7aa5382 1288 if (!sv_derived_from(PL_patchlevel, "version"))
7a5b473e 1289 upg_version(PL_patchlevel);
7d54d38e 1290 GvSV(gv) = vnumify(PL_patchlevel);
1291 SvREADONLY_on(GvSV(gv));
1292 SvREFCNT_dec(sv);
93a17b20 1293 }
1294 break;
cc4c2da6 1295 case '\026': /* $^V */
1296 {
c69033f2 1297 SV * const sv = GvSVn(gv);
f9be5ac8 1298 GvSV(gv) = new_version(PL_patchlevel);
1299 SvREADONLY_on(GvSV(gv));
1300 SvREFCNT_dec(sv);
16070b82 1301 }
1302 break;
cc4c2da6 1303 }
79072805 1304 }
93a17b20 1305 return gv;
79072805 1306}
1307
1308void
35a4481c 1309Perl_gv_fullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain)
43693395 1310{
35a4481c 1311 const char *name;
7423f6db 1312 STRLEN namelen;
35a4481c 1313 const HV * const hv = GvSTASH(gv);
43693395 1314 if (!hv) {
0c34ef67 1315 SvOK_off(sv);
43693395 1316 return;
1317 }
666ea192 1318 sv_setpv(sv, prefix ? prefix : "");
a0288114 1319
bfcb3514 1320 name = HvNAME_get(hv);
7423f6db 1321 if (name) {
1322 namelen = HvNAMELEN_get(hv);
1323 } else {
e27ad1f2 1324 name = "__ANON__";
7423f6db 1325 namelen = 8;
1326 }
a0288114 1327
e27ad1f2 1328 if (keepmain || strNE(name, "main")) {
7423f6db 1329 sv_catpvn(sv,name,namelen);
396482e1 1330 sv_catpvs(sv,"::");
43693395 1331 }
257984c0 1332 sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
43693395 1333}
1334
1335void
35a4481c 1336Perl_gv_efullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain)
43693395 1337{
46c461b5 1338 const GV * const egv = GvEGV(gv);
1339 gv_fullname4(sv, egv ? egv : gv, prefix, keepmain);
43693395 1340}
1341
79072805 1342IO *
864dbfa3 1343Perl_newIO(pTHX)
79072805 1344{
97aff369 1345 dVAR;
8990e307 1346 GV *iogv;
561b68a9 1347 IO * const io = (IO*)newSV(0);
8990e307 1348
a0d0e21e 1349 sv_upgrade((SV *)io,SVt_PVIO);
158623e7 1350 /* This used to read SvREFCNT(io) = 1;
1351 It's not clear why the reference count needed an explicit reset. NWC
1352 */
1353 assert (SvREFCNT(io) == 1);
8990e307 1354 SvOBJECT_on(io);
b464bac0 1355 /* Clear the stashcache because a new IO could overrule a package name */
081fc587 1356 hv_clear(PL_stashcache);
71315bf2 1357 iogv = gv_fetchpvs("FileHandle::", 0, SVt_PVHV);
5f2d631d 1358 /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */
1359 if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv))))
71315bf2 1360 iogv = gv_fetchpvs("IO::Handle::", GV_ADD, SVt_PVHV);
b162af07 1361 SvSTASH_set(io, (HV*)SvREFCNT_inc(GvHV(iogv)));
79072805 1362 return io;
1363}
1364
1365void
1146e912 1366Perl_gv_check(pTHX_ const HV *stash)
79072805 1367{
97aff369 1368 dVAR;
79072805 1369 register I32 i;
463ee0b2 1370
8990e307 1371 if (!HvARRAY(stash))
1372 return;
a0d0e21e 1373 for (i = 0; i <= (I32) HvMAX(stash); i++) {
e1ec3a88 1374 const HE *entry;
dc437b57 1375 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
b7787f18 1376 register GV *gv;
1377 HV *hv;
dc437b57 1378 if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
b862623f 1379 (gv = (GV*)HeVAL(entry)) && isGV(gv) && (hv = GvHV(gv)))
a0d0e21e 1380 {
19b6c847 1381 if (hv != PL_defstash && hv != stash)
a0d0e21e 1382 gv_check(hv); /* nested package */
1383 }
dc437b57 1384 else if (isALPHA(*HeKEY(entry))) {
e1ec3a88 1385 const char *file;
dc437b57 1386 gv = (GV*)HeVAL(entry);
55d729e4 1387 if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
463ee0b2 1388 continue;
1d7c1841 1389 file = GvFILE(gv);
1390 /* performance hack: if filename is absolute and it's a standard
1391 * module, don't bother warning */
6eb630b7 1392#ifdef MACOS_TRADITIONAL
551405c4 1393# define LIB_COMPONENT ":lib:"
6eb630b7 1394#else
551405c4 1395# define LIB_COMPONENT "/lib/"
6eb630b7 1396#endif
551405c4 1397 if (file
1398 && PERL_FILE_IS_ABSOLUTE(file)
1399 && (instr(file, LIB_COMPONENT) || instr(file, ".pm")))
1d7c1841 1400 {
8990e307 1401 continue;
1d7c1841 1402 }
1403 CopLINE_set(PL_curcop, GvLINE(gv));
1404#ifdef USE_ITHREADS
dd374669 1405 CopFILE(PL_curcop) = (char *)file; /* set for warning */
1d7c1841 1406#else
1407 CopFILEGV(PL_curcop) = gv_fetchfile(file);
1408#endif
9014280d 1409 Perl_warner(aTHX_ packWARN(WARN_ONCE),
599cee73 1410 "Name \"%s::%s\" used only once: possible typo",
bfcb3514 1411 HvNAME_get(stash), GvNAME(gv));
463ee0b2 1412 }
79072805 1413 }
1414 }
1415}
1416
1417GV *
e1ec3a88 1418Perl_newGVgen(pTHX_ const char *pack)
79072805 1419{
97aff369 1420 dVAR;
cea2e8a9 1421 return gv_fetchpv(Perl_form(aTHX_ "%s::_GEN_%ld", pack, (long)PL_gensym++),
6fd99bb3 1422 GV_ADD, SVt_PVGV);
79072805 1423}
1424
1425/* hopefully this is only called on local symbol table entries */
1426
1427GP*
864dbfa3 1428Perl_gp_ref(pTHX_ GP *gp)
79072805 1429{
97aff369 1430 dVAR;
1d7c1841 1431 if (!gp)
d4c19fe8 1432 return NULL;
79072805 1433 gp->gp_refcnt++;
44a8e56a 1434 if (gp->gp_cv) {
1435 if (gp->gp_cvgen) {
1436 /* multi-named GPs cannot be used for method cache */
1437 SvREFCNT_dec(gp->gp_cv);
601f1833 1438 gp->gp_cv = NULL;
44a8e56a 1439 gp->gp_cvgen = 0;
1440 }
1441 else {
1442 /* Adding a new name to a subroutine invalidates method cache */
3280af22 1443 PL_sub_generation++;
44a8e56a 1444 }
1445 }
79072805 1446 return gp;
79072805 1447}
1448
1449void
864dbfa3 1450Perl_gp_free(pTHX_ GV *gv)
79072805 1451{
97aff369 1452 dVAR;
79072805 1453 GP* gp;
1454
f7877b28 1455 if (!gv || !isGV_with_GP(gv) || !(gp = GvGP(gv)))
79072805 1456 return;
f248d071 1457 if (gp->gp_refcnt == 0) {
1458 if (ckWARN_d(WARN_INTERNAL))
9014280d 1459 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc 1460 "Attempt to free unreferenced glob pointers"
1461 pTHX__FORMAT pTHX__VALUE);
79072805 1462 return;
1463 }
44a8e56a 1464 if (gp->gp_cv) {
1465 /* Deleting the name of a subroutine invalidates method cache */
3280af22 1466 PL_sub_generation++;
44a8e56a 1467 }
748a9306 1468 if (--gp->gp_refcnt > 0) {
1469 if (gp->gp_egv == gv)
1470 gp->gp_egv = 0;
dd38834b 1471 GvGP(gv) = 0;
79072805 1472 return;
748a9306 1473 }
79072805 1474
c9ce39a9 1475 if (gp->gp_file_hek)
1476 unshare_hek(gp->gp_file_hek);
c9da69fb 1477 SvREFCNT_dec(gp->gp_sv);
1478 SvREFCNT_dec(gp->gp_av);
bfcb3514 1479 /* FIXME - another reference loop GV -> symtab -> GV ?
1480 Somehow gp->gp_hv can end up pointing at freed garbage. */
1481 if (gp->gp_hv && SvTYPE(gp->gp_hv) == SVt_PVHV) {
bfcb3514 1482 const char *hvname = HvNAME_get(gp->gp_hv);
1483 if (PL_stashcache && hvname)
7423f6db 1484 hv_delete(PL_stashcache, hvname, HvNAMELEN_get(gp->gp_hv),
1485 G_DISCARD);
bfcb3514 1486 SvREFCNT_dec(gp->gp_hv);
13207a71 1487 }
c9da69fb 1488 SvREFCNT_dec(gp->gp_io);
1489 SvREFCNT_dec(gp->gp_cv);
1490 SvREFCNT_dec(gp->gp_form);
748a9306 1491
79072805 1492 Safefree(gp);
1493 GvGP(gv) = 0;
1494}
1495
d460ef45 1496int
1497Perl_magic_freeovrld(pTHX_ SV *sv, MAGIC *mg)
1498{
53c1dcc0 1499 AMT * const amtp = (AMT*)mg->mg_ptr;
1500 PERL_UNUSED_ARG(sv);
dd374669 1501
d460ef45 1502 if (amtp && AMT_AMAGIC(amtp)) {
1503 int i;
1504 for (i = 1; i < NofAMmeth; i++) {
53c1dcc0 1505 CV * const cv = amtp->table[i];
b37c2d43 1506 if (cv) {
d460ef45 1507 SvREFCNT_dec((SV *) cv);
601f1833 1508 amtp->table[i] = NULL;
d460ef45 1509 }
1510 }
1511 }
1512 return 0;
1513}
1514
a0d0e21e 1515/* Updates and caches the CV's */
1516
1517bool
864dbfa3 1518Perl_Gv_AMupdate(pTHX_ HV *stash)
a0d0e21e 1519{
97aff369 1520 dVAR;
53c1dcc0 1521 MAGIC* const mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
a6006777 1522 AMT amt;
a0d0e21e 1523
14899595 1524 if (mg) {
1525 const AMT * const amtp = (AMT*)mg->mg_ptr;
1526 if (amtp->was_ok_am == PL_amagic_generation
1527 && amtp->was_ok_sub == PL_sub_generation) {
1528 return (bool)AMT_OVERLOADED(amtp);
1529 }
1530 sv_unmagic((SV*)stash, PERL_MAGIC_overload_table);
1531 }
a0d0e21e 1532
bfcb3514 1533 DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME_get(stash)) );
a0d0e21e 1534
d460ef45 1535 Zero(&amt,1,AMT);
3280af22 1536 amt.was_ok_am = PL_amagic_generation;
1537 amt.was_ok_sub = PL_sub_generation;
a6006777 1538 amt.fallback = AMGfallNO;
1539 amt.flags = 0;
1540
a6006777 1541 {
32251b26 1542 int filled = 0, have_ovl = 0;
1543 int i, lim = 1;
a6006777 1544
22c35a8c 1545 /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
a6006777 1546
89ffc314 1547 /* Try to find via inheritance. */
53c1dcc0 1548 GV *gv = gv_fetchmeth(stash, PL_AMG_names[0], 2, -1);
1549 SV * const sv = gv ? GvSV(gv) : NULL;
1550 CV* cv;
89ffc314 1551
1552 if (!gv)
32251b26 1553 lim = DESTROY_amg; /* Skip overloading entries. */
c69033f2 1554#ifdef PERL_DONT_CREATE_GVSV
1555 else if (!sv) {
6f207bd3 1556 NOOP; /* Equivalent to !SvTRUE and !SvOK */
c69033f2 1557 }
1558#endif
89ffc314 1559 else if (SvTRUE(sv))
1560 amt.fallback=AMGfallYES;
1561 else if (SvOK(sv))
1562 amt.fallback=AMGfallNEVER;
a6006777 1563
32251b26 1564 for (i = 1; i < lim; i++)
601f1833 1565 amt.table[i] = NULL;
32251b26 1566 for (; i < NofAMmeth; i++) {
6136c704 1567 const char * const cooky = PL_AMG_names[i];
32251b26 1568 /* Human-readable form, for debugging: */
6136c704 1569 const char * const cp = (i >= DESTROY_amg ? cooky : AMG_id2name(i));
e1ec3a88 1570 const STRLEN l = strlen(cooky);
89ffc314 1571
a0288114 1572 DEBUG_o( Perl_deb(aTHX_ "Checking overloading of \"%s\" in package \"%.256s\"\n",
bfcb3514 1573 cp, HvNAME_get(stash)) );
611c1e95 1574 /* don't fill the cache while looking up!
1575 Creation of inheritance stubs in intermediate packages may
1576 conflict with the logic of runtime method substitution.
1577 Indeed, for inheritance A -> B -> C, if C overloads "+0",
1578 then we could have created stubs for "(+0" in A and C too.
1579 But if B overloads "bool", we may want to use it for
1580 numifying instead of C's "+0". */
1581 if (i >= DESTROY_amg)
1582 gv = Perl_gv_fetchmeth_autoload(aTHX_ stash, cooky, l, 0);
1583 else /* Autoload taken care of below */
1584 gv = Perl_gv_fetchmeth(aTHX_ stash, cooky, l, -1);
46fc3d4c 1585 cv = 0;
89ffc314 1586 if (gv && (cv = GvCV(gv))) {
bfcb3514 1587 const char *hvname;
44a8e56a 1588 if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
bfcb3514 1589 && strEQ(hvname = HvNAME_get(GvSTASH(CvGV(cv))), "overload")) {
611c1e95 1590 /* This is a hack to support autoloading..., while
1591 knowing *which* methods were declared as overloaded. */
44a8e56a 1592 /* GvSV contains the name of the method. */
6136c704 1593 GV *ngv = NULL;
c69033f2 1594 SV *gvsv = GvSV(gv);
a0288114 1595
1596 DEBUG_o( Perl_deb(aTHX_ "Resolving method \"%"SVf256\
1597 "\" for overloaded \"%s\" in package \"%.256s\"\n",
ca0270c4 1598 (void*)GvSV(gv), cp, hvname) );
c69033f2 1599 if (!gvsv || !SvPOK(gvsv)
1600 || !(ngv = gv_fetchmethod_autoload(stash, SvPVX_const(gvsv),
dc848c6f 1601 FALSE)))
1602 {
a0288114 1603 /* Can be an import stub (created by "can"). */
666ea192 1604 const char * const name = (gvsv && SvPOK(gvsv)) ? SvPVX_const(gvsv) : "???";
a0288114 1605 Perl_croak(aTHX_ "%s method \"%.256s\" overloading \"%s\" "\
1606 "in package \"%.256s\"",
35c1215d 1607 (GvCVGEN(gv) ? "Stub found while resolving"
1608 : "Can't resolve"),
bfcb3514 1609 name, cp, hvname);
44a8e56a 1610 }
dc848c6f 1611 cv = GvCV(gv = ngv);
44a8e56a 1612 }
b464bac0 1613 DEBUG_o( Perl_deb(aTHX_ "Overloading \"%s\" in package \"%.256s\" via \"%.256s::%.256s\"\n",
bfcb3514 1614 cp, HvNAME_get(stash), HvNAME_get(GvSTASH(CvGV(cv))),
44a8e56a 1615 GvNAME(CvGV(cv))) );
1616 filled = 1;
32251b26 1617 if (i < DESTROY_amg)
1618 have_ovl = 1;
611c1e95 1619 } else if (gv) { /* Autoloaded... */
1620 cv = (CV*)gv;
1621 filled = 1;
44a8e56a 1622 }
b37c2d43 1623 amt.table[i]=(CV*)SvREFCNT_inc_simple(cv);
a0d0e21e 1624 }
a0d0e21e 1625 if (filled) {
a6006777 1626 AMT_AMAGIC_on(&amt);
32251b26 1627 if (have_ovl)
1628 AMT_OVERLOADED_on(&amt);
14befaf4 1629 sv_magic((SV*)stash, 0, PERL_MAGIC_overload_table,
1630 (char*)&amt, sizeof(AMT));
32251b26 1631 return have_ovl;
a0d0e21e 1632 }
1633 }
a6006777 1634 /* Here we have no table: */
9cbac4c7 1635 /* no_table: */
a6006777 1636 AMT_AMAGIC_off(&amt);
14befaf4 1637 sv_magic((SV*)stash, 0, PERL_MAGIC_overload_table,
1638 (char*)&amt, sizeof(AMTS));
a0d0e21e 1639 return FALSE;
1640}
1641
32251b26 1642
1643CV*
1644Perl_gv_handler(pTHX_ HV *stash, I32 id)
1645{
97aff369 1646 dVAR;
3f8f4626 1647 MAGIC *mg;
32251b26 1648 AMT *amtp;
1649
bfcb3514 1650 if (!stash || !HvNAME_get(stash))
601f1833 1651 return NULL;
14befaf4 1652 mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
32251b26 1653 if (!mg) {
1654 do_update:
1655 Gv_AMupdate(stash);
14befaf4 1656 mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
32251b26 1657 }
a9fd4e40 1658 assert(mg);
32251b26 1659 amtp = (AMT*)mg->mg_ptr;
1660 if ( amtp->was_ok_am != PL_amagic_generation
1661 || amtp->was_ok_sub != PL_sub_generation )
1662 goto do_update;
3ad83ce7 1663 if (AMT_AMAGIC(amtp)) {
b7787f18 1664 CV * const ret = amtp->table[id];
3ad83ce7 1665 if (ret && isGV(ret)) { /* Autoloading stab */
1666 /* Passing it through may have resulted in a warning
1667 "Inherited AUTOLOAD for a non-method deprecated", since
1668 our caller is going through a function call, not a method call.
1669 So return the CV for AUTOLOAD, setting $AUTOLOAD. */
890ce7af 1670 GV * const gv = gv_fetchmethod(stash, PL_AMG_names[id]);
3ad83ce7 1671
1672 if (gv && GvCV(gv))
1673 return GvCV(gv);
1674 }
1675 return ret;
1676 }
a0288114 1677
601f1833 1678 return NULL;
32251b26 1679}
1680
1681
a0d0e21e 1682SV*
864dbfa3 1683Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
a0d0e21e 1684{
27da23d5 1685 dVAR;
b267980d 1686 MAGIC *mg;
9c5ffd7c 1687 CV *cv=NULL;
a0d0e21e 1688 CV **cvp=NULL, **ocvp=NULL;
9c5ffd7c 1689 AMT *amtp=NULL, *oamtp=NULL;
b464bac0 1690 int off = 0, off1, lr = 0, notfound = 0;
1691 int postpr = 0, force_cpy = 0;
1692 int assign = AMGf_assign & flags;
1693 const int assignshift = assign ? 1 : 0;
497b47a8 1694#ifdef DEBUGGING
1695 int fl=0;
497b47a8 1696#endif
25716404 1697 HV* stash=NULL;
a0d0e21e 1698 if (!(AMGf_noleft & flags) && SvAMAGIC(left)
25716404 1699 && (stash = SvSTASH(SvRV(left)))
1700 && (mg = mg_find((SV*)stash, PERL_MAGIC_overload_table))
b267980d 1701 && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
a6006777 1702 ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
d4c19fe8 1703 : NULL))
b267980d 1704 && ((cv = cvp[off=method+assignshift])
748a9306 1705 || (assign && amtp->fallback > AMGfallNEVER && /* fallback to
1706 * usual method */
497b47a8 1707 (
1708#ifdef DEBUGGING
1709 fl = 1,
a0288114 1710#endif
497b47a8 1711 cv = cvp[off=method])))) {
a0d0e21e 1712 lr = -1; /* Call method for left argument */
1713 } else {
1714 if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) {
1715 int logic;
1716
1717 /* look for substituted methods */
ee239bfe 1718 /* In all the covered cases we should be called with assign==0. */
a0d0e21e 1719 switch (method) {
1720 case inc_amg:
ee239bfe 1721 force_cpy = 1;
1722 if ((cv = cvp[off=add_ass_amg])
1723 || ((cv = cvp[off = add_amg]) && (force_cpy = 0, postpr = 1))) {
3280af22 1724 right = &PL_sv_yes; lr = -1; assign = 1;
a0d0e21e 1725 }
1726 break;
1727 case dec_amg:
ee239bfe 1728 force_cpy = 1;
1729 if ((cv = cvp[off = subtr_ass_amg])
1730 || ((cv = cvp[off = subtr_amg]) && (force_cpy = 0, postpr=1))) {
3280af22 1731 right = &PL_sv_yes; lr = -1; assign = 1;
a0d0e21e 1732 }
1733 break;
1734 case bool__amg:
1735 (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg]));
1736 break;
1737 case numer_amg:
1738 (void)((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg]));
1739 break;
1740 case string_amg:
1741 (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
1742 break;
b7787f18 1743 case not_amg:
1744 (void)((cv = cvp[off=bool__amg])
1745 || (cv = cvp[off=numer_amg])
1746 || (cv = cvp[off=string_amg]));
1747 postpr = 1;
1748 break;
748a9306 1749 case copy_amg:
1750 {
76e3520e 1751 /*
1752 * SV* ref causes confusion with the interpreter variable of
1753 * the same name
1754 */
890ce7af 1755 SV* const tmpRef=SvRV(left);
76e3520e 1756 if (!SvROK(tmpRef) && SvTYPE(tmpRef) <= SVt_PVMG) {
fc36a67e 1757 /*
1758 * Just to be extra cautious. Maybe in some
1759 * additional cases sv_setsv is safe, too.
1760 */
890ce7af 1761 SV* const newref = newSVsv(tmpRef);
748a9306 1762 SvOBJECT_on(newref);
96d4b0ee 1763 /* As a bit of a source compatibility hack, SvAMAGIC() and
1764 friends dereference an RV, to behave the same was as when
1765 overloading was stored on the reference, not the referant.
1766 Hence we can't use SvAMAGIC_on()
1767 */
1768 SvFLAGS(newref) |= SVf_AMAGIC;
b162af07 1769 SvSTASH_set(newref, (HV*)SvREFCNT_inc(SvSTASH(tmpRef)));
748a9306 1770 return newref;
1771 }
1772 }
1773 break;
a0d0e21e 1774 case abs_amg:
b267980d 1775 if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
a0d0e21e 1776 && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
890ce7af 1777 SV* const nullsv=sv_2mortal(newSViv(0));
a0d0e21e 1778 if (off1==lt_amg) {
890ce7af 1779 SV* const lessp = amagic_call(left,nullsv,
a0d0e21e 1780 lt_amg,AMGf_noright);
1781 logic = SvTRUE(lessp);
1782 } else {
890ce7af 1783 SV* const lessp = amagic_call(left,nullsv,
a0d0e21e 1784 ncmp_amg,AMGf_noright);
1785 logic = (SvNV(lessp) < 0);
1786 }
1787 if (logic) {
1788 if (off==subtr_amg) {
1789 right = left;
748a9306 1790 left = nullsv;
a0d0e21e 1791 lr = 1;
1792 }
1793 } else {
1794 return left;
1795 }
1796 }
1797 break;
1798 case neg_amg:
155aba94 1799 if ((cv = cvp[off=subtr_amg])) {
a0d0e21e 1800 right = left;
1801 left = sv_2mortal(newSViv(0));
1802 lr = 1;
1803 }
1804 break;
f216259d 1805 case int_amg:
f5284f61 1806 case iter_amg: /* XXXX Eventually should do to_gv. */
b267980d 1807 /* FAIL safe */
1808 return NULL; /* Delegate operation to standard mechanisms. */
1809 break;
f5284f61 1810 case to_sv_amg:
1811 case to_av_amg:
1812 case to_hv_amg:
1813 case to_gv_amg:
1814 case to_cv_amg:
1815 /* FAIL safe */
b267980d 1816 return left; /* Delegate operation to standard mechanisms. */
f5284f61 1817 break;
a0d0e21e 1818 default:
1819 goto not_found;
1820 }
1821 if (!cv) goto not_found;
1822 } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
25716404 1823 && (stash = SvSTASH(SvRV(right)))
1824 && (mg = mg_find((SV*)stash, PERL_MAGIC_overload_table))
b267980d 1825 && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
a6006777 1826 ? (amtp = (AMT*)mg->mg_ptr)->table
d4c19fe8 1827 : NULL))
a0d0e21e 1828 && (cv = cvp[off=method])) { /* Method for right
1829 * argument found */
1830 lr=1;
b267980d 1831 } else if (((ocvp && oamtp->fallback > AMGfallNEVER
1832 && (cvp=ocvp) && (lr = -1))
a0d0e21e 1833 || (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
1834 && !(flags & AMGf_unary)) {
1835 /* We look for substitution for
1836 * comparison operations and
fc36a67e 1837 * concatenation */
a0d0e21e 1838 if (method==concat_amg || method==concat_ass_amg
1839 || method==repeat_amg || method==repeat_ass_amg) {
1840 return NULL; /* Delegate operation to string conversion */
1841 }
1842 off = -1;
1843 switch (method) {
1844 case lt_amg:
1845 case le_amg:
1846 case gt_amg:
1847 case ge_amg:
1848 case eq_amg:
1849 case ne_amg:
1850 postpr = 1; off=ncmp_amg; break;
1851 case slt_amg:
1852 case sle_amg:
1853 case sgt_amg:
1854 case sge_amg:
1855 case seq_amg:
1856 case sne_amg:
1857 postpr = 1; off=scmp_amg; break;
1858 }
1859 if (off != -1) cv = cvp[off];
1860 if (!cv) {
1861 goto not_found;
1862 }
1863 } else {
a6006777 1864 not_found: /* No method found, either report or croak */
b267980d 1865 switch (method) {
1866 case to_sv_amg:
1867 case to_av_amg:
1868 case to_hv_amg:
1869 case to_gv_amg:
1870 case to_cv_amg:
1871 /* FAIL safe */
1872 return left; /* Delegate operation to standard mechanisms. */
1873 break;
1874 }
a0d0e21e 1875 if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
1876 notfound = 1; lr = -1;
1877 } else if (cvp && (cv=cvp[nomethod_amg])) {
1878 notfound = 1; lr = 1;
4cc0ca18 1879 } else if ((amtp && amtp->fallback >= AMGfallYES) && !DEBUG_o_TEST) {
1880 /* Skip generating the "no method found" message. */
1881 return NULL;
a0d0e21e 1882 } else {
46fc3d4c 1883 SV *msg;
774d564b 1884 if (off==-1) off=method;
b267980d 1885 msg = sv_2mortal(Perl_newSVpvf(aTHX_
a0288114 1886 "Operation \"%s\": no method found,%sargument %s%s%s%s",
89ffc314 1887 AMG_id2name(method + assignshift),
e7ea3e70 1888 (flags & AMGf_unary ? " " : "\n\tleft "),
b267980d 1889 SvAMAGIC(left)?
a0d0e21e 1890 "in overloaded package ":
1891 "has no overloaded magic",
b267980d 1892 SvAMAGIC(left)?
bfcb3514 1893 HvNAME_get(SvSTASH(SvRV(left))):
a0d0e21e 1894 "",
b267980d 1895 SvAMAGIC(right)?
e7ea3e70 1896 ",\n\tright argument in overloaded package ":
b267980d 1897 (flags & AMGf_unary
e7ea3e70 1898 ? ""
1899 : ",\n\tright argument has no overloaded magic"),
b267980d 1900 SvAMAGIC(right)?
bfcb3514 1901 HvNAME_get(SvSTASH(SvRV(right))):
46fc3d4c 1902 ""));
a0d0e21e 1903 if (amtp && amtp->fallback >= AMGfallYES) {
b15aece3 1904 DEBUG_o( Perl_deb(aTHX_ "%s", SvPVX_const(msg)) );
a0d0e21e 1905 } else {
be2597df 1906 Perl_croak(aTHX_ "%"SVf, SVfARG(msg));
a0d0e21e 1907 }
1908 return NULL;
1909 }
ee239bfe 1910 force_cpy = force_cpy || assign;
a0d0e21e 1911 }
1912 }
497b47a8 1913#ifdef DEBUGGING
a0d0e21e 1914 if (!notfound) {
497b47a8 1915 DEBUG_o(Perl_deb(aTHX_
a0288114 1916 "Overloaded operator \"%s\"%s%s%s:\n\tmethod%s found%s in package %s%s\n",
497b47a8 1917 AMG_id2name(off),
1918 method+assignshift==off? "" :
a0288114 1919 " (initially \"",
497b47a8 1920 method+assignshift==off? "" :
1921 AMG_id2name(method+assignshift),
a0288114 1922 method+assignshift==off? "" : "\")",
497b47a8 1923 flags & AMGf_unary? "" :
1924 lr==1 ? " for right argument": " for left argument",
1925 flags & AMGf_unary? " for argument" : "",
bfcb3514 1926 stash ? HvNAME_get(stash) : "null",
497b47a8 1927 fl? ",\n\tassignment variant used": "") );
ee239bfe 1928 }
497b47a8 1929#endif
748a9306 1930 /* Since we use shallow copy during assignment, we need
1931 * to dublicate the contents, probably calling user-supplied
1932 * version of copy operator
1933 */
ee239bfe 1934 /* We need to copy in following cases:
1935 * a) Assignment form was called.
1936 * assignshift==1, assign==T, method + 1 == off
1937 * b) Increment or decrement, called directly.
1938 * assignshift==0, assign==0, method + 0 == off
1939 * c) Increment or decrement, translated to assignment add/subtr.
b267980d 1940 * assignshift==0, assign==T,
ee239bfe 1941 * force_cpy == T
1942 * d) Increment or decrement, translated to nomethod.
b267980d 1943 * assignshift==0, assign==0,
ee239bfe 1944 * force_cpy == T
1945 * e) Assignment form translated to nomethod.
1946 * assignshift==1, assign==T, method + 1 != off
1947 * force_cpy == T
1948 */
1949 /* off is method, method+assignshift, or a result of opcode substitution.
1950 * In the latter case assignshift==0, so only notfound case is important.
1951 */
1952 if (( (method + assignshift == off)
1953 && (assign || (method == inc_amg) || (method == dec_amg)))
1954 || force_cpy)
1955 RvDEEPCP(left);
a0d0e21e 1956 {
1957 dSP;
1958 BINOP myop;
1959 SV* res;
b7787f18 1960 const bool oldcatch = CATCH_GET;
a0d0e21e 1961
54310121 1962 CATCH_SET(TRUE);
a0d0e21e 1963 Zero(&myop, 1, BINOP);
1964 myop.op_last = (OP *) &myop;
b37c2d43 1965 myop.op_next = NULL;
54310121 1966 myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
a0d0e21e 1967
e788e7d3 1968 PUSHSTACKi(PERLSI_OVERLOAD);
a0d0e21e 1969 ENTER;
462e5cf6 1970 SAVEOP();
533c011a 1971 PL_op = (OP *) &myop;
3280af22 1972 if (PERLDB_SUB && PL_curstash != PL_debstash)
533c011a 1973 PL_op->op_private |= OPpENTERSUB_DB;
a0d0e21e 1974 PUTBACK;
cea2e8a9 1975 pp_pushmark();
a0d0e21e 1976
924508f0 1977 EXTEND(SP, notfound + 5);
a0d0e21e 1978 PUSHs(lr>0? right: left);
1979 PUSHs(lr>0? left: right);
3280af22 1980 PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no ));
a0d0e21e 1981 if (notfound) {
89ffc314 1982 PUSHs( sv_2mortal(newSVpv(AMG_id2name(method + assignshift),0)));
a0d0e21e 1983 }
1984 PUSHs((SV*)cv);
1985 PUTBACK;
1986
155aba94 1987 if ((PL_op = Perl_pp_entersub(aTHX)))
cea2e8a9 1988 CALLRUNOPS(aTHX);
a0d0e21e 1989 LEAVE;
1990 SPAGAIN;
1991
1992 res=POPs;
ebafeae7 1993 PUTBACK;
d3acc0f7 1994 POPSTACK;
54310121 1995 CATCH_SET(oldcatch);
a0d0e21e 1996
a0d0e21e 1997 if (postpr) {
b7787f18 1998 int ans;
a0d0e21e 1999 switch (method) {
2000 case le_amg:
2001 case sle_amg:
2002 ans=SvIV(res)<=0; break;
2003 case lt_amg:
2004 case slt_amg:
2005 ans=SvIV(res)<0; break;
2006 case ge_amg:
2007 case sge_amg:
2008 ans=SvIV(res)>=0; break;
2009 case gt_amg:
2010 case sgt_amg:
2011 ans=SvIV(res)>0; break;
2012 case eq_amg:
2013 case seq_amg:
2014 ans=SvIV(res)==0; break;
2015 case ne_amg:
2016 case sne_amg:
2017 ans=SvIV(res)!=0; break;
2018 case inc_amg:
2019 case dec_amg:
bbce6d69 2020 SvSetSV(left,res); return left;
dc437b57 2021 case not_amg:
fe7ac86a 2022 ans=!SvTRUE(res); break;
b7787f18 2023 default:
2024 ans=0; break;
a0d0e21e 2025 }
54310121 2026 return boolSV(ans);
748a9306 2027 } else if (method==copy_amg) {
2028 if (!SvROK(res)) {
cea2e8a9 2029 Perl_croak(aTHX_ "Copy method did not return a reference");
748a9306 2030 }
2031 return SvREFCNT_inc(SvRV(res));
a0d0e21e 2032 } else {
2033 return res;
2034 }
2035 }
2036}
c9d5ac95 2037
2038/*
7fc63493 2039=for apidoc is_gv_magical_sv
c9d5ac95 2040
7a5fd60d 2041Returns C<TRUE> if given the name of a magical GV. Calls is_gv_magical.
2042
2043=cut
2044*/
2045
2046bool
2047Perl_is_gv_magical_sv(pTHX_ SV *name, U32 flags)
2048{
2049 STRLEN len;
b64e5050 2050 const char * const temp = SvPV_const(name, len);
7a5fd60d 2051 return is_gv_magical(temp, len, flags);
2052}
2053
2054/*
2055=for apidoc is_gv_magical
2056
c9d5ac95 2057Returns C<TRUE> if given the name of a magical GV.
2058
2059Currently only useful internally when determining if a GV should be
2060created even in rvalue contexts.
2061
2062C<flags> is not used at present but available for future extension to
2063allow selecting particular classes of magical variable.
2064
b9b0e72c 2065Currently assumes that C<name> is NUL terminated (as well as len being valid).
2066This assumption is met by all callers within the perl core, which all pass
2067pointers returned by SvPV.
2068
c9d5ac95 2069=cut
2070*/
2071bool
7fc63493 2072Perl_is_gv_magical(pTHX_ const char *name, STRLEN len, U32 flags)
c9d5ac95 2073{
b37c2d43 2074 PERL_UNUSED_CONTEXT;
9d4ba2ae 2075 PERL_UNUSED_ARG(flags);
2076
b9b0e72c 2077 if (len > 1) {
b464bac0 2078 const char * const name1 = name + 1;
b9b0e72c 2079 switch (*name) {
2080 case 'I':
9431620d 2081 if (len == 3 && name1[1] == 'S' && name[2] == 'A')
b9b0e72c 2082 goto yes;
2083 break;
2084 case 'O':
9431620d 2085 if (len == 8 && strEQ(name1, "VERLOAD"))
b9b0e72c 2086 goto yes;
2087 break;
2088 case 'S':
9431620d 2089 if (len == 3 && name[1] == 'I' && name[2] == 'G')
b9b0e72c 2090 goto yes;
2091 break;
2092 /* Using ${^...} variables is likely to be sufficiently rare that
2093 it seems sensible to avoid the space hit of also checking the
2094 length. */
2095 case '\017': /* ${^OPEN} */
9431620d 2096 if (strEQ(name1, "PEN"))
b9b0e72c 2097 goto yes;
2098 break;
2099 case '\024': /* ${^TAINT} */
9431620d 2100 if (strEQ(name1, "AINT"))
b9b0e72c 2101 goto yes;
2102 break;
2103 case '\025': /* ${^UNICODE} */
9431620d 2104 if (strEQ(name1, "NICODE"))
b9b0e72c 2105 goto yes;
a0288114 2106 if (strEQ(name1, "TF8LOCALE"))
7cebcbc0 2107 goto yes;
b9b0e72c 2108 break;
2109 case '\027': /* ${^WARNING_BITS} */
9431620d 2110 if (strEQ(name1, "ARNING_BITS"))
b9b0e72c 2111 goto yes;
2112 break;
2113 case '1':
2114 case '2':
2115 case '3':
2116 case '4':
2117 case '5':
2118 case '6':
2119 case '7':
2120 case '8':
2121 case '9':
c9d5ac95 2122 {
7fc63493 2123 const char *end = name + len;
c9d5ac95 2124 while (--end > name) {
2125 if (!isDIGIT(*end))
2126 return FALSE;
2127 }
b9b0e72c 2128 goto yes;
2129 }
2130 }
2131 } else {
2132 /* Because we're already assuming that name is NUL terminated
2133 below, we can treat an empty name as "\0" */
2134 switch (*name) {
2135 case '&':
2136 case '`':
2137 case '\'':
2138 case ':':
2139 case '?':
2140 case '!':
2141 case '-':
2142 case '#':
2143 case '[':
2144 case '^':
2145 case '~':
2146 case '=':
2147 case '%':
2148 case '.':
2149 case '(':
2150 case ')':
2151 case '<':
2152 case '>':
2153 case ',':
2154 case '\\':
2155 case '/':
2156 case '|':
2157 case '+':
2158 case ';':
2159 case ']':
2160 case '\001': /* $^A */
2161 case '\003': /* $^C */
2162 case '\004': /* $^D */
2163 case '\005': /* $^E */
2164 case '\006': /* $^F */
2165 case '\010': /* $^H */
2166 case '\011': /* $^I, NOT \t in EBCDIC */
2167 case '\014': /* $^L */
2168 case '\016': /* $^N */
2169 case '\017': /* $^O */
2170 case '\020': /* $^P */
2171 case '\023': /* $^S */
2172 case '\024': /* $^T */
2173 case '\026': /* $^V */
2174 case '\027': /* $^W */
2175 case '1':
2176 case '2':
2177 case '3':
2178 case '4':
2179 case '5':
2180 case '6':
2181 case '7':
2182 case '8':
2183 case '9':
2184 yes:
2185 return TRUE;
2186 default:
2187 break;
c9d5ac95 2188 }
c9d5ac95 2189 }
2190 return FALSE;
2191}
66610fdd 2192
f5c1e807 2193void
2194Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags)
2195{
2196 dVAR;
acda4c6a 2197 U32 hash;
f5c1e807 2198
9f616d01 2199 assert(name);
f5c1e807 2200 PERL_UNUSED_ARG(flags);
2201
acda4c6a 2202 if (len > I32_MAX)
2203 Perl_croak(aTHX_ "panic: gv name too long (%"UVuf")", (UV) len);
2204
ae8cc45f 2205 if (!(flags & GV_ADD) && GvNAME_HEK(gv)) {
2206 unshare_hek(GvNAME_HEK(gv));
2207 }
2208
acda4c6a 2209 PERL_HASH(hash, name, len);
9f616d01 2210 GvNAME_HEK(gv) = share_hek(name, len, hash);
f5c1e807 2211}
2212
66610fdd 2213/*
2214 * Local variables:
2215 * c-indentation-style: bsd
2216 * c-basic-offset: 4
2217 * indent-tabs-mode: t
2218 * End:
2219 *
37442d52 2220 * ex: set ts=8 sts=4 sw=4 noet:
2221 */