1 /* $RCSfile: gv.c,v $$Revision: 4.1 $$Date: 92/08/07 18:26:39 $
3 * Copyright (c) 1991, Larry Wall
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.
9 * Revision 4.1 92/08/07 18:26:39 lwall
11 * Revision 4.0.1.4 92/06/08 15:32:19 lwall
12 * patch20: fixed confusion between a *var's real name and its effective name
13 * patch20: the debugger now warns you on lines that can't set a breakpoint
14 * patch20: the debugger made perl forget the last pattern used by //
15 * patch20: paragraph mode now skips extra newlines automatically
16 * patch20: ($<,$>) = ... didn't work on some architectures
18 * Revision 4.0.1.3 91/11/05 18:35:33 lwall
19 * patch11: length($x) was sometimes wrong for numeric $x
20 * patch11: perl now issues warning if $SIG{'ALARM'} is referenced
21 * patch11: *foo = undef coredumped
22 * patch11: solitary subroutine references no longer trigger typo warnings
23 * patch11: local(*FILEHANDLE) had a memory leak
25 * Revision 4.0.1.2 91/06/07 11:55:53 lwall
26 * patch4: new copyright notice
27 * patch4: added $^P variable to control calling of perldb routines
28 * patch4: added $^F variable to specify maximum system fd, default 2
29 * patch4: $` was busted inside s///
30 * patch4: default top-of-form run_format is now FILEHANDLE_TOP
31 * patch4: length($`), length($&), length($') now optimized to avoid string copy
32 * patch4: $^D |= 1024 now does syntax tree dump at run-time
34 * Revision 4.0.1.1 91/04/12 09:10:24 lwall
35 * patch1: Configure now differentiates getgroups() type from getgid() type
36 * patch1: you may now use "die" and "caller" in a signal handler
38 * Revision 4.0 91/03/20 01:39:41 lwall
62 GvHV(gv) = newHV(COEFFSIZE);
73 sprintf(tmpbuf,"'_<%s", name);
74 gv = gv_fetchpv(tmpbuf, TRUE);
75 sv_setpv(GvSV(gv), name);
77 hv_magic(GvHVn(gv_AVadd(gv)), gv, 'L');
82 gv_fetchmethod(stash, name)
88 GV** gvp = (GV**)hv_fetch(stash,name,strlen(name),FALSE);
89 if (gvp && (gv = *gvp) != (GV*)&sv_undef && GvCV(gv))
92 gvp = (GV**)hv_fetch(stash,"ISA",3,FALSE);
93 if (gvp && (gv = *gvp) != (GV*)&sv_undef && (av = GvAV(gv))) {
94 SV** svp = AvARRAY(av);
95 I32 items = AvFILL(av) + 1;
100 SvUPGRADE(sv, SVt_PV);
101 strcpy(tmpbuf+1,SvPVn(sv));
102 gv = gv_fetchpv(tmpbuf,FALSE);
103 if (!gv || !(stash = GvHV(gv))) {
105 warn("Can't locate package %s for @%s'ISA",
106 SvPV(sv), HvNAME(stash));
109 gv = gv_fetchmethod(stash, name);
126 register char *namend;
128 char *sawquote = Nullch;
129 char *prevquote = Nullch;
132 if (isUPPER(*name)) {
134 if (*name == 'S' && (
135 strEQ(name, "SIG") ||
136 strEQ(name, "STDIN") ||
137 strEQ(name, "STDOUT") ||
138 strEQ(name, "STDERR") ))
141 else if (*name > 'E') {
142 if (*name == 'I' && strEQ(name, "INC"))
145 else if (*name > 'A') {
146 if (*name == 'E' && strEQ(name, "ENV"))
149 else if (*name == 'A' && (
150 strEQ(name, "ARGV") ||
151 strEQ(name, "ARGVOUT") ))
154 for (namend = name; *namend; namend++) {
155 if (*namend == '\'' && namend[1])
156 prevquote = sawquote, sawquote = namend;
158 if (sawquote == name && name[1]) {
163 else if (!isALPHA(*name) || global)
165 else if ((COP*)curcop == &compiling)
168 stash = curcop->cop_stash;
176 strncpy(tmpbuf,name,s-name+1);
177 d = tmpbuf+(s-name+1);
183 strcpy(tmpbuf+1,name);
185 gv = gv_fetchpv(tmpbuf,TRUE);
186 if (!(stash = GvHV(gv)))
187 stash = GvHV(gv) = newHV(0);
189 HvNAME(stash) = savestr(name);
194 fatal("Global symbol \"%s\" requires explicit package name", name);
196 gvp = (GV**)hv_fetch(stash,name,len,add);
197 if (!gvp || *gvp == (GV*)&sv_undef)
200 if (SvTYPE(gv) == SVt_PVGV) {
205 /* Adding a new symbol */
207 sv_upgrade(gv, SVt_PVGV);
213 GvSV(gv) = NEWSV(72,0);
214 GvLINE(gv) = curcop->cop_line;
216 sv_magic((SV*)gv, (SV*)gv, '*', name, len);
218 GvNAME(gv) = nsavestr(name, len);
220 if (isDIGIT(*name) && *name != '0')
221 sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
225 /* set up magic where warranted */
228 if (strEQ(name, "SIG")) {
233 hv_magic(hv, siggv, 'S');
235 /* initialize signal stack */
236 signalstack = newAV();
237 av_store(signalstack, 32, Nullsv);
238 av_clear(signalstack);
239 AvREAL_off(signalstack);
259 sv_setpv(GvSV(gv),chopset);
289 sv_magic(GvSV(gv), (SV*)gv, 0, name, 1);
293 sv_setpv(GvSV(gv),"\f");
297 sv_setpv(GvSV(gv),"\034");
302 sv_upgrade(sv, SVt_PVNV);
304 SvNV(sv) = atof(patchlevel);
317 HV *hv = GvSTASH(gv);
321 sv_setpv(sv, sv == (SV*)gv ? "*" : "");
322 sv_catpv(sv,HvNAME(hv));
323 sv_catpvn(sv,"'", 1);
324 sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv));
333 HV *hv = GvSTASH(egv);
337 sv_setpv(sv, sv == (SV*)gv ? "*" : "");
338 sv_catpv(sv,HvNAME(hv));
339 sv_catpvn(sv,"'", 1);
340 sv_catpvn(sv,GvNAME(egv),GvNAMELEN(egv));
362 for (i = min; i <= max; i++) {
363 for (entry = HvARRAY(defstash)[i]; entry; entry = entry->hent_next) {
364 gv = (GV*)entry->hent_val;
367 curcop->cop_line = GvLINE(gv);
368 warn("Possible typo: \"%s\"", GvNAME(gv));
376 (void)sprintf(tokenbuf,"_GEN_%d",gensym++);
377 return gv_fetchpv(tokenbuf,TRUE);
380 /* hopefully this is only called on local symbol table entries */
399 if (!gv || !(gp = GvGP(gv)))
401 if (gp->gp_refcnt == 0) {
402 warn("Attempt to free unreferenced glob pointers");
405 if (--gp->gp_refcnt > 0)
411 if (io = gp->gp_io) {
413 Safefree(io->top_name);
414 Safefree(io->fmt_name);
423 #if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
427 #ifdef MICROPORT /* Microport 2.4 hack */
432 return GvGP(gv)->gp_av;
434 return GvGP(gv_AVadd(gv))->gp_av;
441 return GvGP(gv)->gp_hv;
443 return GvGP(gv_HVadd(gv))->gp_hv;
445 #endif /* Microport 2.4 hack */
452 if (op->op_private < num)
454 if (op->op_flags & OPf_STACKED)
455 return gv_fetchpv(SvPVnx(*(stack_sp--)),TRUE);
467 if (op->op_private < num)
469 if (op->op_flags & OPf_STACKED)
470 gv = gv_fetchpv(SvPVnx(*(stack_sp--)),TRUE);