summaryrefslogtreecommitdiff
path: root/toke.c
diff options
context:
space:
mode:
authorRafael Garcia-Suarez <rgarciasuarez@gmail.com>2002-01-15 00:03:04 +0100
committerJarkko Hietaniemi <jhi@iki.fi>2002-01-15 01:23:53 +0000
commit9b3023bc082e94b9899c0042ba030062098682a6 (patch)
tree6d94b2930c87893a42b97476460fc5d275f23850 /toke.c
parent9ce38ebc6b92fe51912fbf2f7ebcca58be688dbe (diff)
downloadperl-9b3023bc082e94b9899c0042ba030062098682a6.tar.gz
[PATCH] Overriding readline() should also override <FH>
Date: Mon, 14 Jan 2002 23:03:04 +0100 Message-ID: <20020114230304.A691@rafael> Subject: Re: [PATCH] Overriding readline() should also override <FH> From: Rafael Garcia-Suarez <rgarciasuarez@free.fr> Date: Mon, 14 Jan 2002 23:18:43 +0100 Message-ID: <20020114231843.E691@rafael> p4raw-id: //depot/perl@14260
Diffstat (limited to 'toke.c')
-rw-r--r--toke.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/toke.c b/toke.c
index 8382333788..1445ee3c40 100644
--- a/toke.c
+++ b/toke.c
@@ -6661,6 +6661,9 @@ S_scan_inputsymbol(pTHX_ char *start)
return s;
}
else {
+ bool readline_overriden = FALSE;
+ GV *gv_readline = Nullgv;
+ GV **gvp;
/* we're in a filehandle read situation */
d = PL_tokenbuf;
@@ -6668,6 +6671,15 @@ S_scan_inputsymbol(pTHX_ char *start)
if (!len)
(void)strcpy(d,"ARGV");
+ /* Check whether readline() is overriden */
+ if ((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
+ && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)
+ ||
+ (gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
+ && (gv_readline = *gvp) != (GV*)&PL_sv_undef
+ && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
+ readline_overriden = TRUE;
+
/* if <$fh>, create the ops to turn the variable into a
filehandle
*/
@@ -6689,7 +6701,11 @@ S_scan_inputsymbol(pTHX_ char *start)
else {
OP *o = newOP(OP_PADSV, 0);
o->op_targ = tmp;
- PL_lex_op = (OP*)newUNOP(OP_READLINE, 0, o);
+ PL_lex_op = readline_overriden
+ ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, o,
+ newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
+ : (OP*)newUNOP(OP_READLINE, 0, o);
}
}
else {
@@ -6701,9 +6717,14 @@ intro_sym:
? (GV_ADDMULTI | GV_ADDINEVAL)
: GV_ADDMULTI),
SVt_PV);
- PL_lex_op = (OP*)newUNOP(OP_READLINE, 0,
- newUNOP(OP_RV2SV, 0,
- newGVOP(OP_GV, 0, gv)));
+ PL_lex_op = readline_overriden
+ ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST,
+ newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
+ newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
+ : (OP*)newUNOP(OP_READLINE, 0,
+ newUNOP(OP_RV2SV, 0,
+ newGVOP(OP_GV, 0, gv)));
}
PL_lex_op->op_flags |= OPf_SPECIAL;
/* we created the ops in PL_lex_op, so make yylval.ival a null op */
@@ -6714,7 +6735,12 @@ intro_sym:
(<Foo::BAR> or <FOO>) so build a simple readline OP */
else {
GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
- PL_lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
+ PL_lex_op = readline_overriden
+ ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST,
+ newGVOP(OP_GV, 0, gv),
+ newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
+ : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
yylval.ival = OP_NULL;
}
}